डीबगर कसे कार्य करते. विंडोज ऑपरेटिंग सिस्टमचा कर्नल मोड डीबग करण्यासाठी साधने डीबगिंग सिस्टम प्रक्रिया आणि ओएस कर्नल

विंडोजसाठी काही सभ्य कर्नल-स्तरीय डीबगर आहेत, परंतु लिनक्समध्ये ते एका हाताच्या बोटांवर मोजले जाऊ शकतात, आणि ते देखील बहुतेक कच्चे, अपूर्ण किंवा सोडलेले आणि मॉसने वाढलेले आहेत... आज आपण सर्वात लोकप्रिय बद्दल बोलू. आणि त्यापैकी सर्वात मनोरंजक -
लिनिस.

परिचय

नावावरून तुम्ही आधीच अंदाज लावू शकता, लिनिसपौराणिक एक अनधिकृत "बंदर" आहे
Linux साठी SoftICE, ज्याने इंटरफेस, कमांड सिस्टम आणि नंतरच्या बहुतेक क्षमता राखून ठेवल्या: सरफेसिंग हॉटकी(व्ही लिनिसया ); सर्व फंक्शन्सवर हार्डवेअर ब्रेकपॉइंट सेट करणे आणि सिस्टम कॉल; GDT/LDT/IDT पहा, भौतिक पृष्ठेस्मृती; GDB कडून उधार घेतलेली वैशिष्ट्ये (कॉल कमांडसह अनियंत्रित फंक्शन कॉल करणे, रजिस्टर संदर्भ जतन/रिस्टोअर करणे, अंतर्गत चल इ.).

इतर डीबगर्सच्या विपरीत, जे ptrace मेकॅनिझमद्वारे कार्य करतात, जे नॉन-एंट्रंट आहे आणि संरक्षणाद्वारे सहजपणे शोधले जाते (ज्याचा विंडोज ॲनालॉग DEBUG_PROCESS आहे, ॲप्लिकेशन डीबगरद्वारे वापरला जातो), लिनिसनेटिव्ह ट्रेसिंग वापरते, SoftICE प्रमाणेच, जे दोन्ही डीबगरना इतर हाताळू शकत नसलेले अत्यंत सुरक्षित प्रोग्राम डीबग करण्यास अनुमती देते.

खरं तर, हे अजिबात बंदर नाही (म्हणूनच कोट्स), परंतु एक स्वतंत्र प्रकल्प, सुरवातीपासून लिहिलेला आणि स्त्रोत कोडमध्ये विनामूल्य वितरित केला गेला (सॉफ्टआयसीई कडून फक्त प्रेरणा आहे). 2.4 कर्नलसाठी कोडचा मुख्य भाग जर्मन हॅकर गोरान डेव्हिकने लिहिला होता, परंतु 2.6 कर्नल राखण्यात पूर्णपणे भिन्न लोक गुंतले होते: डॅनियल रेझनिक, पीटर के. आणि कार्लोस मॅन्युएल ड्युक्लोस व्हर्गारा. आणि आमचा देशबांधव - ओलेग खुदाकोव्ह - नासम ते असेंबलर फायली पुन्हा लिहिल्या
gcc

स्त्रोत मजकूर प्रकल्पाच्या अधिकृत वेबसाइटवर आहेत -
ओळ%0A.com">www.Linice.com, तेथे दस्तऐवजीकरण, एक लहान FAQ आणि फोरमची लिंक देखील आहे
ओळ%0A">groups.google.com/group/Linice. तयार बायनरी असेंब्ली नाहीत.
प्रकल्पाच्या निर्मात्यांनी SourceForge वर त्यांचे स्वतःचे खाते उघडले, परंतु त्यावर कोणत्याही फायली अपलोड करण्यात खूप आळशी होते, फक्त 3 स्क्रीनशॉट सादर केले, परंतु खूप कमी दर्जाचा:
.

यंत्रणेची आवश्यकता

नवीनतम आवृत्ती लिनिस 2.6 क्रमांकित आहे आणि 28 जुलै 2005 पासूनची तारीख आहे, 2.4.x कर्नल आणि VGA कन्सोल मोडला पूर्णपणे समर्थन देते. नवीन कर्नलमध्ये गंभीर समस्या आहेत, आणि 2.6.x कर्नलला फक्त मर्यादित समर्थन आहे.
डीबगर डेबियन 2.6 अंतर्गत विकसित आणि चाचणी केली गेली. इतर वितरणांसह त्याच्या सुसंगततेची हमी दिली जात नाही, जी आपल्याला डफचा अवलंब करण्यास भाग पाडते, परंतु काही प्रकरणांमध्ये तंबोरीन देखील मदत करत नाही. वास्तविक, डेबियन तुमच्या मशीनवर फक्त काम करण्यासाठी ठेवा लिनिस, - हे अगदी सामान्य आहे. बऱ्याच काळापूर्वी, जेव्हा NT साठी अद्याप कोणतीही SoftICE अंमलबजावणी नव्हती, तेव्हा अनेक हॅकर्सने विन 9x फक्त प्रोग्राम ब्रेक करण्यासाठी स्थापित केले होते, जरी ते स्वतः खाली बसले होते
एन.टी. कारण स्थापनेच्या सर्व गुंतागुंतांना कव्हर करण्यासाठी लिनिसएका लेखाच्या चौकटीत हे व्यावहारिकदृष्ट्या अशक्य आहे, मी स्वतःला संकलन आणि लॉन्च प्रक्रियेचे वर्णन करण्यापुरते मर्यादित ठेवीन लिनिसएका विशिष्ट वितरण अंतर्गत - कन्सोल VGA मोडमध्ये कर्नल 2.4.1 सह Knoppix 3.7.
लिनिस ACPI आणि मल्टीप्रोसेसर मशीनला समर्थन देते, परंतु X's सह चांगले कार्य करत नाही, विशेषत: nVidia व्यतिरिक्त इतर व्हिडीओ कार्ड्सवर ते 24-बिट कलर डेप्थ अजिबात समजत नाही, फक्त 8, 16 आणि 32 बिट "पचन" करते, त्यामुळे ते अधिक सोयीस्कर आहे. VT100 प्रोटोकॉल वापरून COM पोर्टद्वारे कनेक्ट केलेल्या रिमोट टर्मिनलद्वारे एक्स ऍप्लिकेशन्स डीबग करण्यासाठी, या प्रकरणात, स्थानिक कीबोर्ड देखील त्याच्यासह कार्य करेल.
लिनिस!

लिनिस संकलित आणि कॉन्फिगर करणे

स्रोत ग्रंथांचे gzip संग्रहण डाउनलोड करा www. लिनिस.devic.us/ लिनिस-2.6.tar.gz, जे मेगाबाइटपेक्षा थोडे कमी घेते, ते डिस्कवर अनपॅक करा, ./docs डिरेक्ट्रीवर जा आणि रीडमी फाइलमधून आम्हाला आढळले की डीबगर खालीलप्रमाणे 2.4 कर्नलसाठी तयार केला आहे:

# सीडी बिल्ड
# ./make_bin-2.4
# cd ../bin
# स्वच्छ करा; mak e

तथापि, मेक चालवण्यापूर्वी, तुम्ही ./bin-2.4/Makefile फाइल उघडली पाहिजे आणि लक्ष्य प्लॅटफॉर्मच्या कॉन्फिगरेशन आणि आर्किटेक्चरनुसार "TARGET" ओळ संपादित केली पाहिजे. विशेषतः, मल्टी-कोर किंवा हायपरथ्रेडिंग प्रोसेसर असलेल्या ACPI मशीनवर ते असे दिसेल:

लक्ष्य = -DSMP -DIO_APIC

संकलन पूर्ण झाल्यानंतर, ./bin निर्देशिकेत अनेक फाईल्स आणि डिरेक्टरी असतील, परंतु फक्त महत्त्वाच्या आहेत:

linsym - डीबगर लोडिंग मॉड्यूल;
linince.dat – कॉन्फिगरेशन फाइल;
xice - X"s साठी समर्थन, मजकूर मोडमध्ये कार्य करताना ते हटविले जाऊ शकते;
./Linice_2.4.27/Linice.o – एक लोड करण्यायोग्य कर्नल मॉड्यूल ज्यामध्ये स्वतः डीबगर आहे.

प्रक्रिया तयार करा लिनिस

कमीतकमी कार्यरत किट एकत्र केल्यावर, बाकी सर्व काही मिळवणे चांगले होईल - डेमो डीबगिंग उदाहरणे ./test निर्देशिकेत स्थित आहेत आणि कंपाइल स्क्रिप्टसह संकलित केली आहेत, तसेच विस्तार मॉड्यूल (आमच्या मते, प्लगइन) मध्ये स्थित आहे. ./ext निर्देशिका, मेक कमांडद्वारे संकलित आणि insmod कमांडद्वारे लोड केली जाते. त्याचा कोणताही फायदा नाही, परंतु स्त्रोत कोडचा अभ्यास केल्यानंतर, आपण कार्यक्षमतेचा विस्तार करणारे स्वतःचे मॉड्यूल लिहू शकतो.
लिनिस.

