C - addr2line print "??:0" 即使我使用'gcC语言 g'



这是我的代码:

/* 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系统(stdinstdout等(并初始化其他内容。然后,此启动代码像调用任何其他函数一样调用main函数。

"问题"在于启动代码并不是代码的一部分,它通常是前端程序链接程序的预编译对象文件。而且该对象文件可能没有任何类型的调试信息,因此您无法获取有关它的任何位置信息。

最新更新