Cum funcționează depanatorul nucleului sistemului de operare. Cum funcționează depanatorul Windows 7 modul de depanare a nucleului timp de execuție

Introducere

1. Tipuri de depanatoare Windows

2. Depanatoare în modul utilizator

3. Depanare în modul Kernel

3.1 Depanator WDEB386

3.2 Depanator I386KD

3.3 Win DBG Debugger

3.4 SoftICE Debugger

4. Intrebare generala depanare

5. Pornire automată aplicații în depanator

5.1 Întreruperea tastelor de comandă rapidă

Concluzie

Literatură

Introducere

A învăța cum funcționează instrumentele software este cea mai dificilă parte a procesului de depanare. Numai înțelegând capacitățile și limitările instrumentelor, puteți profita mai mult de ele și puteți petrece mai puțin timp depanând. În general, depanatoarele sunt extrem de utile, dar pot duce la probleme destul de subtile care conduc programatorul într-o fundătură. Acest capitol arată ce este un depanator și cum funcționează diferitele depanatoare pe sistemele de operare Win32 (sistemele de operare Windows pe 32 de biți ale Microsoft).

În același timp, ne vom concentra asupra acelor proprietăți speciale ale depanatoarelor în general, care sunt activate atunci când un proces software rulează sub controlul acestuia din urmă. De asemenea, explică cum puteți îmbunătăți anumite caracteristici ale sistemelor de operare Windows pe 32 de biți pentru a ușura depanarea. Vor fi prezentate două programe de depanare proprietare, al căror cod sursă poate fi găsit pe CD-ul însoțitor. Primul (MinDBG) are capacități suficiente pentru a fi numit depanator. Al doilea (WDBG) este un exemplu de depanare Microsoft Windows, care face aproape tot ceea ce face un depanator de sistem real, inclusiv manipularea tabelelor de simboluri, gestionarea punctelor de întrerupere, generarea de cod de dezasamblare și coordonarea cu interfața grafică cu utilizatorul (GUI). Când discutăm despre WDBG, vom arăta cum funcționează punctele de întrerupere și vom discuta care sunt diferitele fișiere de simbol.

Înainte de a trece la materialul principal al acestui capitol, să definim doi termeni standard care vor fi folosiți frecvent în această carte: depanator principal (sau de bază) (depanator) și depanator subordonat (depanator). În termeni simpli, un depanator principal este un proces care poate controla un alt proces, iar un depanator slave este un proces care rulează sub depanatorul principal. Pe unele sisteme de operare, depanatorul principal este numit proces părinte, iar depanatorul slave este numit proces copil.

Debugger (depanator, depanator englez de la bug) - program de calculator, conceput pentru a găsi erori în alte programe, nuclee ale sistemului de operare, interogări SQL și alte tipuri de cod. Depanatorul vă permite să urmăriți, să monitorizați, să setați sau să modificați valorile variabile pe măsură ce codul rulează, să setați și să eliminați punctele de întrerupere sau condițiile de oprire și multe altele.

Majoritatea dezvoltatorilor sunt mai familiarizați cu depanatoarele în modul utilizator. Nu este surprinzător, depanatoarele acestui mod sunt proiectate pentru depanarea aplicațiilor în modul utilizator. Un prim exemplu de depanator în modul utilizator este depanatorul Microsoft Visual C++. Depanatoarele în modul kernel, după cum sugerează și numele lor, sunt depanatoare care vă permit să depanați nucleul sistem de operare. Sunt folosite în primul rând de cei care scriu (și depanează, desigur) drivere de dispozitiv.

2. Depanatoare în modul utilizator

Depanatoarele în modul utilizator sunt concepute pentru a depana orice aplicație care rulează în modul utilizator, inclusiv orice programe GUI, precum și unele care nu sunt așa. aplicații regulate, precum serviciile Windows 2000. În general, depanatoarele de acest tip acceptă o interfață grafică de utilizator (GUI1). Semnul principal astfel de depanatoare - folosesc interfața de programare a aplicației de depanare Win32 (API-ul de depanare). Deoarece sistemul de operare marchează un depanator slave ca „rulând în mod special”, puteți utiliza funcția API IsDebuggerPresent pentru a afla dacă procesul dumneavoastră rulează sub un depanator.

Când se furnizează API-ul de depanare Win32, există o convenție implicită: odată ce un proces rulează sub API-ul de depanare (și astfel îl face un proces slave), depanatorul principal nu se poate detașa de acel proces. Această relație simbiotică înseamnă că, dacă depanatorul principal iese, depanatorul slave iese și el. Depanatorul principal este limitat la depanarea numai a depanatorului slave și a oricăror procese pe care le generează (dacă depanatorul principal acceptă procese copil).