Knoppix लोड करताना, स्क्रीनच्या तळाशी एक "boot:" प्रॉम्प्ट दिसेल जेथे तुम्हाला "knoppix 2 vga=normal" प्रविष्ट करणे आवश्यक आहे "knoppix" फसवणूक कोड 2.4 कर्नल (स्वयंचलितपणे डीफॉल्ट लोड केला जातो, म्हणून "knoppix") वगळले जाऊ शकते), " 2" ब्लॉक लोड होत आहे X"s, आणि "vga=normal" 80x25 च्या रिझोल्यूशनसह मानक vga मोड सेट करते.

डाउनलोड पूर्ण होण्याची प्रतीक्षा केल्यानंतर, "su", नंतर "passwd" म्हणा आणि प्रविष्ट करा नवीन पासवर्डरूट"a साठी, ज्याच्या अंतर्गत आम्ही लॉगिन कमांड वापरून ताबडतोब सिस्टममध्ये लॉग इन करतो. हे पूर्ण न झाल्यास, सुरू करण्याचा प्रयत्न लिनिस"सेगमेंटेशन फॉल्ट" च्या आक्रोशात चिरडून टाकणाऱ्या अपयशात समाप्त होईल.

सह Knoppix लोड करताना हार्ड ड्राइव्ह(ज्यावर तुम्ही ते "sudo knoppix-installer" कमांडसह स्थापित करू शकता, LiveCD सत्राच्या अंतर्गत टर्मिनल विंडोमध्ये टाइप केले आहे), उपलब्ध कर्नलच्या सूचीसह एक प्रारंभ मेनू दिसेल. लिनक्स (2.4)-1 निवडा आणि क्लिक करा बूट पॅरामीटर्स सेट करण्यासाठी - “2 vga=normal”. कर्नल आधीच निवडलेला असल्याने "नॉपपिक्स" हा शब्द लिहिण्याची गरज नाही. डाउनलोड पूर्ण झाल्यानंतर, लॉगिन कमांड द्या आणि रूट म्हणून लॉग इन करा (खाते आधी तयार केले आहे असे गृहीत धरून).

डीबगर ./linsym –i या कमांडसह लाँच केले जाते, त्यानंतर ते लगेच स्क्रीनवर दिसते. असे होत नसल्यास, निदान संदेश प्रदर्शित करण्यासाठी "--verbose 3" स्विच निर्दिष्ट करण्याचा प्रयत्न करा.
बूट अयशस्वी होण्याचे एक कारण कर्नल फंक्शन्सचे पत्ते असलेल्या /boot/System.map फाइलची अनुपस्थिती असू शकते. जर System.map ची सामग्री वर्तमान कर्नलशी जुळत नसेल तर डाउनलोड देखील अयशस्वी होईल, जे घडू शकते, उदाहरणार्थ, जेव्हा ते पुन्हा संकलित केले जाते. काही वितरण संकलकांमध्ये एकतर System.map अजिबात समाविष्ट नाही (यामुळे सिस्टमची सुरक्षा मजबूत होईल, कारण रूटकिट्ससाठी सिस्कॉल्समध्ये अडथळा आणणे अधिक कठीण होईल असा विश्वास आहे), किंवा ते येथे काहीतरी पूर्णपणे चुकीचे ठेवतात आणि सामान्यतः कुठे हे स्पष्ट नसते. ते आले. अशा परिस्थितीत, फक्त कर्नल पुन्हा संकलित करणे पुरेसे आहे, डिबगरला "-m" स्विच वापरून System.map फाइलच्या मार्गाकडे निर्देशित करणे, जर ते /boot व्यतिरिक्त कुठेतरी स्थित असेल. अशा प्रकारे, सुरक्षिततेशी तडजोड केली जाणार नाही, आणि लिनिसकाम करू शकता!
डीबगर सिस्टीमवर परत येतो किंवा कमांड वापरून "x " संयोजन कोणत्याही प्रोग्राममधून डीबगरला कॉल करते. तथापि, हे अजिबात नाही की आपण स्वतःला त्याच्या संदर्भात शोधू, कारण लिनक्स ही एक मल्टीटास्किंग प्रणाली आहे जी एकामागून एक प्रक्रिया बदलते आणि ADDR (संदर्भ स्विचिंग) कमांड "लेक्सिकॉन" मध्ये आहेत. लिनिसअद्याप अस्तित्वात नाही, आणि ते कधी दिसेल हे अज्ञात आहे. म्हणून, विशिष्ट प्रोग्रामद्वारे वापरल्या जाणाऱ्या सिस्टम कॉल्सवर ब्रेकपॉईंट सेट करून किंवा INT 03h पद्धत वापरून प्रक्रियेत प्रवेश करून, ज्याबद्दल आपण आता बोलू, आपण धूर्त असणे आवश्यक आहे.

"-x" स्विच, समान लिन्सिमला दिलेला, डीबगर अनलोड करण्यासाठी जबाबदार आहे (जर तुम्हाला ते खरोखर अनलोड करायचे असेल तर).

सह काम करण्याच्या मूलभूत गोष्टी लिनिस

ज्यांनी आधीच SoftICE, mastering सह काम केले आहे त्यांच्यासाठी लिनिसकोणतीही समस्या उद्भवणार नाही. समान आज्ञा येथे वापरल्या जातात: डी – मेमरी डंप, ई – मेमरी संपादन, टी – चरण-दर-चरण ट्रेसिंग, पी – फंक्शन्स प्रविष्ट न करता ट्रेसिंग, आर – रजिस्टर्स पाहणे/बदलणे, BPM/BPX – मेमरी प्रवेशासाठी ब्रेकपॉइंट सेट करणे /अंमलबजावणी आणि इ. कमांड्सची संपूर्ण यादी अंगभूत मदतीमध्ये असते, ज्याला HELP द्वारे म्हणतात (तसे, "HELP command_name" कमांडवर अतिरिक्त माहिती प्रदान करते) आणि मानक दस्तऐवजीकरणात.

चला क्लिक करूया आणि PROC कमांडद्वारे प्रदर्शित केलेल्या प्रक्रियांची सूची पहा, सध्याची प्रक्रिया निळ्या रंगात हायलाइट केली आहे:

:प्रोक

1 0000 C1C3E000 स्लीपिंग 0 0 इनिट
2 0000 F7EE8000 स्लीपिंग 0 0 kventd
3 0000 F7EE2000 स्लीपिंग 0 0 ksoftirqd_CPU0
4 0000 F7EE0000 स्लीपिंग 0 0 ksoftirqd_CPU1
5 0000 F7ED0000 स्लीपिंग 0 0 kswapd
6 0000 F7EAA000 स्लीपिंग 0 0 bdflush
7 0000 F7EA8000 SLEEPING 0 0 kupdated
56 0000 F6A36000 स्लीपिंग 0 0 kjournald
1006 0000 F7A34000 रनिंग 0 0 ऑटोमाउंट
1013 0000 F68E6000 स्लीपिंग 0 0 कप
...
1105 0000 F6DDE000 SLEEPING 0 0 mc
1106 0000 F6DD4000 स्लीपिंग 0 0 cons.saver

प्रक्रिया अर्थातच चांगल्या आहेत, पण तरीही आम्ही प्रोग्राम्स कसे डीबग करू? सर्वात सोपी गोष्ट म्हणजे एंट्री पॉइंटमध्ये INT 03h निर्देशाशी संबंधित CCH मशीन सूचना टाकणे, प्रथम मूळ बाईटची सामग्री लिहून ठेवणे. हे कोणत्याही हेक्स संपादकासह केले जाऊ शकते, उदाहरणार्थ, ज्याचा मी अनेक वेळा उल्लेख केला आहे
एचटीई.

एडिटरमध्ये फाइल लोड केल्यानंतर, क्लिक करा (मोड), एल्फ/इमेज निवडा, कर्सरला “एंट्रीपॉइंट:” वर हलवा, दाबा (संपादित करा) आणि पहिला बाइट सीसीएचमध्ये बदला, बदल जतन करा (जतन करा) आणि सोडा. पॅच केलेला प्रोग्राम चालवताना लिनिसताबडतोब पॉप अप होते, सीसीएच द्वारे व्युत्पन्न केलेल्या अपवादामुळे विचलित होते, ज्यानंतर EIP समाप्ती दर्शवते
सीसीएच.

डीबगर पॉप अप होताना पॅच केलेल्या एंट्री पॉइंटसह प्रोग्रामची स्थिती

0023:080482C0 CC इंट 3
0023:080482C1 ED in eax, dx
0023:080482C2 5E पॉप esi
0023:080482C3 89E1 mov ecx, esp

कर्सर in eax,dx (EDh) निर्देशाकडे निर्देश करतो, जो पॅच केलेल्या xor ebp, ebp (31h EDh) निर्देशाचा एक भाग आहे. आता (सिद्धांतात) आपण CCh 31h मध्ये बदलून मूळ बाइट पुनर्संचयित केला पाहिजे, EIP रजिस्टर एकाने कमी केले पाहिजे आणि नेहमीप्रमाणे ट्रेसिंग सुरू ठेवावे.

