这是我的代码:
/* 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 ("%s\n", 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
,我得到了
_start
- :0
这是我的平台
gcc版本5.3.0(GCC)
Linux 3.10.0_1-0-0-8
答案 0 :(得分:2)
我不应该真的回答这个问题,因为你确实没有问题或说明问题。但有时候我感觉很好......
虽然您编写的代码将使用main
函数开始执行,但实际起点在此之前的某个位置。有启动代码将初始化stdio系统(stdin
,stdout
等)并初始化其他内容。然后,此启动代码会像调用任何其他函数一样调用main
函数。
&#34;问题&#34;是启动代码实际上不是代码的一部分,它通常是前端程序链接程序的预编译目标文件。该目标文件可能没有任何类型的调试信息,因此您无法获得有关它的任何位置信息。