Je suis surpris de voir pourquoi tout le monde dit qu'il n'est pas possible. Il est possible sur Linux pour les non-statique fonctions.
Je connais au moins deux façons d'y parvenir.
Il y a GNU fonctions de trace d'impression: backtrace()
et backtrace_symbols()
(Voir man
). Dans votre cas, vous n'avez pas besoin d' backtrace()
que vous avez déjà pointeur de fonction, vous venez de passer à l' backtrace_symbols()
.
Exemple (code du travail):
#include <stdio.h>
#include <execinfo.h>
void foo(void) {
printf("foo\n");
}
int main(int argc, char *argv[]) {
void *funptr = &foo;
backtrace_symbols_fd(&funptr, 1, 1);
return 0;
}
Compiler avec gcc test.c -rdynamic
Sortie: ./a.out(foo+0x0)[0x8048634]
Il vous donne binaires nom, nom de fonction offset du pointeur de fonction et la valeur du pointeur de sorte que vous pouvez l'analyser.
Une autre façon est d'utiliser des dladdr()
(un autre poste), je suppose print_backtrace()
utilise dladdr()
. dladdr()
retours Dl_info
de la structure qui a le nom de la fonction dli_sname
champ. Je n'ai pas fournir le code exemple ici, mais il est évident - voir man dladdr
pour plus de détails.
NB! Les deux approches nécessitent de la fonction non-statique!
Eh bien, il ya une façon de plus pour utiliser les informations de débogage à l'aide de libdwarf
mais il faudrait des remontées binaire et pas très facile à faire, donc je ne le recommande pas.