मैं सोचता रहता हूं कि डिबगर कैसे काम करता है? पहले से ही निष्पादन योग्य चलने के लिए 'संलग्न' किया जा सकता है। मैं समझता हूं कि संकलक मशीन भाषा में कोड का अनुवाद करता है, लेकिन फिर डिबगर कैसे जानता है कि यह किससे जुड़ा हुआ है?
मैं सोचता रहता हूं कि डिबगर कैसे काम करता है? पहले से ही निष्पादन योग्य चलने के लिए 'संलग्न' किया जा सकता है। मैं समझता हूं कि संकलक मशीन भाषा में कोड का अनुवाद करता है, लेकिन फिर डिबगर कैसे जानता है कि यह किससे जुड़ा हुआ है?
जवाबों:
डिबगर कैसे काम करता है, इसका विवरण इस बात पर निर्भर करेगा कि आप डीबगिंग क्या हैं, और ओएस क्या है। विंडोज पर देशी डिबगिंग के लिए आप MSDN पर कुछ विवरण पा सकते हैं: Win32 डिबगिंग एपीआई ।
उपयोगकर्ता डिबगर को बताता है कि कौन सी प्रक्रिया को संलग्न करना है, या तो नाम से या प्रक्रिया आईडी से। यदि यह एक नाम है, तो डिबगर प्रक्रिया आईडी को देखेगा, और सिस्टम कॉल के माध्यम से डिबग सत्र शुरू करेगा; विंडोज के तहत यह DebugActiveProcess होगा ।
एक बार संलग्न होने पर, डिबगर किसी भी यूआई के लिए एक ईवेंट लूप की तरह दर्ज करेगा, लेकिन विंडो सिस्टम से आने वाली घटनाओं के बजाय, ओएस डीबग होने की प्रक्रिया में होने वाली घटनाओं के आधार पर घटनाओं को उत्पन्न करेगा - उदाहरण के लिए एक अपवाद घटित होने वाला। देखें WaitForDebugEvent ।
डिबगर लक्ष्य प्रक्रिया की आभासी मेमोरी को पढ़ने और लिखने में सक्षम है, और यहां तक कि ओएस द्वारा प्रदान की गई एपीआई के माध्यम से अपने रजिस्टर मूल्यों को समायोजित करता है। विंडोज के लिए डिबगिंग फ़ंक्शन की सूची देखें ।
डिबगर स्रोत कोड में पतों से लेकर चर नाम और स्थानों तक अनुवाद करने के लिए प्रतीक फ़ाइलों से जानकारी का उपयोग करने में सक्षम है। प्रतीक फ़ाइल की जानकारी एपीआई का एक अलग सेट है और इस तरह से ओएस का एक मुख्य हिस्सा नहीं है। विंडोज पर यह डीबग इंटरफेस एक्सेस एसडीके के माध्यम से है ।
यदि आप एक प्रबंधित वातावरण (.NET, Java, आदि) डिबग कर रहे हैं, तो यह प्रक्रिया आमतौर पर समान दिखाई देगी, लेकिन विवरण अलग-अलग होते हैं, क्योंकि वर्चुअल मशीन वातावरण अंतर्निहित ओएस के बजाय डीबग एपीआई प्रदान करता है।
जैसा मुझे समझ में आया:
X86 पर सॉफ़्टवेयर विराम बिंदु के लिए, डिबगर अनुदेश के पहले बाइट को बदल देता है CC
( int3
)। यह WriteProcessMemory
विंडोज पर किया जाता है । जब सीपीयू उस निर्देश पर जाता है, और निष्पादित करता हैint3
, तो यह CPU को डीबग अपवाद उत्पन्न करने का कारण बनता है। OS इस अवरोध को प्राप्त करता है, महसूस करता है कि इस प्रक्रिया को डिबग किया जा रहा है, और डीबगर प्रक्रिया को सूचित करता है कि ब्रेकपॉइंट मारा गया था।
ब्रेकपॉइंट हिट होने और प्रक्रिया बंद होने के बाद, डीबगर ब्रेकपॉइंट की अपनी सूची में दिखता है, और CC
मूल रूप से वहां मौजूद बाइट के साथ बदल देता है । डीबगर सेट करता है TF
, ट्रैप फ्लैग को EFLAGS
(संशोधित करके CONTEXT
), और प्रक्रिया जारी रखता है। ट्रैप फ्लैग सीपीयू का कारण बनता है INT 1
जो अगले निर्देश पर एकल-चरणीय अपवाद ( ) उत्पन्न करता है ।
जब अगली बार डिबग की जा रही प्रक्रिया बंद हो जाती है, तो डीबगर फिर से ब्रेकपाइंट निर्देश के पहले बाइट को बदल देता है CC
, और प्रक्रिया जारी रहती है।
मुझे यकीन नहीं है कि अगर यह ठीक है कि यह सभी डिबगर्स द्वारा कैसे लागू किया जाता है, लेकिन मैंने एक Win32 प्रोग्राम लिखा है जो इस तंत्र का उपयोग करके खुद को डीबग करने का प्रबंधन करता है। पूरी तरह से बेकार, लेकिन शैक्षिक।
लिनक्स में, एक प्रक्रिया डीबग करना ptrace (2) सिस्टम कॉल के साथ शुरू होता है । इस लेख में ptrace
कुछ सरल डिबगिंग निर्माणों को लागू करने के लिए उपयोग करने के लिए एक महान ट्यूटोरियल है ।
(2)
"ptrace is a system call" की तुलना में हमें कुछ अधिक (या कम) बताता है?
(2)
मैनुअल खंड संख्या है। मैन्युअल अनुभागों के विवरण के लिए en.wikipedia.org/wiki/Man_page#Manual_sections देखें ।
ptrace
एक सिस्टम कॉल है।
(2)
हमें बताता है कि हम टाइप कर सकते हैं man 2 ptrace
और सही मैनपेज प्राप्त कर सकते हैं - यहां महत्वपूर्ण नहीं है, क्योंकि कोई अन्य नहीं है ptrace
, लेकिन यह लिनक्स पर तुलना man printf
करने के लिए नहीं है man 3 printf
।
यदि आप विंडोज ओएस पर हैं, तो इसके लिए एक बड़ा संसाधन जॉन रोबिन्स द्वारा "Microsoft .NET और माइक्रोसॉफ्ट विंडोज के लिए डिबगिंग एप्लिकेशन" होगा:
(या पुराने संस्करण: "डिबगिंग एप्लिकेशन" )
पुस्तक में एक अध्याय है कि एक डिबगर कैसे काम करता है जिसमें सरल (लेकिन काम करने वाले) डिबगर्स के एक जोड़े के लिए कोड शामिल है।
चूंकि मैं यूनिक्स / लिनक्स डिबगिंग के विवरण से परिचित नहीं हूं, इसलिए यह सामान अन्य ओएस पर लागू नहीं हो सकता है। लेकिन मुझे लगता है कि एक बहुत ही जटिल विषय के लिए एक अवधारणा के रूप में - यदि विवरण और एपीआई नहीं - सबसे किसी भी ओएस को 'पोर्ट' करना चाहिए।
डीबगिंग को समझने के लिए एक अन्य मूल्यवान स्रोत इंटेल सीपीयू मैनुअल (इंटेल® 64 और आईए -32 आर्किटेक्चर सॉफ्टवेयर डेवलपर मैनुअल) है। वॉल्यूम 3 ए, अध्याय 16 में, इसने डिबगिंग के हार्डवेयर समर्थन को पेश किया, जैसे कि विशेष अपवाद और हार्डवेयर डीबगिंग रजिस्टर। निम्नलिखित उस अध्याय से है:
T (trap) ध्वज, TSS - एक डीबग अपवाद (#DB) उत्पन्न करता है जब TSS के साथ किसी कार्य को उसके TSS में सेट करने का प्रयास किया जाता है।
मुझे यकीन नहीं है कि विंडो या लिनक्स इस ध्वज का उपयोग करते हैं या नहीं, लेकिन उस अध्याय को पढ़ना बहुत दिलचस्प है।
आशा है कि यह किसी की मदद करता है।
मुझे लगता है कि यहाँ उत्तर देने के लिए दो मुख्य प्रश्न हैं:
1. डिबगर कैसे जानता है कि एक अपवाद हुआ?
जब एक ऐसी प्रक्रिया में अपवाद होता है जिसे डिबग किया जाता है, तो लक्ष्य प्रक्रिया में परिभाषित किसी भी उपयोगकर्ता अपवाद संचालकों को अपवाद का जवाब देने से पहले ओएस द्वारा डीबगर को अधिसूचित किया जाता है। यदि डीबगर इस (पहली-मौका) अपवाद सूचना को संभालने के लिए नहीं चुनता है, तो अपवाद प्रेषण अनुक्रम आगे बढ़ता है और लक्ष्य थ्रेड को अपवाद को संभालने का मौका दिया जाता है यदि वह ऐसा करना चाहता है। यदि SEH अपवाद को लक्ष्य प्रक्रिया द्वारा नियंत्रित नहीं किया जाता है, तो डिबगर को फिर एक अन्य डिबग इवेंट भेजा जाता है, जिसे दूसरी-मौका सूचना कहा जाता है, यह सूचित करने के लिए कि लक्ष्य प्रक्रिया में एक अनहेल्दी अपवाद हुआ है। स्रोत
2. डिबगर कैसे जानता है कि ब्रेकपॉइंट पर कैसे रोकें?
सरलीकृत उत्तर है: जब आप प्रोग्राम में ब्रेक-पॉइंट डालते हैं, तो डिबगर आपके कोड को उस बिंदु पर एक int3 निर्देश के साथ बदल देता है, जो एक सॉफ्टवेयर इंटरप्ट है । एक प्रभाव के रूप में कार्यक्रम को निलंबित कर दिया जाता है और डिबगर कहा जाता है।
मेरी समझ यह है कि जब आप किसी एप्लिकेशन या DLL फ़ाइल को संकलित करते हैं, तो जो कुछ भी वह फ़ंक्शन और चर का प्रतिनिधित्व करने वाले प्रतीकों को संकलित करता है।
जब आपके पास एक डीबग बिल्ड होता है, तो ये सिंबल रिलीज़ होने के समय की तुलना में कहीं अधिक विस्तृत होते हैं, इस प्रकार डीबगर आपको अधिक जानकारी देने की अनुमति देता है। जब आप डिबगर को किसी प्रक्रिया में संलग्न करते हैं, तो यह दिखता है कि वर्तमान में कौन से फ़ंक्शंस एक्सेस किए जा रहे हैं और यहां से सभी उपलब्ध डिबगिंग प्रतीकों को हल करता है (क्योंकि यह जानता है कि संकलित फ़ाइल के इंटर्नल क्या दिखते हैं, यह स्मृति में क्या हो सकता है, यह Acertain कर सकता है। , ints की सामग्री के साथ, फ्लोट्स, स्ट्रिंग्स, आदि)। पहले पोस्टर की तरह, यह जानकारी और ये प्रतीक कैसे काम करते हैं, यह पर्यावरण और भाषा पर बहुत निर्भर करता है।