Domanda

Se i miei C ++ app si blocca in Windows che desiderano inviare informazioni di debug utili al nostro server.

Su Linux Vorrei usare la funzione GNU backtrace() -? C'è un equivalente per Windows

C'è un modo per estrarre utili informazioni di debug dopo che un programma è andato in crash? 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)

È stato utile?

Soluzione

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

Se avete intenzione di utilizzare questa funzione, si dovrebbe essere sicuri di compilare il codice con FPO disabilitato -. Senza simboli, StackWalk64 non sarà in grado di camminare correttamente fotogrammi FPO'd

È possibile ottenere un po 'di codice in esecuzione nel processo, al momento dello schianto tramite un blocco di livello superiore __try/__except chiamando SetUnhandledExceptionFilter. Questo è un po 'inaffidabile in quanto richiede di avere il codice in esecuzione all'interno di un processo si è schiantato. In alternativa, si può semplicemente il built-in Windows Error Reporting per raccogliere i dati di crash. Questo è più affidabile, dal momento che non hai bisogno di aggiungere il codice in esecuzione all'interno del compromesso, processo si è schiantato. L'unico costo è quello di ottenere un certificato di firma del codice, dal momento che è necessario inviare un file binario firmato al servizio. https://sysdev.microsoft.com/en-US/Hardware/signup/ ha maggiori dettagli.

Altri suggerimenti

È possibile utilizzare la chiamata API di Windows MiniDumpWriteDump se lo si desidera a rotolare il proprio codice. Sia Windows XP e Vist automatizzare questo processo ed è possibile iscriversi a https://winqual.microsoft.com per accedere alle segnalazioni di errori.

http://kb.mozillazine.org/Breakpad e http://www.codeproject.com/KB/debug/crash_report.aspx per altre soluzioni .

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

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

Naturalmente, questo funziona solo all'interno del processo, per cui se il processo viene terminato o si blocca al punto in cui termina prima che il codice viene eseguito, non funzionerà.

Genera un file minidump. È quindi possibile caricare in windbg o Visual Studio e controllare l'intero stack in cui si è verificato l'incidente.

Ecco un buon posto per iniziare la lettura.

Il suo abbastanza semplice per scaricare gli indirizzi StackFrame attuali in un file di log. Tutto quello che dovete fare è ottenere una tale funzione ha invitato i guasti del programma (vale a dire un gestore di interrupt in Windows) oppure afferma. Questo può essere fatto al versioni rilasciate pure. Il file di log quindi può essere abbinato con un file di mappa con conseguente uno stack di chiamate con i nomi delle funzioni.

ho pubblicato un articolo su questo alcuni anni fa.

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

Lasciatemi descrivere come gestire crash nel mio C ++ / WTL applicazione.

In primo luogo, nella funzione principale, che io chiamo _set_se_translator e passare in una funzione che un'eccezione C ++ invece di utilizzare Windows strutturati eccezioni. Questa funzione consente di ottenere 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 il codice qui ). È 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 in sé può essere aperto in Visual Studio come un normale progetto e fornendo hai creato un file PDB per il vostro eseguibile, è possibile eseguire il progetto e si metterà a saltare alla posizione esatta dello schianto, insieme con lo stack di chiamate e registri, che può essere esaminato dal debugger.

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 (eseguire Drwtsn32.exe). Se si seleziona la 'generare crash dump' opzione, quando un app si blocca, si scriverà un mini file dump nel percorso specificato (chiamato user.dmp).

Si può prendere questo, combinarlo con i simboli creati quando hai costruito il server (impostare questo nel tuo compilatore / linker per generare file PDB - Conservare queste sicuro a casa, di usarli per abbinare la discarica in modo che possano lavorare la fonte dove si è verificato l'incidente)

windbg , aprirla e utilizzare l'opzione di menu per 'carico crash dump'. Una volta che è caricato tutto quello che è possibile digitare '~ # kp' per ottenere un callstack per ogni thread (o fare clic sul pulsante nella parte superiore per il thread corrente).

C'è buoni articoli per sapere come fare questo in tutto il web, Questo è il mio preferito, e si vorrà leggere questo per ottenere una comprensione di come helpyourself gestire i simboli molto facilmente.

Si dovrà creare un quadro generazione discarica nell'applicazione, qui è come si può fare.

Si può quindi caricare il file dump al server per l'ulteriore analisi utilizzando gli analizzatori discarica come windbg.

Si consiglia di utilizzare ADPlus per catturare l'callstack incidente.

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

L'utilizzo di ADPlus è menzionata qui: utilizzo Adplus

Questo crea il crollo completo o appendere discarica. Una volta che avete la discarica, Windbg viene in soccorso. Mappare i PDBs e simboli corretti e si è tutto pronto per analizzare il dump. Per iniziare con l'utilizzo del comando "! Analizzare -v"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top