c - addr2line 打印 "??:0"即使我使用 `gcc -g`

标签 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 version 5.3.0 (GCC)

Linux 3.10.0_1-0-0-8

最佳答案

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

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

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

关于c - addr2line 打印 "??:0"即使我使用 `gcc -g`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45877192/

相关文章:

TLB(加载字)异常是否会因错误的编译器选项使用而引起?

C 自动返回类型

c - 与 Ubuntu 相比,我的 C 代码在 Mac 中运行缓慢

c - 提取子进程 PID 最后一位数字

linux - 用于重新启动程序的 Bash 函数

java - 为什么 exec ('java -jar file.jar' ) 不能在浏览器上工作但在命令行上工作?

linux - 尝试比较 shell 脚本中的字符串时出错

linux - 我想要一个 linux 命令来查找系统上用户 id 大于 11 的所有用户?

C 将有符号整数转换为二进制到长

c - 为什么导出的网络设备 xmit 调用导致内核崩溃?