GUI - Interfață grafică cu utilizatorul. - Per.

Pentru limbi interpretate și sisteme de rulare care utilizează mașină virtuală, mediul complet de depanare este furnizat de mașinile virtuale în sine și nu folosesc API-ul de depanare Win32. Câteva exemple ale acestor tipuri de medii sunt mașinile virtuale Java (JVM) de la Microsoft sau Sun, mediul de scripting pentru aplicații Web de la Microsoft și interpretul p-code din Microsoft Visual Basic.

sistemul de operare kernel de depanare

Vom ajunge la depanarea în Visual Basic în Capitolul 7, dar să știm că interfața P-code vizual Basic nu este documentat. Nu vom aprofunda în Java și interfețele de depanare a scripturilor; acele subiecte depășesc scopul acestei cărți. Pentru mai multe informații despre depanarea și crearea profilului Microsoft JVM, consultați Depanarea și crearea profilului aplicațiilor Java pe MSDN. Setul de astfel de interfețe este foarte bogat și variat și vă permite să controlați complet funcționarea JVM-ului. Pentru informații despre scrierea unui depanator de scripturi, consultați subiectul MSDN „Obiecte API de depanare a scripturilor active”. La fel ca JVM, obiectele de depanare a scripturilor oferă o interfață bogată pentru accesul la script și documentația.

Un număr surprinzător de programe utilizează API-ul de depanare Win32. Acestea includ: depanatorul Visual C++, care este tratat în detaliu în Capitolele 5 și 6; depanatorul Windows (WinDBG), care este discutat în secțiunea următoare (despre depanatorul în mod kernel); programul BoundsChecker de la Compuware NuMega; Programul Platform SDK HeapWalker; Platform SDK Depends program; Depanatoarele Borland Delphi și C++ Builder, precum și NT Symbolic Debugger (NTSD). Sunt sigur că mai sunt multe.

3. Depanare în modul Kernel

Depanatoarele modului Kernel se află între CPU și sistemul de operare. Aceasta înseamnă că atunci când opriți depanatorul modului kernel, sistemul de operare se oprește complet. Este ușor de observat că oprirea sistemului de operare este utilă atunci când lucrați la temporizatoare și probleme de sincronizare. Cu toate acestea, cu excepția unui depanator, care va fi discutat mai jos (în secțiunea „SoftlCE Debugger” a acestui capitol), nu puteți depana codul în modul utilizator folosind depanatoare în modul kernel.

Nu există multe depanatoare pentru modul kernel. Iată câteva dintre ele: Windows 80386 Debugger (WDEB386), Kernel Debugger (1386KD), WinDBG și SoftlCE. Fiecare dintre aceste programe de depanare este descrisă pe scurt în secțiunile următoare.

3.1 Depanator WDEB386

WDEB386 este un depanator Windows 98 pentru modul kernel distribuit ca parte a Platform SDK. Acest depanator este util doar pentru dezvoltatorii care scriu drivere dispozitive virtuale Windows 98 (VxD). La fel ca majoritatea depanatoarelor în modul kernel pentru sistemele de operare Windows, depanatorul WDEB386 necesită două mașini și un cablu de modem nul pentru a funcționa. Sunt necesare două mașini deoarece partea de depanare care rulează pe mașina țintă are acces limitat la hardware-ul său, astfel încât să-și trimită ieșirea și să primească comenzi de la cealaltă mașină.

Depanatorul WDEB386 are o istorie interesantă. A început ca un instrument intern de fundal pentru Microsoft în timpul erei Windows 3.0. Era greu de utilizat și nu avea suficient suport pentru depanare cod sursași alte proprietăți frumoase cu care depanatoarele Visual C++ și Visual Basic ne-au răsfățat.

Comenzile „Dot” (DOT) sunt cea mai importantă caracteristică a WDEB386. Prin întreruperea INT 41, WDEB386 poate fi extins pentru a adăuga comenzi. Această extensibilitate permite autorilor de drivere VxD să creeze comenzi personalizate de depanare care le oferă acces ușor la informații din dispozitivele lor virtuale. Versiunea de depanare a Windows 98 acceptă multe comenzi DOT care vă permit să observați starea exactă a sistemului de operare în orice moment al procesului de depanare.

3.2 Depanator I386KD

Windows 2000 diferă de Windows 98 prin aceea că partea de lucru reală a depanatorului modului kernel este partea NTOSKRNL. EXE - fișierul nucleului de operare principal sisteme Windows 2000. Acest depanator este disponibil atât în ​​configurații de sistem de operare gratuite (lansare), cât și testate (depanare). Pentru a activa depanarea în modul kernel, setați opțiunea bootloader /DEBUG la BOOT. INI și, în plus, opțiunea bootloader /DEBUGPORT, dacă trebuie să setați portul de comunicare al depanatorului în modul kernel la o altă valoare decât cea implicită (COM1). I386KD rulează pe propria sa mașină și comunică cu mașină Windows 2000 printr-un cablu de modem nul.