पण तसे नव्हते! लिनिस- हे अर्थातच एक पोर्ट आहे, परंतु केवळ एक अतिशय क्रूड आहे आणि ते पृष्ठ प्रतिमेची मेमरी सुधारू शकत नाही, जरी आपण प्रथम लेखनासाठी कोड विभाग उघडला तरीही. ना E (संपादन), ना F (भरणे), ना M (मेमरी कॉपी) काम! परंतु स्टॅकवर लिहिणे कार्य करते आणि हे आमच्या हॅकर्ससाठी पुरेसे आहे.

आम्हाला ईआयपी रजिस्टरचे वर्तमान मूल्य आठवते; पॅच मशीन कमांड स्टॅकच्या शीर्षस्थानी कॉपी करा; तेथे सीसीएच बाइट पुनर्संचयित करा; आम्ही त्यावर नियंत्रण हस्तांतरित करतो, ईआयपी मूल्य बदलतो; आम्ही ट्रेसिंगची एकच कृती करून ते पार पाडतो; आणि EIP त्याच्या जागी परत करा, म्हणजे खालील मशीन कमांडवर:

INT 03h सूचनेद्वारे पुनर्स्थित केलेला मूळ बाइट पुनर्प्राप्त करणे

; स्टॅकच्या वर काय आहे ते पाहूया (शुद्ध कुतूहलातून).
:d esp-10
0018:BFFFEFC0 C0 82 04 08 00 00 00 00 5D 0C 00 40 DC EF FF BF

; आम्ही पॅच मशीन कमांड स्टॅकच्या शीर्षस्थानी कॉपी करतो.
; संख्या 10h हा x86 वरील मशीन निर्देशाचा जास्तीत जास्त संभाव्य आकार आहे.
:m eip-1 L 10 esp-10

; स्टॅक कसा बदलला आहे ते पाहूया.
:d esp-10
0018:BFFFEFC0 CC ED 5E 89 E1 83 E4 F0 50 54 52 68 F0 85 04 08

; हं! स्टॅक खरोखर बदलला आहे, 31h वाजता CCh निश्चित करण्याची वेळ आली आहे.
:e esp-10 31
तात्काळ डेटा संपादित करा जो अद्याप लागू झाला नाही.

; अरेरे! लिनिसमध्ये थेट डेटा असाइनमेंट लागू केले जात नाही,
; परंतु आम्ही डंप परस्परसंवादीपणे संपादित करू शकतो (देखील
; SoftICE प्रमाणे) किंवा F esp-10 L 1 31 कमांड द्या, फक्त हे लक्षात ठेवा
; की, SoftICE च्या विपरीत, Linice डीबगर डंप विंडो अपडेट करत नाही,
; त्यामुळे F कमांड कार्यान्वित केल्यानंतर असे दिसून येईल
; परिणाम नाही; खरं तर, हे तसे नाही, आपल्याला फक्त अद्यतनित करण्याची आवश्यकता आहे
; D esp-10 कमांडसह डंप करा आणि सर्व काही ठिकाणी पडेल.

; आम्ही स्टॅकवर कॉपी केलेल्या कमांडवर नियंत्रण हस्तांतरित करतो,
; EIP रजिस्टरचे मूल्य लक्षात ठेवा.
:r eip (esp-10)
reg:eip=BFFFEFC0

; आम्ही ट्रेसिंगची एकच कृती करतो.
:ट
0023:BFFFEFC2 5E पॉप esi

; जसे आपण पाहू शकतो, EIP रजिस्टर 2 ने वाढले आहे (BFFFEFC2h - BFFFEFC0h) = 02h,
; म्हणून, पुढील कमांडचा पत्ता आहे: 080482C1h - 01h + 02h = 080482C2h,
; जिथे प्रोग्राममध्ये प्रवेश करताना 080482C1h हे EIP चे प्रारंभिक मूल्य आहे आणि 01h हा INT 03h चा आकार आहे.

; पॅच केलेल्या सूचनेनुसार आम्ही कमांडवर EIP सेट करतो.
:r eip 80482C2
reg:eip=80482C2

हे अशा प्रकारचे डान्स आहेत जे तुम्हाला करावे लागतात. आणि काय करावे? म्हणून, आम्ही डीबगरमध्ये लोडिंग प्रोग्राम्सची क्रमवारी लावली आहे; आता आम्ही सिस्टम कॉल आणि कर्नल फंक्शन्समध्ये ब्रेकपॉइंट्स वेगळे करू.

exp कमांड कर्नलद्वारे निर्यात केलेली नावे मुद्रित करते, त्यापैकी कोणतीही अभिव्यक्तीमध्ये दिसू शकते, उदाहरणार्थ "bpx do_bkr" "bpx C012C9E8" च्या समतुल्य आहे.

कर्नलद्वारे निर्यात केलेली नावे दाखवत आहे

: Exp
कर्नल
C0320364 mmu_cr4_features
C02AC3A4 acpi_disabled
C02AC8A0 i8253_lock
...
C012BDA8 do_mmap_pgoff
C012C764 do_munmap
C012C9E8 do_brk
C011E990 exit_mm
C011E69C exit_files

सिस्टम कॉल अधिक कठीण आहेत. कडून थेट समर्थन लिनिसते येथे नाही (परंतु लिनक्सच्या वैशिष्ट्यांनुसार ते असले पाहिजे), म्हणून ही गोष्ट हाताने करावी लागेल.

syscall टेबल, जसे तुम्हाला माहीत आहे, sys_call_table या पत्त्यापासून सुरू होणारे दुहेरी शब्दांचे ॲरे आहे (हे व्हेरिएबल कर्नलद्वारे निर्यात केले जाते).

सिस्टम कॉल टेबल

; आम्ही डीबगर दुहेरी शब्द प्रदर्शन मोडवर स्विच करतो.
:dd

; आम्ही टेबल स्क्रीनवर प्रदर्शित करतो.
:d sys_call_table
0018:C02AB6A8 C0126ACC F8932650 F89326A0 C013DC10
0018:C02AB6B8 C013DD18 C013D5C8 C013D724 C011F3BC
0018:C02AB6C8 C013D664 C014A8E0 C014A3B4 F893020C

सारणीचा प्रत्येक घटक त्याच्या स्वतःच्या सिस्टम कॉलशी संबंधित असतो आणि प्रत्येक कॉलचा स्वतःचा नंबर असतो, जो /usr/include/sys/syscall.h फाईलमध्ये शोधून शोधला जाऊ शकतो, परंतु हे लिनक्स अंतर्गत न करणे चांगले आहे. , जेथे कोणतेही थेट क्रमांक नाहीत, परंतु BSD कडून एक समान फाइल उधार घेण्यासाठी - सर्व समान, सर्व सिस्टमवरील मुख्य सिस्टम कॉलचे नंबर समान आहेत. विशेषतः, ओपन सिस्टम कॉल नंबर 5 आहे.

उघड्यावर ब्रेकपॉईंट सेट करण्यासाठी, तुम्हाला त्याचा पत्ता शोधणे आवश्यक आहे, जो सिस्टम कॉल टेबलच्या पाचव्या दुहेरी शब्दात स्थित आहे, शून्यातून मोजला जातो आणि समान (या प्रकरणात) C013D5C8h.

ओपन सिस्टम कॉलवर ब्रेकपॉइंट सेट करत आहे

; ओपन सिस्टम कॉलवर ब्रेकपॉइंट सेट करा,
:bpx C013D5C8
; डीबगरमधून बाहेर पडा,
:x
...
# काही फाईल उघडा,
...
; डीबगर लगेच पॉप अप करतो, आम्हाला याबद्दल सांगतो,
:BPX 01 मुळे ब्रेकपॉइंट

; आम्ही आमच्या प्रक्रियेत अडकलो आहोत याची खात्री करण्यासाठी आम्ही proc कमांड जारी करतो.
: proс
PID TSS कार्य राज्य uid gid नाव
1049 0000 F6364000 स्लीपिंग 0 0 गेटी
1145 0000 F61CC000 स्लीपिंग 0 0 mc
1146 0000 F614A000 स्लीपिंग 0 0 cons.saver

अशा प्रकारे, आधीपासून चालू असलेल्या प्रक्रियांमध्ये हॅक करणे, ते वापरत असलेल्या सिस्टम कॉलवर ब्रेकपॉइंट सेट करणे आणि हॅकिंगसाठी आवश्यक असलेल्या इतर अनेक गोष्टी करणे सोपे आहे.

निष्कर्ष

स्पष्ट ओलसरपणा असूनही, लिनिससंरक्षित ऍप्लिकेशन्स डीबग करण्यासाठी योग्य आहे, जरी बऱ्याचदा तुम्हाला सामान्य डीबगरमध्ये स्वयंचलितपणे कार्यान्वित केलेल्या वर्कअराउंड्सचा अवलंब करावा लागतो. म्हणून लिनिसजीडीबी अजिबात बदलत नाही, परंतु केवळ त्यास पूरक आहे.

