2011-03-31 6 views
10

Ho installato WinDBG dall'SDK di Windows 7.1. Quindi con VC++ 2008 ho creato un programma 'CleanPayload.exe' che non contiene nient'altro che un 'main' e un'invocazione a una funzione che contiene intenzionalmente un difetto. È una versione di rilascio che include i simboli di debug. Ho aperto il programma in WindDBG e poiUtilizzo di WinDBG per identificare la funzione difettosa

  1. fatto un .sympath+ per indicare dove il PPB era per quel programma.
  2. ha fatto un ld * per caricare tutti i simboli
  3. ha fatto un lm per verificare tutti i simboli sono stati caricati (simboli privati ​​per il mio programma, simboli pubblici per le librerie di Windows).

Ho quindi eseguito il programma e ha generato un'eccezione di prima scelta, che era piuttosto prevedibile. Come segue:

(910.12a0): WOW64 breakpoint - code 4000001f (first chance) 
First chance exceptions are reported before any exception handling. 
This exception may be expected and handled. 
ntdll32!LdrpDoDebuggerBreak+0x2c: 
771e0f2b cc    int  3 

Ma quando chiedo WinDBG di mostrarmi la pila, la cosa non mi mostra nulla del mio programma 'CleanPayload.exe'. Invece mi mostra questo:

0:000:x86> kb 
ChildEBP RetAddr Args to Child    
004bf5ec 771c122b 7efdd000 7efde000 7724206c ntdll32!LdrpDoDebuggerBreak+0x2c 
004bf764 77192187 004bf7d8 77140000 7c185e6a ntdll32!LdrpInitializeProcess+0x132f 
004bf7b4 77179e89 004bf7d8 77140000 00000000 ntdll32!_LdrpInitialize+0x78 
004bf7c4 00000000 004bf7d8 77140000 00000000 ntdll32!LdrInitializeThunk+0x10 

Di cosa ho bisogno di fare in modo che mi mostrerà una traccia dello stack che (1) comprende il mio programma e (2) la funzione in cui è stata generata l'eccezione?

Aggiornamento ho seguito il suggerimento di Larry, per eseguire oltre la prima eccezione, ed ha ottenuto i seguenti risultati:

0:000:x86> g 
ntdll!NtTerminateProcess+0xa: 
00000000`76faf97a c3    ret 
0:000> kb 
RetAddr   : Args to Child               : Call Site 
00000000`74c6601a : 00000000`00000000 00000000`000de600 00000000`000ddc80 00000000`74c60304 : ntdll!NtTerminateProcess+0xa 
00000000`74c5cf87 : 00000000`0030f988 00000000`0030dba8 00000000`7efdb000 00000000`0030f934 : wow64!whNtTerminateProcess+0x46 
00000000`74be276d : 00000000`77150190 00000000`74c50023 00000000`00000000 00000000`0030fab8 : wow64!Wow64SystemServiceEx+0xd7 
00000000`74c5d07e : 00000000`00000000 00000000`74be1920 00000000`000de820 00000000`76f93501 : wow64cpu!TurboDispatchJumpAddressEnd+0x24 
00000000`74c5c549 : 00000000`00000000 00000000`00000000 00000000`74c54ac8 00000000`7ffe0030 : wow64!RunCpuSimulation+0xa 
00000000`76faae27 : 00000000`004a3100 00000000`00000000 00000000`7707a1e0 00000000`7efdf000 : wow64!Wow64LdrpInitialize+0x429 
00000000`76fa72f8 : 00000000`00000000 00000000`76fa8641 00000000`76fb84e0 00000000`00000000 : ntdll!LdrpInitializeProcess+0x1780 
00000000`76f92ace : 00000000`000df1b0 00000000`00000000 00000000`7efdf000 00000000`00000000 : ntdll! ?? ::FNODOBFM::`string'+0x2af20 
00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrInitializeThunk+0xe 

Così, purtroppo, sto ancora non vedendo rilevanti informazioni di stack trace. Ho anche provato il comando .effmach x86, prima dei passaggi precedenti, e non sembrava avere un impatto. Per inciso, ho anche rieseguito l'intero test con il verificatore di app attivato per il programma di destinazione che sto testando. Ho ottenuto risultati molto contrastanti:

