2010-05-29 5 views
1

Supposons que je donne les résultats suivants:utiliser la fonction de rappel pour signaler pile backtrace

typedef struct { 
    char *name; 
    char binding; 
    int address; 
} Fn_Symbol    //definition of function symbol 

static Fn_Symbol *fnSymbols; //array of function symbols in a file 
statc int total; //number of symbol functions in the array and file 

static void PrintBacktrace(int sigum, siginfo_t * siginfo, void *context) 
{ 
    printf("\nSignal received %d (%s)\n", signum, strsignal(signum)); 
    const int eip_index = 14; 
    void *eip = (void *)((struct ucontext *)context)->uc_mcontext.gregs[eip_index]; 
    printf("Error at [%p] %s (+0x%x), eip, fnName, offset from start); //????? 
    exit(0); 
} 

J'ai ce jusqu'à présent, mais quelle est la meilleure façon en utilisant le pointeur global fnSymbols statique pour identifier la fonction où l'erreur est survenue et puis retour trace à travers la pile pour identifier chaque fonction d'appel par adresse, nom et décalage?

+0

http://stackoverflow.com/questions/3151779/how-its-better-to-invoke-gdb-from-program-to-print-its-stacktrace/4611112#4611112 – karlphillip

Répondre

0

Sur Linux, recherchez outil nommé addr2line. Votre application devrait être compilée avec l'option -rdynamic. Les éléments suivants:

addr2line 0x8048a76 -f -e app_name 

génère le nom de la fonction et également le numéro de ligne sur le code source.

+0

@ user363069 Cochez cette réponse pour savoir comment le faire par programmation: http://stackoverflow.com/questions/3151779/how-its-better-to-invoke-gdb-from-program-to-print-its- pile de cheminées/4611112 # 4611112 – karlphillip

Questions connexes