प्रोग्राम तयार करण्यासाठी आवश्यक असलेल्या कंपाइलरनंतर डीबगर ही दुसरी गोष्ट आहे. तथापि, जे संगणक प्रोग्राम लिहितात आणि डीबगर वापरतात त्यांच्यापैकी अनेकांना त्याच्या ऑपरेशनची तत्त्वे आणि यंत्रणा माहित नाहीत.


डीबगर होणे कठीण आहे...

प्रोग्रामर रात्रंदिवस डीबगर वापरतात या वस्तुस्थितीच्या प्रकाशात, विशेषत: जेव्हा ते डीप डीबगिंग मोडमध्ये प्रवेश करतात तेव्हा हे सांगण्यासारखे आहे की जर डीबगर हा प्रोग्राम नसता तर हार्डवेअरचा तुकडा असतो, तर तो कदाचित जास्त गरम होऊन तुटला असता. कारण डीबगरला जेवढे काम मिळते तेवढे काम कंपाइलरकडेही नसते.

अर्थात, आता बऱ्याच भिन्न प्रोग्रामिंग भाषा असल्याने, त्या प्रत्येकासाठी भिन्न डीबगर आहेत. आणि, स्वाभाविकच, या भाषांच्या वेगवेगळ्या श्रेणींमध्ये डीबगरच्या कामात फरक आहेत: उदाहरणार्थ, रुबीमधील प्रोग्राम्ससाठी डीबगर बायटेकोडमध्ये संकलित केलेल्या जावा भाषेपेक्षा वेगळ्या पद्धतीने कार्य करेल आणि Java साठी डीबगर, मध्ये टर्न, डीबगर व्हिज्युअल C++ वरून फरक असेल.

मी विंडोज प्लॅटफॉर्मसाठी डीबगिंगबद्दल बोलेन. त्यासाठी डीबगरच्या ऑपरेशनची तत्त्वे समजून घेतल्यावर, POSIX सिस्टमसाठी डीबगर आणि स्तरावर कार्य न करणारे डीबगर दोन्ही समजून घेणे शक्य होईल. ऑपरेटिंग सिस्टम, परंतु व्हर्च्युअल मशीन किंवा काही दुभाष्याच्या स्तरावर.


विंडोजसाठी डीबगर: दोन प्रकार

विंडोजसाठी दोन मूलभूतपणे भिन्न प्रकारचे डीबगर आहेत. मला वाटते की डेल्फीमध्ये प्रोग्रामिंग करताना प्रत्येकजण प्रथम आला (त्यामध्ये प्रोग्राम केला नाही? यावर विश्वास ठेवणे कठीण आहे. तुम्ही शाळेत आणि कनिष्ठ महाविद्यालयात काय प्रोग्राम केले?). हे सानुकूल अनुप्रयोग डीबगर आहेत. त्यापैकी बरेच आहेत आणि ते एकात्मिक अनुप्रयोग विकास वातावरणाचा भाग म्हणून वैयक्तिकरित्या आणि (विशेषतः, मार्गाने, अनेकदा) अस्तित्वात आहेत. स्वतंत्र सॉफ्टवेअर उत्पादने म्हणून वितरीत केलेल्या डीबगर्समध्ये, OllyDbg हे पारंपारिकपणे हायलाइट केले जाते आणि मी एकदा कॉम्प्युटर न्यूजमध्ये याबद्दल लिहिले होते.

डीबगरचा दुसरा प्रकार म्हणजे ऑपरेटिंग सिस्टम कर्नल डीबगर. ते कमी वारंवार आढळतात आणि वापरले जातात आणि त्यांची रचना सानुकूल अनुप्रयोग डीबगरपेक्षा लक्षणीय भिन्न आहे. सर्वात प्रसिद्ध आणि त्याच वेळी, सर्वोत्कृष्ट कर्नल डीबगर सॉफ्टआयस आहे. कदाचित आपण त्याबद्दल केवळ ऐकलेच नाही तर ते वापरले असेल.

दोन प्रकारच्या डीबगर्सपैकी प्रत्येकाच्या कार्याची स्वतःची वैशिष्ट्ये असल्याने, मी त्या प्रत्येकाबद्दल अधिक तपशीलवार बोलेन.


सानुकूल अनुप्रयोग डीबगर

वापरकर्ता अनुप्रयोगांसाठी डीबगर सोपे आहे, कारण ऑपरेटिंग सिस्टम अत्यंत क्षुल्लक आणि घाणेरडे काम करते. Windows मध्ये विशेष सॉफ्टवेअर इंटरफेस आहेत जे वापरकर्ता-स्तरीय अनुप्रयोग डीबग करण्यासाठी डिझाइन केलेले आहेत - त्यांना Windows डीबगिंग API म्हणतात. हे डीबगिंग API आहे जे सर्व डीबगर्सद्वारे वापरले जाते जे Windows साठी लोकप्रिय एकात्मिक विकास वातावरणात तयार केले जातात.

डीबगिंग सुरू होण्यासाठी, डीबगरने विशिष्ट पद्धतीने डीबग केलेली प्रक्रिया सुरू करणे आवश्यक आहे - जेणेकरून सिस्टमला कळेल की ही प्रक्रिया डीबगिंग अंतर्गत असेल. यानंतर, डीबगिंग चक्र सुरू होते: प्रोग्राम एक विशिष्ट घटना घडेपर्यंत कार्यान्वित केला जातो, ज्याला डीबग इव्हेंट म्हणतात. डीबगरला हँग होण्यापासून रोखण्यासाठी हे डीबगिंग लूप वेगळ्या थ्रेडमध्ये चालवते.

पण ही फक्त सुरुवात आहे. कारण डीबगिंगची घटना घडल्यावर डीबगरची मजा सुरू होते. शेवटी, डिबगरचे काम काय आहे? प्रोग्रामरला विशिष्ट फंक्शन, विशिष्ट ऑपरेशन, विशिष्ट व्हेरिएबलमध्ये अचूकतेसह त्रुटी स्थानिकीकरण करण्यात मदत करण्यासाठी. ऑपरेटिंग सिस्टम डीबगरला या कठीण कामात मदत करू शकते.

तर, एक डीबगिंग घटना घडली आहे, आणि नंतर आम्हाला हे कसे तरी प्रोग्राम मजकूराशी कसे संबंधित आहे हे शोधण्याची आवश्यकता आहे. हे केवळ तेव्हाच शक्य आहे जेव्हा प्रोग्राममध्ये स्वतःच विशेष डीबगिंग माहिती समाविष्ट असेल - डीबगिंग चिन्हांची सारणी. त्यात पत्ते आणि फंक्शन्सची नावे, डेटा प्रकार आणि कोडच्या ओळ क्रमांकांमधील पत्रव्यवहाराविषयी माहिती असते. प्रत्येक विंडोज प्रोग्रामरला परिचित असलेले डीबगिंग शक्य आहे हे त्यांचे आभार आहे. सिम्बॉल टेबल्सचे फॉरमॅट वेगवेगळे असतात आणि म्हणूनच एका डेव्हलपरच्या कंपायलरने दुसऱ्या निर्मात्याकडून डीबगर वापरून संकलित केलेला प्रोग्राम डीबग करणे नेहमीच शक्य नसते. परंतु, तथापि, सर्वात सामान्य स्वरूप अद्याप निर्दिष्ट केले जाऊ शकते - हे पीडीबी (प्रोग्राम डेटाबेस) आहे आणि ते नैसर्गिकरित्या मायक्रोसॉफ्ट कॉर्पोरेशनने विकसित केले आहे.

तर, जर डीबग चिन्ह सारणी PDB स्वरूपात असेल, तर तुम्ही Microsoft कडून एक विशेष साधन वापरू शकता - प्रतीकात्मक डीबग प्रोसेसर. एकेकाळी तो सिस्टम कोरचा भाग होता आणि त्याला Imagehlp.dll म्हटले जात होते, परंतु बर्याच काळापूर्वी ते वेगळ्या लायब्ररीमध्ये वेगळे केले गेले होते. कॅरेक्टर प्रोसेसर तुम्हाला दिलेल्या पत्त्यावर सर्वात जवळचे ओपन फंक्शन किंवा ग्लोबल व्हेरिएबल, तसेच ही ओळ ज्यामध्ये आहे त्या स्त्रोत फाइलचा लाइन नंबर आणि नाव शोधण्याची परवानगी देतो. उलट ऑपरेशन्स देखील समर्थित आहेत, उदाहरणार्थ, फंक्शनचा पत्ता त्याच्या नावाने शोधणे.

हे, अर्थातच, सानुकूल अनुप्रयोग डीबगर करत असलेले सर्व कार्य नाही. उदाहरणार्थ, मल्टी-थ्रेडेड ऍप्लिकेशन्स डीबग करताना, थ्रेड्सच्या परस्परसंवादाशी संबंधित अनेक अत्यंत सूक्ष्म समस्या उद्भवतात. सेवांसारख्या तुलनेने सोप्या गोष्टी डीबग करतानाही काही बारकावे आहेत.