Depanator mod kernel NTOSKRNL. EXE face doar suficient pentru a controla CPU, astfel încât sistemul de operare să poată fi depanat. Majoritatea lucrărilor de depanare - procesarea simbolurilor, punctele de întrerupere extinse și dezasamblarea - se fac pe partea 1386KD. unu Ora Windows Kit-ul NT 4 Device Driver (DDK) a documentat protocolul utilizat în cablul modemului nul. Cu toate acestea, Microsoft nu o mai documentează.

Puterea lui 1386KD este evidentă când te uiți la toate comenzile pe care le oferă pentru a accesa Stare Windows 2000. Cunoașterea modului în care funcționează driverele de dispozitiv în Windows 2000 îl va ajuta pe programator să monitorizeze rezultatul multor comenzi. În ciuda puterii sale, i386KD nu este aproape niciodată folosit deoarece este o aplicație de consolă, care este foarte obositor de utilizat pentru depanarea liniei de bază.

3.3 Win DBG Debugger

WinDBG este un depanator care vine ca parte a Platform SDK. De asemenea, îl puteți descărca de pe #"897008.files/image001.gif">

Figura 1. Ieșirea programului GFLAGS. EXE

Lista 4-1. Exemplu de distrugere a heap-ului Windows 2000

void main(void)

HANDLE hHeap = HeapCreate (0, 128, 0);

// Alocați memorie pentru un bloc de 10 octeți.

LPVOID pMem = HeapAlloc(hHeap, 0,10);

// Scrieți 12 octeți într-un bloc de 10 octeți (heap overflow).

memset (pMem, OxAC,

// Alocați un nou bloc de 20 de octeți.

LPVOID pMem2 = HeapAlloc(hHeap, 0, 20);

// Scrieți 1 octet în al doilea bloc.

char * pUnder = (char *) ((DWORD) pMem2 - 1);

// Eliberează primul bloc. Acest apel la HeapFree va fi

// declanșează un punct de întrerupere în codul heap de depanare

// sistem de operare.

HeapFree(hHeap, 0, pMem);

// Eliberează al doilea bloc. Rețineți că acest apel nu va fi

// emite mesaje de eroare

HeapFree(hHeap, 0, pMem2);

// Eliberați blocul fals. Rețineți că acest apel nu va fi

// emite mesaje de eroare

Dacă bifați aceleași casete ca în Fig. 4.1 și repetați execuția HEAPER. EXE, veți obține următoarele rezultate, mai detaliate:

PAGEHEAP: procesul 0x490 a creat heap de depanare 00430000

(steaguri 0xl, 50, 25, 0, 0): procesul 0x490 a creat heap de depanare 00CF0000

(semnalează Oxl, 50, 25, 0, - 0): procesul 0x490 a creat heap de depanare 01600000

(semnalează Oxl, 50, 25, 0, 0): Corupție de umplere din coadă detectată: la 0x01606FF0size 0x0000000Asize 0x00000010at Ox01606FFA: Încercarea de a bloca de referință care nu este alocat

Conținutul listării este explicat prin numele steagurilor setate de panoul Global Flags.

Discutarea programului GFLAGS. EXE, vreau să subliniez o opțiune foarte utilă - Show Loader Snaps. Dacă bifați această casetă de validare și rulați aplicația, veți vedea ceea ce se numește un instantaneu al aplicației, care arată unde Windows 2000 încarcă fișierele DLL și cum începe să organizeze importul. Dacă trebuie să vedeți exact ce face încărcătorul Windows 2000 la încărcarea unei aplicații (mai ales dacă are o problemă), activarea acestei opțiuni poate fi un pas foarte util. Pentru mai multe informații despre instantaneele bootloaderului, consultați coloana „Under the Hood” a lui Matt Pietrek în numărul din septembrie 1999 al Microsoft Systems Journal.

5. Lansați automat aplicații în depanator

Cele mai dificile tipuri de aplicații de depanat sunt cele care sunt lansate printr-un alt proces. Această categorie este atacată Servicii Windows 2000 și servere COM out-of-process (servere COM out-of-process). Pentru a forța un depanator să se atașeze la un proces, în multe cazuri puteți utiliza funcția API DebugBreak. În două cazuri, însă, această funcție nu va funcționa. În primul rând, uneori nu funcționează cu serviciile Windows 2000. Dacă trebuie să depanați pornirea unui serviciu, apelarea DebugBreak va atașa depanatorul, dar până la pornirea depanatorului, este posibil ca serviciul să fi expirat și Windows 2000 se va opri aceasta. În al doilea rând, DebugBreak nu va funcționa atunci când trebuie să depanați un server COM în afara procesului. Dacă apelați DebugBreak, gestionarea erorilor COM va prinde excepția punctului de întrerupere și va termina serverul COM. Din fericire, Windows 2000 vă permite să specificați că aplicația trebuie să pornească în depanator. Această proprietate vă permite să începeți depanarea chiar de la prima instrucțiune. Cu toate acestea, înainte de a activa această proprietate pentru un serviciu Windows 2000, asigurați-vă că serviciul este configurat pentru a comunica cu lucrătorul Masa Windows 2000.

Proprietatea Run with Debugger poate fi activată în două moduri. Cel mai simplu este să rulați utilitarul GFLAGS. EXE și selectați butonul radio ImagineFişier Opțiuni(vezi Fig. 4.1). După introducerea în câmpul editabil I magFişierNume caseta de selectare a numelui fișierului binar al programului Depanator in grup Imagine DepanatorOpțiuni) și introduceți calea completă către depanator în câmpul editabil de lângă această casetă de selectare.

