2008-10-19 12 views
137

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

+4

एली का आलेख http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1 – Oktalist

+0

@ ऑक्टालिस्टिस्ट के लिए स्थानांतरित हो गया है यह आलेख दिलचस्प है लेकिन केवल API-level abstraction के बारे में बात करता है लिनक्स पर डीबगिंग। मुझे लगता है कि ओपी हुड के नीचे और जानना चाहता है। – smwikipedia

उत्तर

74

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

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

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

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

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

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

+3

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

+2

@StefanFalk मैंने लिखा [एक उत्तर] (http://stackoverflow.com/a/21746853/119527) जो कुछ निम्न-स्तर के विवरण (x86 पर) को संबोधित करता है। –

+0

संकेत के लिए धन्यवाद :) – displayname

1

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

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

+1

यह सिर्फ प्रतीकों के बारे में है। प्रतीकों की तुलना में डीबगिंग करने के लिए बहुत दूर है। –

9

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

(या यहां तक ​​कि पुराना संस्करण: "Debugging Applications")

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

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

23

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

+1

क्या '(2)' हमें कुछ और (या कम) बताता है "ptrace एक सिस्टम कॉल है"? – Lazer

+5

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

+2

@AdamRosenfield इस तथ्य के अलावा कि धारा 2 विशेष रूप से "सिस्टम कॉल" है। तो अप्रत्यक्ष रूप से, हाँ, यह हमें बताता है कि 'ptrace' एक सिस्टम कॉल है। –

3

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

टी (जाल) ध्वज, टीएसएस - एक प्रयास (0 डीबी) उत्पन्न करता है जब कोई प्रयास होता है जो टीएसएस में टी फ्लैग सेट के साथ किसी कार्य में स्विच करने के लिए किया जाता है।

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

उम्मीद है कि यह किसी की मदद करेगा।

44

मैं यह समझ के रूप में:

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

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

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

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

संबंधित मुद्दे