परंतु आम्ही आता सूक्ष्म गोष्टींवर लक्ष ठेवणार नाही - लेखाच्या शेवटी मी तुम्हाला त्यांच्याबद्दल कुठे वाचायचे ते सांगेन. आता कर्नल डीबगर पाहू.


कर्नल डीबगर

कर्नल डीबगर्स हे युजर ऍप्लिकेशन डीबगर पेक्षा जास्त क्लिष्ट प्रोग्राम्स आहेत आणि मला असे वाटते की ते का अगदी स्पष्ट आहे: त्यांच्याकडे ऑपरेटिंग सिस्टम सहाय्यक नाही. या प्रकरणात, ती त्यांची क्लायंट आहे, कारण तिनेच शेवटी डीबग करणे आवश्यक आहे.

बऱ्याच कर्नल डीबगरना ऑपरेट करण्यासाठी शून्य मोडेम केबलने जोडलेले दोन संगणक आवश्यक असतात. नल मॉडेम दोन संगणकांना त्यांच्या COM किंवा LTP पोर्टद्वारे थेट केबलने जोडण्याचा एक मार्ग आहे. दुसऱ्या संगणकाची आवश्यकता आहे कारण डीबगरचा भाग पहिल्यावर बसलेला आहे (ज्या ठिकाणी डीबग केलेली सिस्टम स्थापित केली आहे) मर्यादित प्रवेशहार्डवेअरवर, आणि म्हणून सर्व डेटा आउटपुट शून्य मोडेमद्वारे दुसऱ्या संगणकावर जातो.

आधुनिक इंटेल x86 आर्किटेक्चर प्रोसेसरमध्ये विशेष डीबगिंग रजिस्टर्स असतात (जुन्या 368 आणि नवीन प्रोसेसर मॉडेल्समध्ये त्यापैकी फक्त आठ असतात, त्यांना DR0-DR7 म्हणतात). ही नोंदणी डीबगरला सेट करण्याची परवानगी देतात नियंत्रण बिंदूवाचन आणि लेखन मेमरी, तसेच I/O पोर्टसाठी. IN सामान्य दृश्यसर्व काही अगदी यासारखे दिसते आणि मला वाटत नाही की प्रत्येक डीबग रजिस्टर कशासाठी जबाबदार आहे, ब्रेकपॉईंट्स लागू करण्यात काय व्यत्यय आणतो आणि इतर तत्सम माहिती देतो याचे तपशीलवार वर्णन करणे योग्य आहे. Windows साठी विशिष्ट विद्यमान कर्नल डीबगर्सबद्दल आपल्याला सांगणे चांगले आहे.

बरं, प्रथम, हे ऑपरेटिंग सिस्टम कर्नलमध्येच तयार केलेले डीबगर आहे. हे Windows 2000 पासून सुरू होणाऱ्या सर्व NT लाइन ऑपरेटिंग सिस्टिममध्ये असते. ही NTOSKRNL.EXE फाइलचा भाग आहे आणि BOOT.INI मध्ये ऑपरेटिंग सिस्टमसाठी "/Debug" पर्याय सेट करून सक्षम करता येते. या डीबगरला शून्य मोडेम कनेक्शन आणि त्याच OS सह दुसरा संगणक आवश्यक आहे.

मायक्रोसॉफ्टकडून आणखी एक कर्नल डीबगर आहे - WinDBG. काटेकोरपणे सांगायचे तर, हा कर्नल डीबगर नाही, परंतु एक हायब्रिड डीबगर आहे जो वापरकर्ता-स्तरीय अनुप्रयोग डीबग करण्यासाठी देखील वापरला जाऊ शकतो. हे, कर्नलमध्ये तयार केलेल्या डीबगरच्या विपरीत, ग्राफिकल शेल आहे, आणि म्हणून वापरण्यास सोपे आहे. हा डीबगर काही डीबगिंग कार्यांसाठी उपयुक्त ठरू शकणाऱ्या विशेष विस्तारांना देखील समर्थन देतो. परंतु कर्नल डीबग करण्यासाठी दोन संगणक देखील आवश्यक आहेत.

तथापि, एक कर्नल डीबगर आहे जो एकाच संगणकावर डीबग करू शकतो. हे SoftIce आहे. त्याच वेळी, SoftIce अनुप्रयोग प्रोग्राम डीबग देखील करू शकते. वापरकर्ता प्रोग्रामसाठी या डीबगरचा वापर न्याय्य आहे, उदाहरणार्थ, सिस्टम टाइमरशी बद्ध रिअल-टाइम सिस्टम डीबग करण्याच्या बाबतीत. आपण नियमित डीबगर वापरून डीबग केल्यास, प्रोग्राम योग्यरित्या चालत असला तरीही परिणाम चुकीचा असू शकतो आणि SoftIce प्रोग्राम आणि टाइमर दोन्ही थांबवेल. मल्टी-थ्रेडेड ऍप्लिकेशन्स डीबग करताना हे उपयुक्त आहे. याव्यतिरिक्त, SoftIce कडे सिस्टीममधील सर्व थ्रेड्सबद्दल, मल्टी-थ्रेडेड ऍप्लिकेशन्ससाठी थ्रेड सिंक्रोनाइझेशनबद्दल, हँडल्सबद्दल माहिती प्रदर्शित करण्याचे खूप, अतिशय विकसित माध्यम आहे... या डीबगरचा एकमेव तोटा म्हणजे ऍप्लिकेशन प्रोग्रामरसाठी त्याची जटिलता आहे. परंतु कर्नल डीबगर्सपैकी हे सर्वात सोपे आणि प्रभावी आहे.


सर्वात उत्सुक साठी

आता, अर्थातच, विंडोज ऍप्लिकेशन्ससाठी डीबगर्सबद्दल बोलणे दहा वर्षांपूर्वी इतके संबंधित नाही. संपूर्ण जगाला इंटरनेटमध्ये रस निर्माण झाला आणि सॉफ्टआयसचे मुख्य वापरकर्ते फटाके होते, चाचेगिरीच्या क्षेत्रात अथक कामगार होते. तथापि, ते इतके वाईट नाही. SoftIce सह संप्रेषण निःसंशयपणे संगणक ज्ञानाच्या दृष्टीने एखाद्या व्यक्तीचा विकास करतो, जरी, अर्थातच, जर आपण केवळ डीबगरशी संवाद साधला आणि वास्तविक लोकांशी संवाद साधला नाही तर काही दुष्परिणाम शक्य आहेत, मला वाटते की प्रत्येकजण याबद्दल आधीच अंदाज लावतो.

डीबगर हे काही सर्वात विशिष्ट प्रकारचे सॉफ्टवेअर आहेत, परंतु विकासाच्या दृष्टीने, अगदी वापरकर्ता-स्तरीय प्रोग्राम डीबगर खूप जटिल आहेत. परंतु, तरीही, तुमचा स्वतःचा डीबगर विकसित करण्याची तुमची इच्छा आणि वेळ असल्यास, ऑपरेटिंग सिस्टम आणि प्रोग्रामिंग क्षेत्रातील तुमचे ज्ञान लक्षणीय वाढेल, याचा अर्थ तुम्हाला चांगली पगाराची नोकरी मिळण्याची शक्यता वाढेल.

म्हणून, जर तुम्हाला तुमचा स्वतःचा डीबगर तयार करायचा असेल, तर तुम्ही प्रथम या विषयावरील साहित्य वाचले पाहिजे. माझ्या मते, सुरुवात करण्यासाठी सर्वोत्कृष्ट पुस्तक म्हणजे जॉन रॉबिन्सचे पुस्तक, डीबगिंग विंडोज ऍप्लिकेशन्स. हे आधीच जुने आहे, 2001 मध्ये प्रकाशित झाले होते, परंतु त्यात असलेली माहिती आजही संबंधित आहे, कारण ती सामान्य, अगदी काही प्रकारे मूलभूत स्वरूपाची आहे. या पुस्तकात विंडोजसाठी डीबगर लिहिण्याची उदाहरणे आहेत, आणि तुम्ही C++ मध्ये प्रोग्राम करत असल्यास आणि अपवाद हाताळणी अधिक चांगल्या प्रकारे समजून घेऊ इच्छित असल्यास ते उपयुक्त ठरेल. वास्तविक, या पुस्तकातूनच मी लेखात सादर केलेल्या डीबगरची माहिती शिकलो. जर तुम्हाला हे पुस्तक सापडत नसेल (अखेर, ते आधीच खूप जुने आहे), असे बरेच पत्ते आहेत जे तुमच्यासाठी उपयुक्त असू शकतात. पहिला असा आहे: www.xakep.ru/post/19158/default.asp. हॅकर मॅगझिनचा हा लेख माझ्यापेक्षा कर्नल डीबगरबद्दल थोडे अधिक तपशील देतो आणि त्यात साध्या डीबगरसाठी कोड देखील आहे. आणि kalashnikoff.ru/Assembler/issues/016.htm वर तुम्ही DOS डीबगर कसे लिहायचे ते शिकू शकता. परंतु, अर्थातच, MSDN वाचणे आणि त्याच वेळी ते समजून घेण्यासाठी काही ओपन सोर्स डीबगर शोधणे चांगले आहे. आणि, अर्थातच, जर तुम्ही डीबगर लिहायला घेतले असेल, तर या कठीण कामात तुम्हाला यश मिळेल!

