Domanda

Al momento sto porting nostro codice da un'alfa (Tru64) ad un processore i386 (Linux) in C. Tutto è andato abbastanza liscio fino a quando ho guardato in porting nostro la gestione di routine eccezioni. Attualmente abbiamo un processo padre, che depone le uova un sacco di processi secondari, e quando uno di questi sotto-processi di fatali (unfielded) mi hanno routine di catturare il processo.

Al momento sto lottando per trovare il metodo migliore per l'implementazione di una routine di traceback che può elencare gli indirizzi di funzione nel registro degli errori, attualmente la mia routine si limita a stampare il segnale che ha causato l'eccezione e il codice di eccezione qualificatore.

Qualsiasi aiuto sarebbe molto ricevuto, idealmente vorrei scrivere la gestione degli errori per tutti i processori, tuttavia in questa fase mi interessa davvero solo i386 e x86_64.

Grazie

Mark

È stato utile?

Soluzione

Le funzioni glibc backtrace() e backtrace_symbols(), da execinfo.h, potrebbe essere utile.

Altri suggerimenti

Si potrebbe guardare http://tlug.up.ac.za /wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV . Esso copre le funzionalità necessarie. Tuttavia è necessario collegare contro libgdb e libdl, compilare con -rdynamic (include altri simboli nella eseguibile), e rinunciare l'uso di alcune ottimizzazioni.

Ci sono due funzioni GNU (non-POSIX) che possono aiutare - backtrace() e backtrace_symbols() - prima rendimenti array di indirizzi di funzione e si risolve secondo gli indirizzi ai nomi. Purtroppo non possono essere risolti nomi delle funzioni statiche.

Per farlo funzionare è necessario compilare il binario con la bandiera -rdynamic.

Purtroppo, ci non è un metodo "migliore", poiché la struttura della pila può variare a seconda della CPU, il sistema operativo e il compilatore utilizzato per compilare il codice. Ma questo articolo può aiutare .

Si noti che è necessario implementare questo nel processo figlio ; il processo genitore ottiene solo un segnale che qualcosa non va; non si ottiene una copia dello stack bambino.

Se un commento è stato che si sta utilizzando gcc. Questo http: //gcc.gnu .org / onlinedocs / gcc-4.4.3 / gcc / Return-Address.html # Return-Indirizzo potrebbe essere utile.

Se stai bene con solo ottenere backtrace corretti quando si esegue attraverso valgrind, allora questo potrebbe essere un'opzione per voi:

VALGRIND_PRINTF_BACKTRACE (formato, ...):

Vi darà la backtrace per tutte le funzioni, compresi quelli statici.

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