0:000> g 
ModLoad: 00000000`76d40000 00000000`76e5f000 WOW64_IMAGE_SECTION 
ModLoad: 00000000`74f90000 00000000`75090000 WOW64_IMAGE_SECTION 
ModLoad: 00000000`76d40000 00000000`76e5f000 NOT_AN_IMAGE 
ModLoad: 00000000`76e60000 00000000`76f5a000 NOT_AN_IMAGE 
ModLoad: 00000000`71160000 00000000`711c0000 C:\Windows\syswow64\verifier.dll 
Page heap: pid 0x1A54: page heap enabled with flags 0x3. 
AVRF: CleanPayload.exe: pid 0x1A54: flags 0x80643027: application verifier enabled 
ModLoad: 00000000`71130000 00000000`7115b000 C:\Windows\SysWOW64\vrfcore.dll 
ModLoad: 00000000`710d0000 00000000`71128000 C:\Windows\SysWOW64\vfbasics.dll 
ModLoad: 00000000`74f90000 00000000`75090000 C:\Windows\syswow64\kernel32.dll 
ModLoad: 00000000`76830000 00000000`76876000 C:\Windows\syswow64\KERNELBASE.dll 
ModLoad: 00000000`715c0000 00000000`7164e000 C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4926_none_508ed732bcbc0e5a\MSVCP90.dll 
ModLoad: 00000000`73dc0000 00000000`73e63000 C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4926_none_508ed732bcbc0e5a\MSVCR90.dll 
(1a54.17dc): WOW64 breakpoint - code 4000001f (first chance) 
First chance exceptions are reported before any exception handling. 
This exception may be expected and handled. 
ntdll32!LdrpDoDebuggerBreak+0x2c: 
771e0f2b cc    int  3 

0:000:x86> !avrf 
************************************************************************* 
***                 *** 
***                 *** 
*** Your debugger is not using the correct symbols     *** 
***                 *** 
*** In order for this command to work properly, your symbol path *** 
*** must point to .pdb files that have full type information.  *** 
***                 *** 
*** Certain .pdb files (such as the public OS symbols) do not  *** 
*** contain the required information. Contact the group that  *** 
*** provided you with these symbols if you need this command to *** 
*** work.               *** 
***                 *** 
*** Type referenced: wow64!_TEB32         *** 
***                 *** 
************************************************************************* 
Application verifier is not enabled for this process. 
Use appverif.exe tool to enable it. 

L'esecuzione di cui sopra dice AVRF: Cleanpayload.exe ... application verifier enabled, che indica che è bloccato-on al bersaglio. Ma il successivo comando !avrf rivela che i simboli di debug sono negativi, anche se il comando lm mostra che sono tutti caricati correttamente! Cosa diavolo sta succedendo qui?

+0

hai scoperto il motivo dell'eccezione? –

risposta

11

Si sta eseguendo la versione a 64 bit di windbg e un'applicazione a 32 bit. Il punto di interruzione iniziale è in esecuzione in codice a 64 bit.

Se si preme "g" si dovrebbe toccare il punto di interruzione iniziale per l'applicazione a 32 bit, si dovrebbe essere in grado di andare da lì.

Per passare da 64 bit di debug per il debug a 32 bit (se si preme CTRL-C, per esempio), digitare:

.effmach x86 

che passa il debugger dalla modalità a 64 bit in modalità a 32 bit.

+0

Evidentemente, il debug a 32 bit in WinDBG a 64 bit è metà del problema. L'altra metà sta trovando i giusti simboli di debug per il programma a 32 bit. Nota questa discussione: 'http: // www.eggheadcafe.com/software/aspnet/29430292/teb32-and-peb32-type-info-missing-from-public-wow64pdb.aspx'. Detto questo, se eseguo il debug di un'applicazione a 64 bit, per rendere felice 'application verifier', devo essere sicuro di inserire 'c: \ windows \ system32' nel percorso del simbolo prima di 'srv *'. –

+0

Bene, avevo dimenticato anche il problema del percorso simbolico. –

+0

@LO: Puoi spiegarlo un po 'oltre, per favore? Cosa intendi per punto di rottura iniziale in codice a 64 bit? Specificamente, puoi per favore confrontarlo con lo stesso scenario in windbg32? Inoltre, questa eccezione iniziale che viene generata: viene inserita dal debugger in modo che il debug si fermi al richiamo? GRAZIE. – Sabuncu

1

Stai cercando di capire come eseguire il debug dei problemi reali una volta che il software è stato impacchettato e inviato al QA o ai clienti? Se sì, c'è un altro strumento che potresti usare, adplus. Adplus lancia il debugger sotto il cofano e ha un solo scopo (in realtà due, se sei in modalità hang, ma non è quello che vuoi qui), che è aspettare le eccezioni. Quando si verifica un'eccezione, verrà generato un file di dump della memoria di processo che può essere caricato in WinDbg.

Utilizzando questo approccio, non è necessario affidarsi al controllo qualità o ai propri clienti per sapere come lavorare con WinDbg. Semplicemente dai loro istruzioni su come eseguire una riga di comando. Dopo averlo eseguito, comprimono semplicemente l'intera directory di output e la inviano all'utente per l'analisi.

Una volta caricato in WinDbg, il file di dump della memoria mostrerà il posto esatto dell'eccezione e tutte le variabili locali/membro al momento (anche se potrebbe essere necessario pescare un po 'per quei valori se il codice è ottimizzato).

+0

L'autore aveva già acquistato la discarica. Ha problemi ad analizzarlo però. –

+0

@YauheniSivukha - probabilmente non quando ho postato questa risposta ... oltre 3 anni fa – DXM

Problemi correlati