Principii generale de depanare DLL
Deși un DLL implementat o varietate de obiecte, există 2 principiu de depanare comun, aplicabil tuturor soiurilor de DLL.
Mai multe DLL depanare nu diferă fundamental de aplicațiilor de depanare.
Uneori, o aplicație care utilizează DLL-ul, în sine trebuie să ruleze o altă aplicație (aceasta este situația care apare cu ISAPI-extensie, care încarcă serviciul IIS). În acest caz, este posibil să se respecte următoarele tactici.
- Până la aplicarea, folosind tehnicile de secțiunea anterioară (în acest caz, apelul va fi inserat în codul DebugBreak DLL). În cazul în care cererea continuă să funcționeze, opriți-l (Debug-> Break).
- Asigurați-vă că debugger încărcat simbolurile pentru DLL (în fereastra Debug ar trebui să apară tipul de linie „simboluri încărcate pentru <имя DLL>„). Dacă nu, ar trebui să adăugați la lista DLL-uri suplimentare DLL fiind depanat.
- Deschideți fișierele cu codul sursă DLL (fără a deschide proiectul ei!) și locul breakpoint corespunzătoare.
- Pentru a relua executarea cererii.
extensii shell Debugging pentru Windows
Pentru extensiile shell pentru Windows ca aplicația fiind debugged indicată explorer.exe.
Închiderea shell Windows
Având în vedere că sistemul nu poate funcționa două cochilii simultan (pentru excepții de la această regulă vor fi discutate mai târziu), trebuie să completați shell Windows, înainte de a începe din nou debugger. Pentru a finaliza shell, trebuie să:
- Selectați comanda Start-> Shut Down.
- Faceți clic pe butonul Nu din caseta de dialog deschis ținând apăsat pe Ctrl + Alt + Shift.
Re-lansarea shell
Pentru a reporni shell la sfârșitul unei sesiuni de depanare, suficient pentru a rula explorer.exe de la orice shell sau de la linia de comandă. Dacă nici shell, nici o parte din linia de comandă nu este prezent, poate fi utilizat următoarele tehnici.
- Apăsați pe Ctrl + Alt + Del.
- Apelați Managerul de activități.
- Selectați comanda Fișier-> nouă (Executare) și începe o cochilie.
- Faceți dublu clic pe spațiul de lucru. Deschideți caseta de dialog de sarcini.
- Selectați File-> Run și rulați comanda shell.
descărcare DLL
În timpul funcționării normale, shell-ul nu imediat DLL descarcă, dar după o anumită perioadă de timp. Acest linker poate preveni suprascrierea unui fișier DLL. Pentru a shell imediat descărcate DLL, trebuie să creați cheia de registry HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ AlwaysUnloadDLL și scrie "1" în setarea implicită.
Debugging Add-ins pentru Visual C ++
Atunci când depanare add-in-uri depanator Visual C ++ trebuie să se depana. Cel mai bine este de a rula mediul exemplu, fără a Visual C ++ add-in'a, și apoi să utilizați această copie pentru depanare. În caz contrar, pot exista greșeli foarte subtile și non-evidente, pentru a corecta ceea ce va lăsa o multime de timp. O altă posibilitate de a depana add-in-uri - depanarea la distanță (din care vom discuta în secțiunea următoare).
Debugging ISAPI-Extensii
Datele din această secțiune sunt pentru IIS5
Un ISAPI-extensie - un DLL, care este încărcat IIS server Web pentru a gestiona cererile. Pe măsură ce pot fi încărcate ca fișierul principal inetinfo.exe (Mod scăzut (proces IIS)), precum și un dllhost.exe proces separat (modurile de Mediu (comunǎ) și High (izolate)), în funcție de setările de securitate pentru o aplicație Web (protecție aplicație) IIS . Puțin mai târziu, vom vedea cum să depana ISAPI-expansiune în acest lucru și într-un alt caz. Dar, mai întâi câteva cuvinte despre pregătirea extensiei pentru a depana.
Pregătirea pentru a depana
Înainte de a începe depanare, este recomandat să efectuați următorii pași.
- Construiți o versiune de depanare a extensiei.
- Creați un director virtual cu permisiuni de executare (executa) pentru el. Pentru a crea un director virtual folosind utilitarul Internet Manager de (Start poate fi de la Start-> meniul Instrumente de administrare). Puteți da orice nume (de exemplu, test). Deoarece calea fizică către directorul trebuie să specifice calea către extensia DLL directorul de depanare (de exemplu, C: \ Proiecte \ MyISAPI \ Debug).
- Dezactivați memorarea în cache de extensii Web Server. În mod implicit, DLL-ul de extensie server este încărcat imediat ce prima cerere vine la ea, și apoi rămâne în memorie, astfel încât cererile ulterioare sunt procesate mai repede. Aceasta este o abordare rezonabilă, dar pentru scopuri de depanare mai bine dezactiva cache DLL a fost descărcată imediat după procesarea solicitării. Pentru a face acest lucru, porniți Internet Manager, Apel din meniul contextual al ferestrei de dialog Web site-ului Proprietăți, faceți clic pe fila Home Directory. click pe butonul de configurare. și debifați aplicațiile ISAPI Cache.
Dacă serverul web nu rulează, porniți-l. Apoi, puteți trece direct la depanare.
În procesul de depanare o extensie ISAPI, trebuie să porniți și să opriți serverul web destul de des. Puteți utiliza comanda w3svc net start, și w3svc net stop, respectiv. puteți adăuga aceste comenzi în meniul Tools, dacă se dorește. astfel încât acestea sunt întotdeauna la îndemână.
Debugging expansiune în modul în proces
În acest mod este încărcat DLL proces inetinfo.exe. În scopul de a se alătura, posibil să se utilizeze oricare dintre metodele descrise în secțiunea anterioară (comanda se atașează la proces. Comandă Debug sau o funcție DebugBreak Task Manager. Ceea ce, în acest caz, trebuie să fie introdusă în extensie GetExtensionVersion). Apoi, puteți acționa în conformitate cu scenariul descris în „Principii generale de depanare“ pentru a încărca simbolurile de depanare (dacă este necesar) și așezați breakpoint.
IIS Rulează modul de aplicare ordinară
În cazul în care cantitatea de depanare este mare, și de multe ori trebuie să pornească și să oprească serviciul, pur și simplu rulați IIS depanatorul, ca o aplicație obișnuită.
Modul expansiune Debugging, out-of-proces
În acest mod DLL este încărcat dllhost.exe proces. Procesul de depanare pentru ea nu diferă de cazul precedent. Doar amintiți-vă că metoda de conectare la procesul de utilizare DebugBreak nu va funcționa, ca o excepție să fie prins în interiorul EXCEPTION_BREAKPOINT dllhost.exe.
Sistemul poate fi mai mult de un proces cu numele dllhost.exe. Este necesar de a afla care dintre ele încarcă DLL-expansiune. Acest lucru se poate face în diverse moduri. Una dintre opțiuni - pentru a se insera în codul DLL, care spune ID-ul de proces, în care este încărcat. De exemplu:
Notă steagul MB_SERVICE_NOTIFICATION. Este esențial ca mesajul ISAPI-expansiune poate fi vazut pe ecran.