चला रहा है मुझे खेद है कि मैं इसे पुन: उत्पन्न करने के लिए कोड पोस्ट नहीं कर सकता। मेरी समस्या यह है कि मुझे नहीं पता कि इस मुद्दे को डीबग करने के बारे में कैसे जाना है।कभी-कभी PTRACE_EVENT_VFORK गायब होने पर ptrace
मैं एक प्रक्रिया और उसके बच्चों (और बच्चों के बच्चों) का पता लगाने के लिए PTRACE_O_TRACEFORK | PTRACE_O_TRACEEXEC | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE | PTRACE_O_TRACECLONE
के साथ ptrace का उपयोग कर रहा हूं। तंत्र strace
जैसा है, लेकिन थोड़ा अलग उद्देश्यों के साथ, क्योंकि मैं केवल उन फ़ाइलों को ट्रैक कर रहा हूं जो पढ़ या संशोधित हैं।
मेरा कोड (सी में लिखा गया) x86-64 आर्किटेक्चर (और i386 पर भी कम परीक्षण) पर डेबियन wheezy और डेबियन जेसी पर ठीक काम करता है। जब मैं उबंटू सटीक x86-64 आभासी मशीन (जो 3.2.0 कर्नेल का उपयोग करता है) पर संकलन और चलाने की कोशिश करता है, तो मैं परेशानी में भाग लेता हूं।
सटीक मशीन पर, मैं कभी कभी लगता है कि मैं प्राप्त नहीं एक PTRACE_EVENT_VFORK
के तुरंत बाद एक vfork
कॉल होता है, लेकिन इसके बजाय घटनाओं प्राप्त करना शुरू (SIGSTOP
घटनाओं की एक जोड़ी है, और कुछ सिस्टम कॉल) कभी प्राप्त किए बिना PTRACE_EVENT_VFORK
घटना। मुझे सिस्टम कॉल किए जाने में कुछ भी संदिग्ध दिखाई नहीं देता है, और व्यवहार अनुमानित नहीं है।
मुझे यकीन नहीं है कि इसे कम से कम त्रुटि मामले में कम करने का प्रयास करने के लिए क्या करना है, और मुझे वास्तव में कोई जानकारी नहीं है कि क्या गलत हो रहा है, कभी भी गुम घटनाओं के इस व्यवहार को नहीं देखा। यह कल्पना की जा सकती है कि अंतर कर्नेल नहीं है, बल्कि निर्माण उपकरण जो मैं ट्रेसिंग कर रहा हूं (जो अजगर + जीसीसी का संयोजन है)।
कोई सुझाव?
यदि कोई यहां सहायता नहीं कर सकता है, तो linux-kernel मेलिंग सूची पर पूछने का प्रयास करें। (मदद करने की संभावना नहीं है, लेकिन शॉट के लायक है।) 'Ptrace' के विकल्प के रूप में, आप' ओपन' 'पर कॉल को रोकने के लिए [LD_PRELOAD चाल] (http://stackoverflow.com/q/426230/) का उपयोग कर सकते हैं, पढ़ें ',' लिखें ', और' बंद करें '। और शुभकामनाएं; यह बुरा लगता है। – Nemo
मैंने एलडी_PRELOAD से परहेज किया है, क्योंकि मैं चाहता हूं कि मेरा कोड स्थिर रूप से जुड़ी बाइनरी का पता लगाने में सक्षम हो। और स्पष्ट रूप से, मैं लिनक्स-कर्नेल से डर रहा हूँ! lol :) –
मैं सहमत हूं कि एलडी_PRELOAD ऐसा करने के लिए एक सौहार्दपूर्ण/वैध तरीका नहीं है। दुर्भाग्य से मैं vfork ट्रेस विफलताओं का कारण नहीं जानता। यदि आप लीगेसी पार्स शैली की बजाय seccomp ट्रेसिंग मोड का उपयोग कर सकते हैं, तो यह कम त्रुटि-प्रवण और अधिक पोर्टेबल हो सकता है। –