2009-05-12 6 views
11

Se l'app C++ si arresta in modo anomalo su Windows, desidero inviare utili informazioni di debug al nostro server.Come estrarre informazioni di debug da un arresto anomalo

Su Linux, vorrei utilizzare la funzione GNU backtrace(): esiste un equivalente per Windows?

C'è un modo per estrarre informazioni utili di debug dopo che un programma si è arrestato in modo anomalo? O solo dall'interno del processo?

(Consigli sulla falsariga di "test che si app in modo che non va in crash" non è utile - tutti i programmi non banali avranno bug)

risposta

7

La funzione Stackwalk64 può essere utilizzata per scattare una traccia dello stack su Windows.

Se si intende utilizzare questa funzione, è necessario accertarsi di compilare il codice con FPO disabilitato - senza simboli, StackWalk64 non sarà in grado di camminare correttamente i fotogrammi di FPO.

È possibile ottenere un codice in esecuzione durante il processo al momento dell'arresto tramite un blocco __try/__except di livello superiore chiamando SetUnhandledExceptionFilter. Questo è un po 'inaffidabile dal momento che richiede di avere codice in esecuzione all'interno di un processo in crash. In alternativa, è possibile solo il Segnalazione errori di Windows integrata per raccogliere i dati relativi agli arresti anomali. Questo è più affidabile, dal momento che non richiede l'aggiunta di codice eseguito all'interno del processo compromesso e danneggiato. L'unico costo è ottenere un certificato di firma del codice, poiché è necessario inviare un binario firmato al servizio. https://sysdev.microsoft.com/en-US/Hardware/signup/ ha più dettagli.

+0

I file binari non devono essere firmati per recuperare i dati relativi al crash del WER. Invece, si esegue uno strumento speciale che analizza i file binari e raccoglie nomi di file, timestamp, CRC, ecc. Lo strumento salva queste informazioni in un file XML che si carica su Winqual. – bk1e

+0

Il binario firmato serve per stabilire l'identità. Da http://www.microsoft.com/whdc/winlogo/maintain/StartWER.mspx: Per proteggere le aziende dalla furto d'identità e garantire che i report degli errori vengano inviati a un rappresentante della società corretta, il sito Web di Winqual richiede la tua azienda avere un ID VeriSign valido. – Michael

2

Questo sito offre un bel panoramica dettagliata di recupero pila su Win32 dopo un C++ eccezione:

http://www.eptacom.net/pubblicazioni/pub_eng/except.html

Naturalmente, questo funziona solo dall'interno del processo, per cui se il processo viene terminato o si blocca al punto in cui termina prima che il codice viene eseguito, ha vinto' lavoro.

2

Genera un file minidump. È quindi possibile caricarlo in windbg o Visual Studio e ispezionare l'intero stack in cui si è verificato l'arresto anomalo.

Here's un buon posto per iniziare a leggere.

+0

sfortunatamente MiniDumpWriteDump richiede determinati privilegi, che non posso supporre che i miei utenti abbiano – hoju

2

È piuttosto semplice eseguire il dump degli indirizzi dello stack in un file di registro. Tutto quello che devi fare è ottenere una funzione chiamata sugli errori di programma (ad esempio un gestore di interrupt in Windows) o che asserisce. Questo può essere fatto anche nelle versioni rilasciate. Il file di registro può quindi essere abbinato a un file di mappa risultante in uno stack di chiamate con nomi di funzioni.

Ho pubblicato un articolo su questo alcuni anni fa.

Vedi http://www.ddj.com/architect/185300443

1

Se si vuole prendere un callstack (più altre utili informazioni) per un incidente di esecuzione, su una build di rilascio, anche in loco, quindi è necessario impostare Dr Watson (correre Drwtsn32.exe).Se controlli l'opzione 'genera crash dump', quando un'app si arresta in modo anomalo, scrive un mini file di dettagli sul percorso specificato (chiamato user.dmp).

Puoi prendere questo, combinarlo con i simboli che hai creato quando hai costruito il tuo server (imposta questo nel tuo compilatore/linker per generare file pdb - tienili al sicuro a casa, li usi per abbinare la discarica in modo che possano elaborare la fonte in cui si è verificato l'arresto anomalo)

Scarica te windbg, aprilo e utilizza l'opzione di menu per "carica crash dump". Una volta caricato tutto, puoi digitare "~ # kp" per ottenere un callstack per ogni thread (o fare clic sul pulsante in alto per il thread corrente).

Ci sono buoni articoli per sapere come fare tutto questo sul web, This one è il mio preferito, e ti consigliamo di read this per capire come aiutarti a gestire i simboli molto facilmente.

1

È necessario impostare un framework di generazione del dump nell'applicazione, here è come si può fare.

È possibile quindi caricare il file di dettagli sul server per ulteriori analisi utilizzando analizzatori di dumping come windbg.

2

Lasciatemi descrivere come gestisco gli arresti anomali nella mia applicazione C++/WTL.

Innanzitutto, nella funzione principale, chiamo _set_se_translator e passiamo in una funzione che genererà un'eccezione C++ invece di utilizzare le eccezioni di Windows strutturate. Questa funzione ottiene un codice di errore, per il quale è possibile ottenere un messaggio di errore di Windows tramite FormatMessage e un argomento PEXCEPTION_POINTERS, che è possibile utilizzare per scrivere un minidump (code here). È inoltre possibile controllare il codice di eccezione per alcuni errori "meltdown" che si deve solo bail da, come EXCEPTION_NONCONTINUABLE_EXCEPTION o EXCEPTION_STACK_OVERFLOW :) (Se è recuperabile, mi chiederà all'utente di scrivermi questo file minidump.)

Il file minidump può essere aperto in Visual Studio come un normale progetto e, purché tu abbia creato un file .pdb per il tuo eseguibile, puoi eseguire il progetto e salterà nella posizione esatta dell'incidente, insieme allo stack di chiamate e registri, che possono essere esaminati dal debugger.

0

È possibile utilizzare l'adplus per acquisire lo stack di arresto anomalo.

È possibile scaricare e installare gli strumenti di debug per Windows.

L'utilizzo di ADPlus è menzionata qui: Adplus usage

Questo crea il crollo completo o appendere discarica. Una volta che hai la discarica, Windbg viene in soccorso. Mappare i pdbs e i simboli corretti e si è pronti per analizzare il dump. Per iniziare, utilizzare il comando "! Analyze -v"