这是我的代码:
/* backtrace_foo1.c */
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#define BACKTRACE()
do {
void *array[20];
size_t size;
char **strings;
size_t i;
size = backtrace(array, 20);
strings = backtrace_symbols(array, size);
for (i = 0; i < size; i++) {
printf ("%sn", strings[i]);
}
free (strings);
} while(0)
void func1()
{
BACKTRACE();
}
void func()
{
func1();
}
int main(int argc, char **argv)
{
func();
return 0;
}
我通过gcc -g -rdynamic
编译并得到了
/a.out(func1+0x1f( [0x400905]
./a.out(func+0xe( [0x40097a]
./a.out(main+0x19( [0x400996]
/lib64/libc.so.6(__libc_start_main+0xfd( [0x318ae1ecdd]
./a.out(( [0x4007f9]
然后我用addr2line -e ./a.out -f 0x4007f9
,我得到了
_开始
??:0
这是我的平台
GCC 版本 5.3.0 (GCC(
Linux 3.10.0_1-0-0-8
我真的不应该回答这个问题,因为你真的没有问题或陈述的问题。但有时我感觉很好...
虽然您编写的代码将使用main
函数开始执行,但实际起点是在此之前的某个地方。有启动代码将初始化stdio系统(stdin
,stdout
等(并初始化其他内容。然后,此启动代码像调用任何其他函数一样调用main
函数。
"问题"在于启动代码并不是代码的一部分,它通常是前端程序链接程序的预编译对象文件。而且该对象文件可能没有任何类型的调试信息,因此您无法获取有关它的任何位置信息。