Mai mult calea grea: Trebuie să setați manual parametrii necesari în secțiunile de registry corespunzătoare (folosind editorul RegEdit). Sub_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NTXVersiunea curentă\Image Tile Execution Options

creați o subcheie al cărei nume este același cu numele de fișier al aplicației dvs. De exemplu, dacă numele aplicației este FOO. EXE, atunci numele subcheii de registry este, de asemenea, FOO. EXE. În această subcheie, creați un nou parametru șir numit Debugger. În caseta de dialog Modificare parametru șir Introduceți numele complet al fișierului (inclusiv calea directorului) al depanatorului la alegere folosind tastatura. Dacă ați specificat GFLAGS. EXE și setați câteva opțiuni globale, veți observa valoarea șirului GiobaiFiag în cheia de aplicație.

Acum, când porniți aplicația, depanatorul este încărcat și lansat automat. Opțiuni Linie de comanda pentru un depanator poate fi specificat și în parametrul șir Debugger (urmând numele programului debugger). De exemplu, pentru a utiliza depanatorul WinDBG și a iniția automat depanarea imediat ce WinDBG pornește, trebuie să introduceți valoarea d: \platform sdk\bin\windbg în caseta de dialog pentru modificarea parametrului șir de depanare. exe-g.

5.1 Întreruperea tastelor de comandă rapidă

Uneori trebuie să sari rapid în depanator. Dacă depanați aplicațiile de consolă, atunci apăsați tastele +sau +va arunca o excepție specială (numită DBG_CONTROL_C). Această excepție vă va duce direct la depanator și vă va permite să începeți depanarea.

O caracteristică utilă atât a Windows 2000, cât și a Windows NT 4 este posibilitatea de a comuta la depanator în orice moment, inclusiv în aplicațiile GUI. Când rulați sub depanator, apăsați tasta rezultă (în mod implicit) în apelarea funcției DebugBreak. Aspectul interesant al manipulării acestei taste este că, chiar dacă o utilizați ca accelerator sau gestionați în alt mod mesajele de la tastatură pentru această tastă, vă va conecta în continuare la depanator.

Pe Windows NT 4 scurtăturăîntrerupe atribuit implicit, dar în Windows 2000 puteți determina ce tastă să utilizați în aceste scopuri. De ce în secțiunea de registru

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug

Setați parametrul userDebuggerHotKey la codul cheii (VK_*). De exemplu, pentru a folosi cheia Pentru a vă conecta la depanator, ar trebui să setați valoarea UserDebuggerHotKey la 0x91. Modificările intră în vigoare după ce computerul este repornit.

Concluzie

Am analizat caracteristicile de bază ale depanării, tipurile și tipurile sale, problema generală a depanării, precum și erorile și modul de detectare a acestora.

Depanatoarele existente joacă un rol important în dezvoltarea software-ului atunci când caută erori logice, oferind o gamă largă de instrumente, inclusiv suport pentru codul sursă, urmărirea execuției aplicației, modificarea dinamică a memoriei etc. etc.


Literatură

1.. aspx?.aspx?id=553022>

2. https://ru. wikipedia.org/wiki/%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA

http://bourabai. kz/alg/debug4. htm

4. Kostyukhin K. - DEBUGARE SISTEME TIMP REAL. Revizuire

Termenul „depanare a nucleului” înseamnă examinarea structurii interne de date a nucleului și/sau urmărirea pas cu pas a funcțiilor din nucleu. Această depanare este o modalitate foarte utilă de a examina interiorul Dispozitive Windows, deoarece vă permite să afișați informațiile interne ale sistemului care nu sunt disponibile utilizând alte mijloace și oferă o imagine clară a progresului codului în nucleu.

