Я удивлен, почему все говорят, что это невозможно. Это возможно в Linux для нестатических функций.
Я знаю как минимум два способа добиться этого.
Существуют функции GNU для печати обратной трассировки: backtrace()
и backtrace_symbols()
(см. man
). В вашем случае вам не нужен backtrace()
, так как у вас уже есть указатель на функцию, вы просто передаете его в backtrace_symbols()
.
Пример (рабочий код):
#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;
}
Компилировать с gcc test.c -rdynamic
Выход: ./a.out(foo+0x0)[0x8048634]
Он дает двоичное имя, имя функции, смещение указателя от начала функции и значение указателя, чтобы вы могли проанализировать его.
Другой способ - использовать dladdr()
(другое расширение), я думаю, print_backtrace()
использует dladdr()
. dladdr()
возвращает структуру Dl_info
с именем функции в поле dli_sname
. Я не привожу здесь пример кода, но он очевиден - подробности см. man dladdr
.
NB! Оба подхода требуют, чтобы функция была нестатичной!
Что ж, есть еще один способ - использовать отладочную информацию, используя libdwarf
, но для этого потребуется двоичный файл без разметки, а сделать это будет не очень легко, поэтому я не рекомендую его.