为什么 gdb-7.4 不显示最新编译器生成的二进制文件的源信息?

Why does gdb-7.4 does not show source-info on binaries generated with recent compilers?

我在 Ubuntu 12.04 上使用 gdb 7.4、gcc-4.6 和 gcc-4.8

构建这个简单程序时

#include <stdio.h>

int main(void)
{
    printf("hello world\n");
    return 0;
}

使用 gcc-4.6,然后使用 objdump -W 提取调试部分,我看到一个名为 .debug_loc 的部分。 gcc-4.8 或更高版本不是这样。使用 clang-3.6 或更高版本时运气不好。

我系统上的 gdb 版本 (7.4) 似乎需要此部分才能关联源和执行。

使用带有 clang 的 thread-sanitizer 时会出现同样的问题。它无法将源代码行与调用堆栈相关联。

为什么没有更多 debug_loc-section and/or 为什么 gdb 7.4 无法处理二进制文件而缺少此部分? (GDB 7.7 在同一个二进制文件上工作正常)有没有办法用编译器标志修复这个问题?

.debug_loc 部分不匹配程序源代码行的地址,这是 .debug_line 部分的工作。

.debug_loc 部分包含位置列表,即变量所在的位置。如果一个变量在它的生命周期中存在于许多地方,那么就需要一个位置列表,这个位置列表放在 .debug_loc 部分。如果一个变量只存在于一个地方,那么可以将位置表达式内联到 .debug_info 部分。显然,如果不需要位置列表,则可以完全删除 .debug_loc 部分。在没有变量的简单程序中,我有点惊讶曾经有一个 .debug_loc 部分,没有看到完整的调试,我不知道它的用途。我并不感到惊讶,后来的(更好的)编译器设法删除了 .debug_loc 部分的使用。

至于为什么较旧版本的 gdb 在较新版本处理二进制文件时遇到困难,我猜这是一些较新的 DWARF 构造(DWARF 是调试格式)。或者,如果不是更新的构造,则可能只是以前从未见过的构造,因此在旧版本的 gdb 中不受支持。如果无法访问特定的二进制文件,则很难知道。

作为一般规则,请始终使用您有权访问的最新版本的 gdb,以获得对最广泛的 DWARF 构造的支持。