Înainte de a lua în considerare diferite căi depanarea nucleului, haideți să explorăm setul de fișiere care vor fi necesare pentru a efectua orice fel de astfel de depanare.

Simboluri pentru depanarea nucleului

Fișierele cu simboluri conțin numele funcțiilor și variabilelor, precum și designul și formatul structurilor de date. Acestea sunt generate de programul linker și sunt folosite de depanatori pentru a face referire la aceste nume și pentru a le afișa în timpul unei sesiuni de depanare. Aceste informații nu sunt de obicei stocate în cod binar, deoarece nu sunt necesare atunci când codul este executat. Aceasta înseamnă că fără el, codul binar este mai mic și rulează mai repede. Dar asta înseamnă, de asemenea, că atunci când depanați, trebuie să vă asigurați că depanatorul are acces la fișierele simbol asociate cu imaginile binare la care se face referire în timpul sesiunii de depanare.

Pentru a utiliza orice instrument de depanare în modul kernel pentru a examina elementele interne ale structurii de date a nucleului Windows (lista de procese, blocuri de fire, lista de drivere încărcate, informații despre utilizarea memoriei etc.), aveți nevoie fișiere corecte simboluri și, cel puțin, fișierul de simbol pentru imaginea binară a nucleului - Ntoskrnl.exe. Fișierele tabelului de simboluri trebuie să se potrivească cu versiunea imaginii binare din care au fost extrase. De exemplu, dacă este instalat Pachetul Windows Service Pack sau un fel de patch care actualizează nucleul, trebuie să actualizați fișierele cu simboluri în consecință.

Descărcați și instalați simboluri pentru versiuni diferite Windows nu este dificil, dar actualizarea simbolurilor pentru corecții nu este întotdeauna posibilă. Cel mai simplu mod de a obține versiunea necesară a simbolurilor pentru depanare este să contactați serverul de simboluri Microsoft special conceput în acest scop, folosind sintaxa specială pentru calea simbolului specificată în depanator. De exemplu, următoarea cale de simbol face ca instrumentele de depanare să descarce simbolurile de pe un server de simboluri online și să stocheze o copie locală în c:\symbols:srv*c:\symbols*http://msdl.microsoft.com/download/ simboluri

Instrucțiuni detaliate pentru utilizarea serverului de simboluri pot fi găsite în fișierul de ajutor al instrumentelor de depanare sau online la http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx.

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

Notă: yURPMSHHKFE LPNBODH dupon (8) DMS KHLBBOYS SDTH NEUFB, ZDE OHTsOP UPITBOSFSH BCHBTYKOSHCHE DBNRSCH. rPUME OBUFTPKLY RP LPNBODE swapon (8) TBDEMB RPDLBYULY DPMTSOB VSHFSH CHSHCHBOB RTPZTBNNNB dumpon . pVSHYUOP LFP CHSHRPMOSEPHUS ЪBDBOYEN RETENOOOPK dumpdev CH ZHBKME rc.conf (5). еUMY ЪБДБOB ьФБ RATENEOOBS, FP RPUME UVPS RTY RETCHPK NOPZPRPMSHЪPCHBFEMSHULPK RETEЪBZTHЪLE VHDEF BCHFPNBFYUEULY ЪBRHEEOOB RTPZTBNNNB savecore (8). pOB UPITBOIF BCHBTYKOSHCHK DBNR SDTB CH LBFBMPZ, ЪBDBOOSCHK CH RETENEOOOPK dumpdir ZHBKMB rc.conf . rP KHNPMYUBOYA LBFBMPZPN DMS BCHBTYKOSCHI DBNRPCH SCHMSEFUS /var/crash .

mYVP CHSC NPTSEFE ЪBDBFSH KHUFTPKUFCHP DMS UVTPUB PVTBB RBNSFY SCHOP YUETE RBTBNEFT dump CH UFTPLE config LPOZHYZHTBGYPOOPZP ZHBKMB CHBYEZP SDTB. fBLPK URPUPV YURPMSHЪPCHBFSH OE TELPNEODHEFUS Y PO DPMTSEO YURPMSHЪPCHBFSHUS, FPMSHLP EUMY CHSCH IPFYFE RPMKHYUBFSH BCHBTYKOSHCH PVTBYSH RBNSFY SDTB, LPFPTPPE BCHBTYKOPVLEЪCHPABTYKOPVLEЪCHPAHZЪЪЪCHSCHЪPCHBFSH.

Notă: 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 DESPRE (kgdb) .

Bacsis: Eumi Chechi yurpmshhef FreeBSD Cetui 3 ymi tbooaa, Cheshchiki DPMTSOSH Cheshrpmeifsh Huyuye PFMBDPZP SDTB LPNBODPK STRIP, Hufbobchmychbfsh PFMSHYP PFMBDPUOP:

