Sfondo: Sto usando windbg per diagnosticare le cause dai minidump del servizio WinQual di Microsoft. Mi sono preso il tempo di sistemare le cose correttamente con PDB e binari nello stesso percorso del momento in cui sono stati costruiti, e ho avuto molta fortuna con windbg e questa configurazione.
Oggi mi sono imbattuto in un minidump in cui mi piacerebbe davvero guardare attraverso lo smontaggio per capire il problema, ma windbg invertirà solo una sezione della funzione.
La mia funzione è simile a questa:
SomeStruct* STDCALL getThing(int id)
{
S_ASSERT(a);
S_ASSERT(b);
S_ASSERT(c);
SomeStruct* result = fn(id);
S_ASSERT(d);
return result;
}
S_ASSERT
è la nostra macro che alla fine chiama in una funzione, dove il int 3
l'istruzione viene colpita, anche nelle versioni di rilascio. Non riesco a dire quale è stato colpito senza ispezionare lo smontaggio.
Usando windbg, posso saltare a getThing
nello stack delle chiamate, attivare lo smontaggio e vedere un po 'di codice, ma non "scorrere indietro nello smontaggio. Ho quindi aggiunto un orologio module!getThing
per ottenere l'indirizzo della funzione, e lo ha scrittoindirizzo nella finestra di disassemblaggio. Invece di istruzioni, ottengo ~ 100 righe di ??? seguito da alcuni disassemblaggi che non assomigliano al punto di ingresso della funzione ma sembrano parte della funzione corretta. Sembra questo:
No prior disassembly possible
module!getThing:
1d7d4aa0 ?? ???
1d7d4aa1 ?? ???
1d7d4aa2 ?? ???
...
1d7d4b0a 087d1c or byte ptr [ebp+1Ch],bh
1d7d4b0d 8b4004 mov eax,dword ptr [eax+4]
1d7d4b10 8bf9 mov edi,ecx
1d7d4b12 83e11f and ecx,1Fh
1d7d4b15 bb01000000 mov ebx,1
...
Quindi, come posso convincere windbg a mostrare il resto dello smontaggio? In alternativa, sto interpretando male i risultati? C'è qualche altro software in grado di caricare minidumps oltre a Visual Studio?
Grazie per qualsiasi suggerimento che possiate fornire!
risposte:
2 per risposta № 1Assicurati di avere una copia di stesso dll o exe nel percorso del simbolo (.sympath
) o il percorso exe (.exepath
). Uso !sym noisy
e .reload
e verifica che windbg trovi questa dll.