कर्नल डीबग करण्यासाठी, तुम्हाला नल मोडेम केबल किंवा मॉडेम कनेक्शन वापरून तुमच्या संगणकाशी जोडणे आवश्यक आहे. डीबगिंग करत असलेल्या संगणकाला "होस्ट" म्हटले जाईल आणि समस्या असलेल्या संगणकास "लक्ष्य" म्हटले जाईल.

दोन्ही संगणक Windows ची समान आवृत्ती चालवत असले पाहिजेत आणि लक्ष्य संगणकासाठी प्रतीक फायली होस्ट संगणकावर स्थापित केल्या पाहिजेत. Support\Debug निर्देशिकेत Windows इंस्टॉलेशन CD वर सिम्बॉल फाइल्स पुरवल्या जातात.

डीबगिंग सक्षम करण्यासाठी, तुम्हाला लक्ष्य संगणकावरील BOOT.INI फाइलमध्ये बदल करणे आवश्यक आहे.

1. BOOT.INI फाइलचे गुणधर्म बदला:

attrib c:\boot.ini –r –s

2. ही फाईल संपादित करा आणि ओळीत विंडोज स्टार्टअप/debug पॅरामीटर जोडा (सिस्टमला बूट करायला सांगण्यासाठी रॅमकर्नल डीबगर विंडोज बूट). अतिरिक्त पॅरामीटर्स/Debugport आहेत, जे सिस्टमला सांगते जे COM पोर्टडेटा ट्रान्सफर रेट निर्दिष्ट करण्यासाठी (डीफॉल्टनुसार COM2) आणि /Baudrate वापरणे आवश्यक आहे (डीफॉल्ट 19200 बॉड आहे, परंतु 9600 वापरणे चांगले आहे). उदाहरणार्थ:


मल्टी(0)डिस्क(0)आरडिस्क(0)विभाजन(0)\WINDOWS="Windows NT" /debug /debugport=com2 /baudrate=9600

3. फाईल सेव्ह करा.

4. BOOT.INI फाइलचे पूर्वीचे गुणधर्म सेट करा:

attrib c:\boot.ini +r +s

IN या उदाहरणातलक्ष्य संगणकाने COM2 पोर्टद्वारे 9600 bps वर कनेक्शनला परवानगी दिली.

होस्ट संगणक डीबगिंगसाठी आवश्यक सेटिंग्जसह कॉन्फिगर केलेला असणे आवश्यक आहे. याव्यतिरिक्त, चिन्ह फाइल्स स्थापित करणे आवश्यक आहे. ते स्थापित करण्यासाठी, इंस्टॉलेशन सीडीवरील \support\debug निर्देशिकेवर जा आणि खालील आदेश प्रविष्ट करा:

expndsym : <целевой диск и каталог>

उदाहरणार्थ:

expndsym f: d:\symbols

इंस्टॉलेशनला काही वेळ लागू शकतो. लक्षात ठेवा की जर टार्गेट कॉम्प्युटरवर सर्व्हिस पॅक इन्स्टॉल केले असतील, तर त्या पॅकेजेसच्या सिम्बॉल फाइल्स होस्ट कॉम्प्युटरवरही इन्स्टॉल केल्या पाहिजेत. अद्यतन पॅकेजेससाठी प्रतीक फाइल्स Microsoft वेबसाइटवरून डाउनलोड केल्या जाऊ शकतात.

पुढील टप्पा सेटअप आहे पर्यावरणीय चल, डीबगिंगसाठी आवश्यक, उदाहरणार्थ, चिन्ह फायलींचे स्थान दर्शविणारे चल इ. या चलांचे वर्णन खालीलप्रमाणे आहे.

सिस्टम व्हेरिएबल्सचे वर्णन

या व्हेरिएबल्सची व्याख्या प्रत्येक बूटवर संबंधित आज्ञा प्रविष्ट करणे टाळण्यासाठी बॅच फाइलमध्ये ठेवता येते:

प्रतिध्वनी बंद
set_nt_debug_port=com2
set_nt_debug_baud_rate=9600
_nt_symbol_path=d:\symbols\i386 सेट करा
_nt_log_file_open=d:\debug\logs\debug.log सेट करा

आता आपल्याला कॉपी करणे आवश्यक आहे सॉफ्टवेअरकर्नल डीबग करणे, जे support\debug\ निर्देशिकेत स्थित आहे<процессор>इन्स्टॉलेशन CD वर (support\debug\I386). सर्वात सोपा मार्ग म्हणजे संपूर्ण निर्देशिका कॉपी करणे, कारण ती आकाराने लहान आहे (सुमारे 2.5 MB). I386 प्लॅटफॉर्मसाठी, एक डीबगर वापरला जातो, जो I386KD.EXE फाइल म्हणून पुरवला जातो. डीबगर I386KD कमांड वापरून लाँच केले आहे. आदेश प्रविष्ट करण्यासाठी, की संयोजन दाबा आणि प्रॉम्प्ट दिसण्याची प्रतीक्षा करा कमांड लाइन kd>.

chPF OELPFPTSCHE KHLBBOYS RP TBVPFE U PFMBDLPK SDTB U BCHBTYKOSHNY DBNRBNY RBNSFY. lBL RTBCHYMP, CHBN OHTSOP VKDEF ЪBDBFSH PDOP YЪ KHUFTPKUFCH RPDLBYULY, RETEYUYUMEOOSCHI CH ZHBKME /etc/fstab . uvtpu pvtbpch RBNSFY O KHUFTPKUFCHB, OE SCHMSAEYEUS KHUFTPKUFCHBNY RPDLBYULY, OBRTYNET, MEOFSHCH, CH DBOOSCHK NPNEOF OE RPDDETSYCHBAFUS.

टीप: yURPMSHHKFE LPNBODH डम्पन (8) DMS KHLBBOYS SDTH NEUFB, ZDE OHTsOP UPITBOSFSH BCHBTYKOSHCHE DBNRSCH. rPUME OBUFTPKLY RP LPNBODE स्वपन (८) TBDEMB RPDLBYULY DPMTSOB VSHFSH CHSHCHBOB RTPZTBNNNB डम्पन. pVSHYUOP LFP CHSHRPMOSEPHUS ЪBDBOYEN RETENOOOPK डंपदेव CH ZHBKME rc.conf (५). eumy ЪБДBOB ьФБ RATENEOBS, FP RPUME UVPS RTY RETCHPK NOPZPRPMSHЪPCHBFEMSHULPK RETEЪBZTHЪLE VHDEF BCHFPNBFYUEULY ЪBRHEEOOB RTPNBZTBZT सेव्हकोर (8). pOB UPITBOIF BCHBTYKOSHCHK DBNR SDTB CH LBFBMPZ, ЪBDBOOSCHK CH RETENEOOOPK डंपडीर ZHBKMB rc.conf . rP KHNPMYUBOYA LBFBMPZPN DMS BCHBTYKOSHI DBNRPCH SCHMSEFUS /var/crash .

mYVP CHSC NPTSEFE ЪBDBFSH KHUFTPKUFCHP DMS UVTPUB PVTBB RBNSFY SCHOP YUETE RBTBNEFT डंप CH UFTPLE कॉन्फिगरेशन LPOZHYZHTBGYPOOPZP ZHBKMB CHBYEZPS fBLPK URPUPV YURPMSHЪPCHBFSH OE TELPNEODHEFUS Y द्वारे DPMTSEO YURPMSHЪPCHBFSHUS, FPMSHLP EUMY CHSCH IPFYFE RPMKHYUBFSH BCHBTYKOSHCH PVTBSCH RBNSBCHBCHBTЪBCHBFYSFY PA TBVPFH RTY ЪBZTHЪLE.

टीप: dBMEE FETNYO gdb PYOBYUBEF PFMBDYUYL gdb , ЪBRHEEOOSCHK CH ``TETSINE PFMBDLY SDTB". RETEIPD CH LFPF TETSYN DPUFYZBEFUS ЪBRHULPN gdb U RBTBNEFTPN -k . h TETSYNE PFMBDLY SDTB gdb YЪNEOSEF UCHPЈ RTYZMBYEOYE बद्दल (kgdb) .

टीप: eUMY CHSH YURPMSHJHEFE FreeBSD CHETUYY 3 YMY VPMEE TBOOAA, CHCH DPMTSOSCH CHSHRPMOYFSH HUEYEOYE PFMBDPUOPZP SDTB LPNBODPK स्ट्रिप, B OE KHUFBOBCHMYCHMBPHPDFPDFPDFPDFPYP पट्टी

