डिबगर कैसे काम करता है?


170

मैं सोचता रहता हूं कि डिबगर कैसे काम करता है? पहले से ही निष्पादन योग्य चलने के लिए 'संलग्न' किया जा सकता है। मैं समझता हूं कि संकलक मशीन भाषा में कोड का अनुवाद करता है, लेकिन फिर डिबगर कैसे जानता है कि यह किससे जुड़ा हुआ है?



@ ऑकटलिस्ट यह लेख दिलचस्प है, लेकिन केवल लिनक्स पर डीबगिंग के लिए एपीआई-स्तरीय अमूर्त के बारे में बात करता है। मुझे लगता है कि ओपी हुड के बारे में अधिक जानना चाहता है।
smwikipedia

जवाबों:


96

डिबगर कैसे काम करता है, इसका विवरण इस बात पर निर्भर करेगा कि आप डीबगिंग क्या हैं, और ओएस क्या है। विंडोज पर देशी डिबगिंग के लिए आप MSDN पर कुछ विवरण पा सकते हैं: Win32 डिबगिंग एपीआई

उपयोगकर्ता डिबगर को बताता है कि कौन सी प्रक्रिया को संलग्न करना है, या तो नाम से या प्रक्रिया आईडी से। यदि यह एक नाम है, तो डिबगर प्रक्रिया आईडी को देखेगा, और सिस्टम कॉल के माध्यम से डिबग सत्र शुरू करेगा; विंडोज के तहत यह DebugActiveProcess होगा ।

एक बार संलग्न होने पर, डिबगर किसी भी यूआई के लिए एक ईवेंट लूप की तरह दर्ज करेगा, लेकिन विंडो सिस्टम से आने वाली घटनाओं के बजाय, ओएस डीबग होने की प्रक्रिया में होने वाली घटनाओं के आधार पर घटनाओं को उत्पन्न करेगा - उदाहरण के लिए एक अपवाद घटित होने वाला। देखें WaitForDebugEvent

डिबगर लक्ष्य प्रक्रिया की आभासी मेमोरी को पढ़ने और लिखने में सक्षम है, और यहां तक ​​कि ओएस द्वारा प्रदान की गई एपीआई के माध्यम से अपने रजिस्टर मूल्यों को समायोजित करता है। विंडोज के लिए डिबगिंग फ़ंक्शन की सूची देखें ।

डिबगर स्रोत कोड में पतों से लेकर चर नाम और स्थानों तक अनुवाद करने के लिए प्रतीक फ़ाइलों से जानकारी का उपयोग करने में सक्षम है। प्रतीक फ़ाइल की जानकारी एपीआई का एक अलग सेट है और इस तरह से ओएस का एक मुख्य हिस्सा नहीं है। विंडोज पर यह डीबग इंटरफेस एक्सेस एसडीके के माध्यम से है ।

यदि आप एक प्रबंधित वातावरण (.NET, Java, आदि) डिबग कर रहे हैं, तो यह प्रक्रिया आमतौर पर समान दिखाई देगी, लेकिन विवरण अलग-अलग होते हैं, क्योंकि वर्चुअल मशीन वातावरण अंतर्निहित ओएस के बजाय डीबग एपीआई प्रदान करता है।


5
यह सवाल बेवकूफी भरा लग सकता है लेकिन अगर प्रोग्राम के अंदर कोई विशिष्ट पता चल जाता है तो ओएस कैसे नज़र रखता है। उदाहरण के लिए एक ब्रेकपॉइंट 0x7710cafe पर सेट किया गया है। जैसा कि निर्देश सूचक ओएस को बदलता है (या शायद सीपीयू) को निर्देश सूचक की तुलना सभी ब्रेक प्वाइंट पते से करनी होगी, या मैं गलत है? यह कैसे काम करता है ..?
डिस्प्लेनेम

3
@StefanFalk मैंने एक उत्तर लिखा जो निचले स्तर के कुछ विवरणों (x86 पर) को संबोधित करता है।
जोनाथन रेनहार्ट

क्या आप बता सकते हैं कि वास्तव में चर नामों का पता कैसे पता चलता है? क्या हर बार चलने के दौरान एप्लिकेशन वैरिएबल के लिए समान मेमोरी पतों का उपयोग करता है? मैंने हमेशा यह मान लिया था कि यह केवल उपलब्ध मेमोरी से मैप किया गया है, लेकिन कभी इस बारे में कभी नहीं सोचा था कि क्या बाइट्स ऐप के मेमोरी स्पेस में सीधे उसी स्थान पर मैप करेंगे। ऐसा लगता है कि यह एक बड़ा सुरक्षा मुद्दा होगा।
जेम्स जोशुआ स्ट्रीट