# cp kernel kernel.debug # strip -g kernel

bFPF YBZ OE FBL KhTS Y OEPVIPDYN, OP TELPNEODKHEN. (PhP FreeBSD al 4-lea VPMEE RPJDOYI TEMYBI LFPF YBZ CHSHRPMOSEFUS BCHFPNBFYUEULY CH LPOGE RTPGEUUB RPUFTPEOOYS SDTB make .) lPZDB SDTP HUEYEOP, BCHFPNBFYUEULY YMY RTY RPNPYE, LPNBOCHDHYUEULY CH LPOGE RTPGEUUB RPUFTPEOOYS SDTB make .) SCHN PVTBBPN, OVTTBCH make install .

ъBNEFSHFE, YuFP CH UFBTSHCHETUISI FreeBSD (DP 3.1, OE CHLMAYUBS LFPF TEMY), YURPMSHKHEFUS SDTB CH ZHTNBFE a.out, RPFPNH YI FBVMYGSH UYNCHPMPCH DPMTSOSCH TBURPMBZBFSHUS RPURPMBZBFSHOP 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 CHSH FEUFYTHEFE OPCHPE SDTP, ULBTSEN, OBVYTBS YNS OPChPZP SDTB CH RTYZMBYEOYY UBZTHYUYLB, OP CHBN OHTSOP ЪBZTHTSBFSH Y TBVPFBFSH U DTHZYN SDTTONPC YuFPVHPOHPTY U DTHZYN SDTTONPC YuFPVHPOHPTY TPCHBOYA, ЪBZTHTSBKFE EZP FPMSHLP CH PDOPRPMSHЪPCHBFEMSHULPN TETSYNE RTY RPNPEY ZHMBZB -s , KHLBSCCHBENPZP RTY ЪBZTHЪLE , B ЪBFEN CHSHRPMOYFE FBLYE YBZY:

# fsck -p # mount -a -t ufs # astfel încât sistemul dvs. de fișiere pentru /var/crash să poată fi scris # savecore -N /kernel.panicked /var/crash # exit # ...pentru multi-utilizator

bFB RPUMEDPCHBFEMSHOPUFSH KHLBSCCHBEF RTPZTBNNE savecore (8) DESPRE YURPMSHЪPCHBOYE DTHZPZP SDTB DMS YЪCHMEYUEOYS UYNCHPMYUEULYI YNEO. YOBYUE POB VHDEF YURPMSHЪPCHBFSH SDTP, TBVPFBAEEE CH DBOOSHCHK NPNEOF Y, ULPTEE CHUEZP, OYUEZP OE UDEMBEF, RPFPNH YuFP BCBTYKOSHCHK PVTB RBNSFY YYNCHPMSCH SDTB VHDUSPFMYUBFSHHF PFMY.

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

Fișier-simbol kernel.debug fișier exec /var/crash/kernel.0 fișier de bază /var/crash/vmcore.0 Y CHBMS - CHCH NPTSEFE PFMBTSYCHBFSH BCHBTYKOSHK DBNR, YURPMSHЪHS YUIPDOSCH FELUFSCH SDTB FPYuOP FBLCH LFPBLMSH AT MAVPC DTHZPK RTPZTBNNPK.

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

