有的时候程序需要查看进程在某些极端情况下进入某个函数时,需要看是哪个函数调用它。
这个时候可以使用backtrace进行打印。
#include<stdio.h>
#include<stdlib.h>
#include<execinfo.h>
void print_trace()
{
void *array[10];
size_t size;
char **strings;
size_t i;
size = backtrace(array, 10);
strings = backtrace_symbols(array, size);
if (NULL == strings) {
perror("backtrace_symbols");
exit(1);
}
printf("Obtained %zd stack frames.\n", size);
for (i = 0; i < size ; i++) {
printf("%s\n", strings[i]);
}
free(strings);
strings = NULL;
}
void dummy_function(void)
{
print_trace();
}
int main()
{
dummy_function();
return 0;
}
编译
$ gcc backtrace_test.c -rdynamic -g
输出:
Obtained 5 stack frames.
./a.out(print_trace+0x28) [0x400a2e]
./a.out(dummy_function+0xe) [0x400aed]
./a.out(main+0x9) [0x400af9]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7f0b3d509830]
./a.out(_start+0x29) [0x400939]