@JamesJoshuaStreet मुझे लगता है कि यह एक विवरण है कि डिबगर के लिए विशिष्ट है।
चांदनी २३ ९

इस जवाब से कुछ पता चलता है। लेकिन मुझे लगता है कि op कुछ API एब्स्ट्रैक्ट के बजाय कुछ निम्न स्तर के विवरणों में अधिक रुचि रखता है।
smwikipedia

63

जैसा मुझे समझ में आया:

X86 पर सॉफ़्टवेयर विराम बिंदु के लिए, डिबगर अनुदेश के पहले बाइट को बदल देता है CC( int3)। यह WriteProcessMemoryविंडोज पर किया जाता है । जब सीपीयू उस निर्देश पर जाता है, और निष्पादित करता हैint3 , तो यह CPU को डीबग अपवाद उत्पन्न करने का कारण बनता है। OS इस अवरोध को प्राप्त करता है, महसूस करता है कि इस प्रक्रिया को डिबग किया जा रहा है, और डीबगर प्रक्रिया को सूचित करता है कि ब्रेकपॉइंट मारा गया था।

ब्रेकपॉइंट हिट होने और प्रक्रिया बंद होने के बाद, डीबगर ब्रेकपॉइंट की अपनी सूची में दिखता है, और CCमूल रूप से वहां मौजूद बाइट के साथ बदल देता है । डीबगर सेट करता है TF, ट्रैप फ्लैग को EFLAGS(संशोधित करके CONTEXT), और प्रक्रिया जारी रखता है। ट्रैप फ्लैग सीपीयू का कारण बनता है INT 1जो अगले निर्देश पर एकल-चरणीय अपवाद ( ) उत्पन्न करता है ।

जब अगली बार डिबग की जा रही प्रक्रिया बंद हो जाती है, तो डीबगर फिर से ब्रेकपाइंट निर्देश के पहले बाइट को बदल देता है CC, और प्रक्रिया जारी रहती है।

मुझे यकीन नहीं है कि अगर यह ठीक है कि यह सभी डिबगर्स द्वारा कैसे लागू किया जाता है, लेकिन मैंने एक Win32 प्रोग्राम लिखा है जो इस तंत्र का उपयोग करके खुद को डीबग करने का प्रबंधन करता है। पूरी तरह से बेकार, लेकिन शैक्षिक।


25

लिनक्स में, एक प्रक्रिया डीबग करना ptrace (2) सिस्टम कॉल के साथ शुरू होता है । इस लेख में ptraceकुछ सरल डिबगिंग निर्माणों को लागू करने के लिए उपयोग करने के लिए एक महान ट्यूटोरियल है ।


1
क्या (2)"ptrace is a system call" की तुलना में हमें कुछ अधिक (या कम) बताता है?
लेज़र

5
@eSKay, नहीं, वास्तव में नहीं। (2)मैनुअल खंड संख्या है। मैन्युअल अनुभागों के विवरण के लिए en.wikipedia.org/wiki/Man_page#Manual_sections देखें ।
एडम रोसेनफील्ड

2
@AdamRosenfield इस तथ्य को छोड़कर कि खंड 2 विशेष रूप से "सिस्टम कॉल" है। तो अप्रत्यक्ष रूप से, हाँ, यह हमें बताता है कि ptraceएक सिस्टम कॉल है।
जोनाथन रेनहार्ट

1
अधिक व्यावहारिक रूप से, (2)हमें बताता है कि हम टाइप कर सकते हैं man 2 ptraceऔर सही मैनपेज प्राप्त कर सकते हैं - यहां महत्वपूर्ण नहीं है, क्योंकि कोई अन्य नहीं है ptrace, लेकिन यह लिनक्स पर तुलना man printfकरने के लिए नहीं है man 3 printf
स्लिम अप

9

यदि आप विंडोज ओएस पर हैं, तो इसके लिए एक बड़ा संसाधन जॉन रोबिन्स द्वारा "Microsoft .NET और माइक्रोसॉफ्ट विंडोज के लिए डिबगिंग एप्लिकेशन" होगा:

(या पुराने संस्करण: "डिबगिंग एप्लिकेशन" )

पुस्तक में एक अध्याय है कि एक डिबगर कैसे काम करता है जिसमें सरल (लेकिन काम करने वाले) डिबगर्स के एक जोड़े के लिए कोड शामिल है।