1:Scriptul a început vineri, 30 decembrie 23:15:22 1994 2: # cd /sys/compile/URIAH 3: # gdb -k kernel /var/crash/vmcore.1 4:Citirea datelor simbolului din /usr/src/ sys/compile/URIAH/kernel ...terminat. 5:IdlePTD 1f3000 6:panica: pentru ca ai spus! 7: pcb curent la 1e3f70 8: Citirea simbolurilor pentru ../../i386/i386/machdep.c...terminat. 9: (kgdb) unde 10:#0 boot (arghowto=256) (../../i386/i386/machdep.c linia 767) 11:#1 0xf0115159 în panică () 12:#2 0xf01955bd (in diedie ) (../../i386/i386/machdep.c linia 698) 13:#3 0xf010185e în db_fncall () 14:#4 0xf0101586 în db_command (-266509132, -266509132, -2665, 501651 -2665:501586) 101711 în db_command_loop () 16:#6 0xf01040a0 în db_trap () 17:#7 0xf0192976 în kdb_trap (12, 0, -272630436, -266743723) 18:#8 0xf0192976 în kdb_trap (12, 0, -272630436, -266743723) 18:#8 0192976 18:#8 0192976 18:#8 0192976 9ce60 in trap_pfault ( ...) 20:#10 0xf019cb2f în capcană (...) 21:#11 0xf01932a1 în excepție:calltrap () 22:#12 0xf0191503 în cnopen (...) 23:#13 0xf01932a1 în spec_open4 () 24: #14 0xf012d014 în vn_open () 25:#15 0xf012a183 în deschis () 26:#16 0xf019d4eb în syscall (...) 27: (kgdb) în sus 10 28:Citirea simbolurilor pentru ../i38/. /i386 /trap.c...terminat. 29:#10 0xf019cb2f în capcană (frame=(tf_es = -260440048, tf_ds = 16, tf_\ 30:edi = 3072, tf_esi = -266445372, tf_ebp = -27232, tf_ebp = -2723:92, tf_is = 3072): , t f_ebx = - 266427884, tf_edx = 12, tf_ecx = -266427884, tf\ 32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = 34:66, tf_eip = 34 -266, tf_eip = 34 -26 -26 36 8, tf_eflags = 66066, tf_esp = 3072, tf_\ 34:ss = -266427884)) (../../i386/i386/trap.c linia 283) 35:283 (void) trap_pfault(&frame, FALSE); 36: (kgdb) frame frame->tf_ebp frame->tf_eip 37:Citirea simbolurilor pentru ../../i386/isa/pcvt/pcvt_drv.c...terminat. 38:#0 0xf01ae729 în pcopen (dev=3072, flag=3, mode=8192, p=(struct p\ 39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c line 403) 40:403 return ((*linesw.l_open)(dev, tp)); 41: (kgdb) listă 42:398 43:399 tp->t_state |= TS_CARR_ON; 44:400 tp->t_cflag |= CLOCAL; /* nu poate fi un modem (:-) */ 45:401 46:402 #if PCVT_NETBSD || (PCVT_FREEBSD >= 200) 47:403 return ((*linesw.l_open)(dev, tp)); 48:404 #else 49:405 return ((*linesw.l_open)(dev, tp, flag)); 50:406 #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */ 51:407 ) 52: (kgdb) print tp 53:Citirea simbolurilor pentru ../../i386/i386/cons.c...terminat. 54:$1 = (struct tty *) 0x1bae 55: (kgdb) print tp->t_line 56:$2 = 1767990816 57: (kgdb) up 58:#1 0xf0191503 în cnopen (dev=0x0000, flag=03, mod=03 , p=(st\ 59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c linia 126) 60: return ((*cdevsw.d_open)(dev, flag, mode, p) ); 61: (kgdb) în sus 62:#2 0xf0132c34 în spec_open () 63: (kgdb) în sus 64:#3 0xf012d014 în vn_open () 65: (kgdb) în sus 66:#4 0xf012a186 in ()kg) up 68:#5 0xf019d4eb în syscall (cadru=(tf_es = 39, tf_ds = 39, tf_edi =\ 69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_82638436, tf_27:8436 = 272638436) , 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_esp \72:3 - 9 s = 72:3) ./../i386/i386/trap.c line 673) 73:673 error = (*callp->sy_call)(p, args, rval); 74: (kgdb) sus 75: Cadrul inițial selectat; nu poți urca. 76: (kgdb) ieșire 77: # ieșire 78: ieșire 79: 80: Script realizat pe vineri, 30 decembrie 23:18:04 1994

lPNNEOFBTYY L CHSHCHYYERTYCHEDEOOPNH TSHTOBMKH:

UFTPLB 6:

ьФП DBNR, CHSFSHCHK RTY RPNPEY DDB (UNPFTY OITSE), RPPFPNH LPNNEOFBTYK L BCHBTYKOPNH PUFBOPCHH YNEEF YNEOOP CHYD ``pentru că ai spus să!'' Y FTBUUYTPCHLB UFELB ZMHVPLB; PDOBLP YOBYUBMSHOPK RTYYUYOPK RETEIPDB CH DDB VSHMB BCHBTYKOBS PUFBOPCHLB RTY CHPOYLOPCHEOYA PYYVLY UFTBOIGSC RBNSFY.

UFTPLB 20:

lFP NEUFPOBIPTSDEOOYE ZHKHOLGYY capcană() CH FTBUUYTPCHLE UFELB.

UFTPLB 36:

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

UFTPLB 52:

rPIPTSE, YuFP CHYOPCHBF KHLBBFEMSH, OP ON SCHMSEFUS DPRKHUFYNSCHN BDTEUPN.

UFTPLB 56:

pDOBLP, PYUECHYDOP, UFP PE KHLBSCCHBEF DESPRE NUPT, FBL UFP NSCH OBYMY OBYKH PYYVLH! (DMS FEI, LFP OE ЪOBLPN U LFPC YUBUFSHHA LPDB: tp->t_line UMHTSYF DMS ITBOEOYS TETSYNB LBOBMMB LPOUPMSHOPZP KHUFTPKUFCHB, Y LFP DPMTSOP VShchFSH DPUFBOSFPYuOP GPEMNBPE.)

