【问题标题】:addr2line print "??:0" even i use `gcc -g` [closed]addr2line print "??:0" 即使我使用`gcc -g` [关闭]
【发布时间】:2025-12-18 04:00:01
【问题描述】:

这是我的代码:

/* 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,我得到了

_开始

??:0

这是我的平台

gcc 版本 5.3.0 (GCC)

Linux 3.10.0_1-0-0-8

【问题讨论】:

标签: c linux


【解决方案1】:

我不应该真正回答这个问题,因为您并没有真正的问题或陈述的问题。但有时我感觉很好......

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

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

【讨论】:

  • 我已经准备好把它当作 *.com/questions/7648642/… 的骗子来敲诈了,但在我看来,你的答案在某种程度上有所不同。由于您对这个主题有更多的了解,请使用您的判断来将其作为骗子关闭。
  • @bolov 那个问题的问题其实是一样的,但问题是不同的。该问题询问如何使用addr2line,而不询问为什么无法获取信息,并且答案遵循该行。这个问题(我假设)是关于为什么 addr2line 没有提供任何信息。