addr2line print" ??:0"即使我使用`gcc -g`

时间:2017-08-25 08:21:28

标签: c linux

这是我的代码:

/* 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

1 个答案:

答案 0 :(得分:2)

我不应该真的回答这个问题,因为你确实没有问题或说明问题。但有时候我感觉很好......

虽然您编写的代码将使用main函数开始执行,但实际起点在此之前的某个位置。有启动代码将初始化stdio系统(stdinstdout等)并初始化其他内容。然后,此启动代码会像调用任何其他函数一样调用main函数。

&#34;问题&#34;是启动代码实际上不是代码的一部分,它通常是前端程序链接程序的预编译目标文件。该目标文件可能没有任何类型的调试信息,因此您无法获得有关它的任何位置信息。