चूंकि मैं यूनिक्स / लिनक्स डिबगिंग के विवरण से परिचित नहीं हूं, इसलिए यह सामान अन्य ओएस पर लागू नहीं हो सकता है। लेकिन मुझे लगता है कि एक बहुत ही जटिल विषय के लिए एक अवधारणा के रूप में - यदि विवरण और एपीआई नहीं - सबसे किसी भी ओएस को 'पोर्ट' करना चाहिए।


3

डीबगिंग को समझने के लिए एक अन्य मूल्यवान स्रोत इंटेल सीपीयू मैनुअल (इंटेल® 64 और आईए -32 आर्किटेक्चर सॉफ्टवेयर डेवलपर मैनुअल) है। वॉल्यूम 3 ए, अध्याय 16 में, इसने डिबगिंग के हार्डवेयर समर्थन को पेश किया, जैसे कि विशेष अपवाद और हार्डवेयर डीबगिंग रजिस्टर। निम्नलिखित उस अध्याय से है:

T (trap) ध्वज, TSS - एक डीबग अपवाद (#DB) उत्पन्न करता है जब TSS के साथ किसी कार्य को उसके TSS में सेट करने का प्रयास किया जाता है।

मुझे यकीन नहीं है कि विंडो या लिनक्स इस ध्वज का उपयोग करते हैं या नहीं, लेकिन उस अध्याय को पढ़ना बहुत दिलचस्प है।

आशा है कि यह किसी की मदद करता है।


2

मुझे लगता है कि यहाँ उत्तर देने के लिए दो मुख्य प्रश्न हैं:

1. डिबगर कैसे जानता है कि एक अपवाद हुआ?

जब एक ऐसी प्रक्रिया में अपवाद होता है जिसे डिबग किया जाता है, तो लक्ष्य प्रक्रिया में परिभाषित किसी भी उपयोगकर्ता अपवाद संचालकों को अपवाद का जवाब देने से पहले ओएस द्वारा डीबगर को अधिसूचित किया जाता है। यदि डीबगर इस (पहली-मौका) अपवाद सूचना को संभालने के लिए नहीं चुनता है, तो अपवाद प्रेषण अनुक्रम आगे बढ़ता है और लक्ष्य थ्रेड को अपवाद को संभालने का मौका दिया जाता है यदि वह ऐसा करना चाहता है। यदि SEH अपवाद को लक्ष्य प्रक्रिया द्वारा नियंत्रित नहीं किया जाता है, तो डिबगर को फिर एक अन्य डिबग इवेंट भेजा जाता है, जिसे दूसरी-मौका सूचना कहा जाता है, यह सूचित करने के लिए कि लक्ष्य प्रक्रिया में एक अनहेल्दी अपवाद हुआ है। स्रोत

यहां छवि विवरण दर्ज करें


2. डिबगर कैसे जानता है कि ब्रेकपॉइंट पर कैसे रोकें?

सरलीकृत उत्तर है: जब आप प्रोग्राम में ब्रेक-पॉइंट डालते हैं, तो डिबगर आपके कोड को उस बिंदु पर एक int3 निर्देश के साथ बदल देता है, जो एक सॉफ्टवेयर इंटरप्ट है । एक प्रभाव के रूप में कार्यक्रम को निलंबित कर दिया जाता है और डिबगर कहा जाता है।


1

मेरी समझ यह है कि जब आप किसी एप्लिकेशन या DLL फ़ाइल को संकलित करते हैं, तो जो कुछ भी वह फ़ंक्शन और चर का प्रतिनिधित्व करने वाले प्रतीकों को संकलित करता है।

जब आपके पास एक डीबग बिल्ड होता है, तो ये सिंबल रिलीज़ होने के समय की तुलना में कहीं अधिक विस्तृत होते हैं, इस प्रकार डीबगर आपको अधिक जानकारी देने की अनुमति देता है। जब आप डिबगर को किसी प्रक्रिया में संलग्न करते हैं, तो यह दिखता है कि वर्तमान में कौन से फ़ंक्शंस एक्सेस किए जा रहे हैं और यहां से सभी उपलब्ध डिबगिंग प्रतीकों को हल करता है (क्योंकि यह जानता है कि संकलित फ़ाइल के इंटर्नल क्या दिखते हैं, यह स्मृति में क्या हो सकता है, यह Acertain कर सकता है। , ints की सामग्री के साथ, फ्लोट्स, स्ट्रिंग्स, आदि)। पहले पोस्टर की तरह, यह जानकारी और ये प्रतीक कैसे काम करते हैं, यह पर्यावरण और भाषा पर बहुत निर्भर करता है।


2
यह सिर्फ प्रतीकों के बारे में है। प्रतीकों की तुलना में कहीं अधिक, डीबगिंग से कहीं अधिक है।
जोनाथन रेनहार्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.