# cp kernel kernel.debug # strip -g कर्नल

bFPF YBZ OE FBL KhTS Y OEPVIPDYN, OP TELPNEODKHEN. (PH FreeBSD 4 था VPMEE TEMYYBI LFPF YBZ CHSPRMOSEFUS BCHFPNBFYUEULY CH LPOGE RTPGEUUB RPUFTPEOOYS SDTB मेक .) lPZDB SDTP HUEYEOP, BCHFPNBFYPYCHMYPYCHMYCH PTSEFE KHUFBOPCHYFSH EZP PVSHCHYUOSCHN PVTBBPN, OVTTBCH स्थापित करा.

ъBNEFSHFE, YuFP CH UFBTSHCHETUISI FreeBSD (DP 3.1, OE CHLMAYUBS LFPF TEMY), YURPMSHHEFUS SDTB CH ZHTNBFE a.out, RPFPNH YI FBVMYGSH UYNCHPMPCHPUCHBPSFBPSFBPSHBPShu . u VPMSHYPK FBVMYGEK UYNCHPMPCH CH OE HUEYOOOPN PFMBDPUOPN SDTE LFP YЪMYYOSS FTBFB. rPUMEDOYE TEMYYSH FreeBSD YURPMSHJHAF SDTB CH ZHTNBFE ELF, ZHE LFP OE SCHMSEFUS RTPVMENPK.

eUMY CHCH FEUFYTHEFE OPChPE SDTP, ULBTSEN, OBVYTBS YNS OPCHPZP SDTB CH RTYZMBYYE OYBZTHYUYLB, OP CHBN OHTSOP ЪBZTHTSBFSH Y TBVPFBFZPNSHU, DBVPTHBFSCHUD BMSHOPNH ZHOLGYPOYTPCHBOYA, ЪBZTHTSBKFE EZP FPMSHLP CH PDOPRPMSHЪPCHBFEMSHULPN TETSYNE RTY RPNPEY ZHMBZB -s , KHLBSCCHBENPZP RTY ЪБЪЗLEХ B ЪBFEN CHSHRPMOYFE FBLYE YBZY:

# fsck -p # mount -a -t ufs # त्यामुळे /var/crash साठी तुमची फाइल प्रणाली लिहिण्यायोग्य आहे # savecore -N /kernel.panicked /var/crash # exit # ... बहु-वापरकर्त्यासाठी

bFB RPUMEDPCHBFEMSHOPUFSH KHLBSCCHBEF RTPZTBNNE सेव्हकोर (8) YURPMSHЪPCHBOYE DTHZPZP SDTB DMS YЪCHMEYUEOYS UYNCHPMYUEULYI YNEO बद्दल. YOBYUE POB VKhDEF YURPMSHЪPCHBFSH SDTP, TBVPFBAEE CH DBOOSHK NPNEOF Y, ULPTEE CHUEZP, OYUEZP OE UDEMBEF, RPFPNH YuFP BCHBTYKOSHCHB PVFYBSHK PVFYBCHBSHK .

b FERETSH, RPUME UVTPUB BCHBTYKOPZP DBNRB, RETEKDYFE CH LBFBMPZ /sys/compile/WHATEVER Y ЪBRKHUFYFE LPNBODH gdb -k . yЪ RTPZTBNNSH gdb UDEMBKFE CHPF SFP:

Symbol-file kernel.debug exec-file /var/crash/kernel.0 core-file /var/crash/vmcore.0 Y CHBMS - CHCH NPTSEFE PFMBTSYCHBFSH BCHBTYKOSHK DBNR, YURPMSHЪHS YUIPDOSCHUBCHFLUBSHFE P D EMBEFE AT MAVPC DTHZPK RTPZTBNNPK.

chPF TsKHTOBM LPNBOD UEBOUB TBVPFSH gdb, YMMAUFTYTHAEIK bfh RTPGEDHTH. dMYOOSCH UFTPLY VSHMY TBPTCHBOSH DMS KHMHYUYEOYS YUYFBVEMSHOPUFY Y DMS KHDPVUFCHB UFPLY VSHCHMY RTPOKHNETPCHBOSHCH. CHUE PUFBMSHOPE SCHMSEFUS FTBUUYTPCHLPK PYYVLY, TEBMSOP CHPOYLOKHCHYEK PE CHTENS TBVPFSCH OBD DTBKCHETPN LPOUPMY pcvt.

1:शुक्र 30 डिसेंबर 23:15:22 1994 रोजी स्क्रिप्ट सुरू झाली 2: # cd /sys/compile/URIAH 3: # gdb -k kernel /var/crash/vmcore.1 4: /usr/src/ वरून चिन्ह डेटा वाचणे sys/compile/URIAH/kernel ...पूर्ण. 5:IdlePTD 1f3000 6:घाबरू: कारण तू म्हणालास! 7:वर्तमान pcb 1e3f70 8: ../../i386/i386/machdep.c... साठी चिन्हांमध्ये वाचन. 9: (kgdb) जेथे 10:#0 बूट (arghowto=256) (../../i386/i386/machdep.c लाइन 767) 11:#1 0xf0115159 घाबरून () 12:#2 0xf01955 die in ). 0 xf0101711in db_command_loop () 16:#6 0xf01040a0 in db_trap () 17:#7 0xf0192976 in kdb_trap (12, 0, -272630436, -266743723) 18:#f_19d (trf_19d... trap_pfault मध्ये xf 019ce60 (...) 20:#10 0xf019cb2f सापळ्यात (...) 21:#11 0xf01932a1 अपवादात:calltrap () 22:#12 0xf0191503 cnopen मध्ये (...) 23:#13 0xf0132c2c24en (sp344) मध्ये : #14 0xf012d014 in vn_open () 25:#15 0xf012a183 उघडे () 26:#16 0xf019d4eb in syscall (...) 27: (kgdb) 10 28: ./6 साठी चिन्हांमध्ये वाचन./6. i386 /trap.c...पूर्ण. 29:#10 0xf019cb2f इन ट्रॅप (फ्रेम=(tf_es = -260440048, tf_ds = 16, tf_\ 30:edi = 3072, tf_esi = -266445372, tf_ebp = -2626,2630 = 262630 = 262630 , tf_ebx = - 266427884, tf_edx = 12, tf_ecx = -266427884, tf\ 32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eipcs = -36_36, tf_eipcs = -326 = 326, 68, tf_eflags = 66066, tf_esp = 3072 , tf_\ 34:ss = -266427884)) (../../i386/i386/trap.c ओळ 283) 35:283 (void) trap_pfault(&frame, FALSE); 36: (kgdb) फ्रेम फ्रेम->tf_ebp फ्रेम->tf_eip 37: ../../i386/isa/pcvt/pcvt_drv.c... साठी चिन्हांमध्ये वाचणे पूर्ण झाले. pcopen मध्ये 38:#0 0xf01ae729 (dev=3072, flag=3, mode=8192, p=(struct p\ 39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c लाइन 403) 40:403 रिटर्न (*linesw.l_open)(dev, tp)); 41: (kgdb) यादी 42:398 43:399 tp->t_state |= TS_CARR_ON; 44:400 tp->t_cflag |= CLOCAL; /* मोडेम असू शकत नाही (:-) */ 45:401 46:402 #if PCVT_NETBSD || (PCVT_FREEBSD >= 200) 47:403 परतावा (*linesw.l_open)(dev, tp)); 48:404 #else 49:405 रिटर्न ((*linesw.l_open)(dev, tp, flag)); 50:406 #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */ 51:407 ) 52: (kgdb) प्रिंट tp 53: ../../i386/i386/cons.c... साठी चिन्हांमध्ये वाचन पूर्ण झाले. 54:$1 = (स्ट्रक्चर tty *) 0x1bae 55: (kgdb) प्रिंट tp->t_line 56:$2 = 1767990816 57: (kgdb) अप 58:#1 0xf0191503 cnopen मध्ये (dev=0x000001503=0x000003=000003=000003=0000003 , p=(st\ 59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c ओळ 126) 60: परतावा ((*cdevsw.d_open)(dev, flag, mode, p) ); 61: (kgdb) वर 62:#2 0xf0132c34 spec_open मध्ये () 63: (kgdb) वर 64:#3 0xf012d014 vn_open () 65: (kgdb) वर 66:#4 0xf012d012 (ओपन) (ओपन) syscall मध्ये 68:#5 0xf019d4eb (फ्रेम=(tf_es = 39, tf_ds = 39, tf_edi =\ 69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_isp = 270, tf_isp = 270, tf_78 ६, tf_edx = 1, tf_ecx = 0, tf_eax = 5, tf_trapno = 582, \71:tf_err = 582, tf_eip = 75749, tf_cs = 31, tf_eflags = 582, tf_ess - 2 = 4 (tf_ess - 4 = 72, 4 = 723) ./../i386/i386/trap.c लाइन 673) 73:673 त्रुटी = (*कॉलप->sy_call)(p, args, rval); 74: (kgdb) अप 75: प्रारंभिक फ्रेम निवडली; तुम्ही वर जाऊ शकत नाही. 76: (kgdb) सोडा 77: # निर्गमन 78: निर्गमन 79: 80: स्क्रिप्ट शुक्रवार 30 डिसेंबर 23:18:04 1994 रोजी पूर्ण झाली