Uneori am o situație în care Windows așteaptă timpul de încărcare pentru depanatorul nucleului. Veți vedea textul „Pornire Windows”, dar nu și logo-ul.

Dacă atașez acum depanatorul, se redă animația logo-ului Windows 7. După aceea, logo-ul începe să bată. În acest moment, procesul de descărcare nu mai progresează. Sarcina procesorului este redusă la minimum. De obicei aștept câteva minute, dar nu se întâmplă nimic.

Acest lucru nu se întâmplă întotdeauna. Cu toate acestea, dacă se întâmplă acest lucru, resetarea VM-ului nu va ajuta. Pentru a remedia această problemă, trebuie să folosesc repararea la pornire. Din păcate, acest lucru durează o veșnicie.

Aveți idee despre ce pot face în afară de executarea reparației la pornire?

Vă mulțumesc anticipat!

3

2 raspunsuri

Pentru a remedia problema cu care vă confruntați, apăsați pur și simplu F10 în timpul pornirii. Și eliminați/depanați și parametrii aferenti. Apoi apăsați enter.

Sugestie: Nu utilizați /debug pentru opțiunea implicită a meniului de pornire. Copiați configurația de pornire într-o nouă intrare. Apoi setați-l în modul de depanare. Windows nu știe când vei folosi depanatorul. Prin urmare, el trebuie să aștepte.

Pentru a depana nucleul, trebuie să vă conectați la computer folosind cablu modem nul sau conexiune prin modem. Computerul care efectuează depanarea se va numi „Gazdă”, iar computerul cu probleme se va numi „Target”.

Ambele computere trebuie să ruleze la fel versiuni Windows, iar fișierele de simbol pentru computerul țintă trebuie instalate pe computerul gazdă. Fișierele simbol sunt furnizate pe CD-ul de instalare Windows în directorul Support\Debug.

Pentru a activa depanarea, trebuie să faceți modificări fișierului BOOT.INI de pe computerul țintă.

1. Modificați atributele fișierului BOOT.INI:

atrib c:\boot.ini –r –s

2. Editați acest fișier și în linie Pornire Windows adăugați parametrul /debug (pentru a spune sistemului să pornească în RAM depanatorul nucleului pornind Windows). Parametrii suplimentari sunt /Debugport, care spune sistemului ce port COM să folosească (implicit este COM2) și /Baudrate - pentru a specifica viteza baud (implicit este 19200 baud, dar 9600 este mai bun). De exemplu:


multi(0)disc(0)rdisk(0)partiție(0)\WINDOWS="Windows NT" /debug /debugport=com2 /baudrate=9600

3. Salvați fișierul.

4. Setați atributele anterioare ale fișierului BOOT.INI:

atrib c:\boot.ini +r +s

ÎN în acest exemplu computerul țintă a permis conectarea prin portul COM2 la 9600 bps.

Computerul gazdă trebuie configurat cu setările necesare pentru depanare. În plus, fișierele cu simboluri trebuie instalate. Pentru a le instala, accesați directorul \support\debug de pe CD-ul de instalare și introduceți următoarea comandă:

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

De exemplu:

expndsym f: d:\symbols

Instalarea poate dura ceva timp. Amintiți-vă că, dacă pachetele de servicii au fost instalate pe computerul țintă, fișierele simbol pentru acele pachete trebuie să fie instalate și pe computerul gazdă. Fișierele cu simboluri pentru pachetele de actualizare pot fi descărcate de pe site-ul Microsoft.

Următorul pas este configurarea variabilelor de mediu necesare pentru depanare, cum ar fi variabilele care indică locația fișierelor de simbol etc. Mai jos este o descriere a acestor variabile.

Descrierea variabilelor de sistem

Definiția acestor variabile poate fi plasată în fișier batch pentru a evita introducerea comenzilor corespunzătoare la fiecare boot:

ecoul oprit
set_nt_debug_port=com2
set_nt_debug_baud_rate=9600
setați _nt_symbol_path=d:\symbols\i386
setați _nt_log_file_open=d:\debug\logs\debug.log

Acum trebuie să copiați software depanarea nucleului, care se află în directorul support\debug\<процессор>pe CD-ul de instalare (support\debug\I386). Cel mai simplu mod este să copiați întregul director, deoarece este de dimensiuni mici (aproximativ 2,5 MB). Pentru platforma I386, se folosește un depanator, care este furnizat ca fișier I386KD.EXE. Depanatorul este lansat folosind comanda I386KD. Pentru a introduce o comandă, apăsați combinația de taste și așteptați să apară promptul de comandă kd>.

Acțiune