Domanda

Voglio accedere allo stack di chiamate in fase di esecuzione in un'applicazione C ++ nativa. Non sto usando l'IDE. Come posso visualizzare lo stack di chiamate?

Aggiornamento: ho una funzione che viene chiamata da molti punti in tutta l'applicazione. Si schianta in rare occasioni. Stavo cercando un modo per ottenere il nome del chiamante e registrarlo.

È stato utile?

Soluzione

Credo che questa pagina ha la risposta che stai cercando. Hai detto Visual C, quindi presumo tu intenda Windows.

Altri suggerimenti

Dai un'occhiata a StackWalk64 .

Se sei abituato a farlo su .NET, allora ti aspetta una brutta sorpresa.

Dovresti considerare di impostare il tuo filtro di eccezione non gestito e di scrivere un file minidump dall'interno. Non è poi così complicato ed è ben documentato . Basta attenersi al minimo delle cose che fai una volta nel filtro delle eccezioni non gestite (leggi cosa può andare andare tutto male se diventi creativo).

Ma per essere al sicuro (il tuo filtro delle eccezioni non gestito potrebbe essere sovrascritto inavvertitamente), potresti mettere il tuo codice in __try / __ tranne il blocco e scrivere il minidump all'interno della funzione filtro (nota, non puoi avere oggetti che richiedono automaticamente svolgersi in una funzione con __try / __ tranne il blocco, se li hai, considera di metterli in una funzione separata):

long __stdcall myfilter (EXCEPTION_POINTERS * pexcept_info)
{
& Nbsp; & nbsp; & nbsp; & nbsp; mycreateminidump (pexcept_info);
& nbsp; & nbsp; & nbsp; & nbsp; return EXCEPTION_EXECUTE_HANDLER;
}
void myfunc ()
{
__try {
& nbsp; & nbsp; & nbsp; & nbsp; // la tua logica qui
} __except (myfilter (GetExceptionInformation ())) {
& nbsp; & nbsp; & nbsp; & nbsp; // eccezione gestita
}
}

È quindi possibile ispezionare il file di dump con un debugger di propria scelta. Sia Visual Studio che debugger dal pacchetto Strumenti di debug di Windows possono gestire minidump.

Se vuoi ottenere un callstack del crash, quello che vuoi veramente fare è debug post mortem . Se si desidera controllare un callstack dell'applicazione mentre è in esecuzione, questa è una delle molte funzioni SysInternals Process Explorer può offrire.

Se non esegui il debug attivo, puoi " crash " l'app per produrre un minidump (questo può essere fatto in modo non invasivo e consente all'app di continuare a funzionare). IIRC DrWatson ti consentirà di farlo, se non lo scaricherà l'utente dal supporto MS.

È quindi possibile caricare il dump in windbg e vedere il callstack + variabili ecc. lì. Avrai bisogno dei simboli della tua app per dare un senso alla traccia.

Se stai cercando tracce di un codice di runtime più semplici, ti consiglio una semplice classe da istanziare su ogni metodo, il costruttore scrive il nome del metodo usando OutputDebugString. Utilizzare WinDebug per visualizzare la traccia durante l'esecuzione del programma. (inserisci una qualche forma di controllo nella tua classe, anche se è solo una variabile globale o un valore di registro, o Atom globale in modo da poter attivare o disattivare la traccia a piacimento).

  

Si blocca in rare occasioni. Stavo cercando un modo per ottenere il nome del chiamante e registrarlo.

Cosa intendi con "crash"? Violazione di accesso? Dividi per zero? che cosa esattamente? Interagisce con i componenti in modalità kernel?

Attiva appverificatore. ciò dovrebbe eliminare molte cose.

crea questo:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Opzioni di esecuzione file immagine \ FileName.exe

sotto quella chiave, crea una nuova stringa nome: debugger valore: c: \ pathtowindbg \ windbg.exe -gG -xe av

Se stai eseguendo il codice a 32 bit con WOW, devi farlo sotto il wow3264node.

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