lPNNEOFBTYY L CHSHYERTYCHEDOOPNH TSHTOBMKH:

UFTPLB 6:

ьФП DBNR, CHSFSHCHK RTY RPNPEY DDB (UNPFTY OITSE), RPPFPNH LPNNEOFBTYK L BCHBTYKOPNH PUFBOPCHH YNEEF YNEOOP CHYD ``कारण तू म्हणालास! PDOBLP YOBYUBMSHOPK RTYYUYOPK RETEIPDB CH DDB VSHMB BCHBTYKOBS PUFBOPCHLB RTY CHPOYLOPCHEOYA PYYVLY UFTBOIGSC RBNSFY.

UFTPLB 20:

lFP NEUFPOBIPTSDEOOYE ZHKHOLGYY ट्रॅप() CH FTBUUYTPCHLE UFELB.

UFTPLB 36:

rTYOKHDIFEMSHOPE YURPMSHЪPCHBOIE OPChPK ZTBOYGSCH UFELB; FERTSH LFP OE OHTSOP. rTEDRPMBZBEFUS, YuFP ZTBOYGSCH UFELB KHLBSCCHBAF RTBCHYMSHOP TBURPMPTSEOYE बद्दल, DBCE CH UMHUBE BCHBTYKOPZP PUFBOPCHB. zMSDS UFTPLH YUIPDOPZP LPDB 403 बद्दल, NPTsOP ULBBFSH, YuFP CHEUSHNB CHETPSFOP, YuFP MYVP CHYOPCHBF DPUFHR RP KHLBBFEMA ``tp"", MYVP VSHM.

UFTPLB 52:

rPIPTSE, YuFP CHYOPCHBF KHLBBFEMSH, OP ऑन SCHMSEFUS DPRKHUFYNSCHN BDTEUPN.

UFTPLB 56:

pDOBLP, PYUECHYDOP, NHUPT बद्दल KHLBSCCHBEF वर UFP, FBL UFP NSCH OBYMY OBYKH PYYVLH! (DMS FEI, LFP OE OBLPN U LFPC YUBUFSHHA LPDB: tp->t_line UMHTSYF DMS ITBOEOYS TETSYNB LBOBMSB LPOUPMSHOPZP HUFTPKUFCHB, Y LFP DPMTSOP VShPUBFPUMPYPYPYMY )

कर्नल मोड डीबगर सीपीयू आणि ऑपरेटिंग सिस्टममध्ये बसतात. याचा अर्थ असा की जेव्हा तुम्ही कर्नल मोड डीबगर थांबवता, तेव्हा ऑपरेटिंग सिस्टम देखील पूर्णपणे थांबते. तुम्ही टायमर आणि वेळेच्या समस्यांवर काम करत असताना ऑपरेटिंग सिस्टमला हार्ड स्टॉपवर आणणे उपयुक्त आहे हे पाहणे सोपे आहे. तथापि, एका डीबगरचा अपवाद वगळता, ज्याची खाली चर्चा केली जाईल (या प्रकरणाच्या "सॉफ्टलसीई डीबगर" विभागात), तुम्ही कर्नल-मोड डीबगर वापरून वापरकर्ता-मोड कोड डीबग करू शकत नाही.

बरेच कर्नल मोड डीबगर नाहीत. त्यापैकी काही येथे आहेत: Windows 80386 डीबगर (WDEB386), Kernel Debugger (1386KD), WinDBG आणि SoftlCE. यातील प्रत्येक डीबगरचे थोडक्यात वर्णन खालील विभागांमध्ये केले आहे.

डीबगर WDBEB386

WDEB386 एक मोड डीबगर आहे विंडोज कर्नल 98, प्लॅटफॉर्म SDK चा भाग म्हणून वितरीत केले. हे डीबगर केवळ व्हर्च्युअल ड्रायव्हर्स लिहिणाऱ्या विकसकांसाठी उपयुक्त आहे. विंडोज उपकरणे 98 (VxD). विंडोज ऑपरेटिंग सिस्टीमसाठी बऱ्याच कर्नल मोड डीबगर प्रमाणे, WDEB386 डीबगरला चालण्यासाठी दोन मशीनची आवश्यकता असते आणि शून्य मोडेम केबल. दोन मशीनची आवश्यकता आहे कारण लक्ष्य मशीनवर चालणाऱ्या डीबगरच्या भागाला त्याच्या हार्डवेअरमध्ये मर्यादित प्रवेश आहे, त्यामुळे ते त्याचे आउटपुट इतर मशीनला पाठवते आणि आदेश प्राप्त करते.

WDEB386 डीबगरचा एक मनोरंजक इतिहास आहे. हे विंडोज 3.0 च्या काळात मायक्रोसॉफ्टसाठी अंतर्गत पार्श्वभूमी साधन म्हणून सुरू झाले. ते वापरणे कठीण होते आणि डीबगिंगसाठी पुरेसे समर्थन नव्हते मूळ सांकेतिक शब्दकोशआणि इतर छान गुणधर्म जे व्हिज्युअल C++ आणि व्हिज्युअल बेसिक डीबगर्सनी आम्हाला खराब केले.

डॉट (DOT) कमांड्स हे WDEB386 चे सर्वात महत्वाचे वैशिष्ट्य आहे. इंटरप्ट INT 41 द्वारे, WDEB386 कमांड जोडण्यासाठी विस्तारित केले जाऊ शकते. ही एक्स्टेंसिबिलिटी VxD ड्रायव्हर लेखकांना सानुकूल डीबगिंग आदेश तयार करण्यास अनुमती देते जे त्यांना त्यांच्या आभासी उपकरणांमधील माहितीमध्ये सहज प्रवेश देते. Windows 98 ची डीबग आवृत्ती अनेक DOT आदेशांना समर्थन देते जे तुम्हाला डीबगिंग प्रक्रियेच्या कोणत्याही टप्प्यावर ऑपरेटिंग सिस्टमची अचूक स्थिती पाहण्याची परवानगी देतात.

डीबगर I386KD

Windows 2000 Windows 98 पेक्षा वेगळे आहे कारण कर्नल मोड डीबगरचा वास्तविक कार्यरत भाग NTOSKRNL भाग आहे. EXE - मुख्य ऑपरेटिंग कर्नलची फाइल विंडोज प्रणाली 2000. हा डीबगर विनामूल्य (रिलीझ) आणि चाचणी केलेल्या (डीबग) ऑपरेटिंग सिस्टम कॉन्फिगरेशनमध्ये उपलब्ध आहे. कर्नल मोड डीबगिंग सक्षम करण्यासाठी, बूटलोडर पर्याय /DEBUG BOOT वर सेट करा. INI आणि याव्यतिरिक्त, बूटलोडर पर्याय /DEBUGPORT, जर तुम्हाला कर्नल मोड डीबगर कम्युनिकेशन पोर्ट डीफॉल्ट (COM1) व्यतिरिक्त मूल्यावर सेट करायचे असेल. I386KD स्वतःच्या मशीनवर चालते आणि त्याच्याशी संवाद साधते विंडोज मशीनएक शून्य मोडेम केबल द्वारे 2000.

कर्नल मोड डीबगर NTOSKRNL. EXE फक्त CPU नियंत्रित करण्यासाठी पुरेसे आहे जेणेकरून ऑपरेटिंग सिस्टम डीबग केली जाऊ शकते. बहुतेक डीबगिंग काम - प्रतीक प्रक्रिया, विस्तारित ब्रेकपॉइंट आणि डिससेम्ब्ली - 1386KD बाजूने केले जाते. एक विंडोज वेळ NT 4 डिव्हाइस ड्रायव्हर किट (DDK) ने शून्य मोडेम केबलमध्ये वापरलेल्या प्रोटोकॉलचे दस्तऐवजीकरण केले आहे. तथापि, मायक्रोसॉफ्ट यापुढे त्याचे दस्तऐवजीकरण करत नाही.

1386KD ची शक्ती स्पष्ट आहे जेव्हा तुम्ही अंतर्गत प्रवेश करण्यासाठी ऑफर करत असलेल्या सर्व आज्ञा पाहता विंडोज स्थिती 2000. विंडोज 2000 मध्ये डिव्हाइस ड्रायव्हर्स कसे कार्य करतात याचे ज्ञान प्रोग्रामरला अनेक कमांड्सच्या आउटपुटचे निरीक्षण करण्यात मदत करेल. त्याची सर्व शक्ती असूनही, i386KD जवळजवळ कधीही वापरला जात नाही कारण तो एक कन्सोल अनुप्रयोग आहे, जो बेसलाइन डीबगिंगसाठी वापरणे खूप कंटाळवाणे आहे.