为什么gdb-7.4没有显示使用最近编译器生成的二进制文件的source-info?

时间:2015-09-23 08:09:43

标签: c debugging gcc gdb clang

我在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或更高版本不运气。

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

使用带有clang的线程消毒器时会出现同样的问题。它无法将源代码行与callstack关联起来。

为什么没有更多的debug_loc-section和/或为什么gdb 7.4无法处理缺少此部分的二进制文件? (GDB 7.7在相同的二进制文件上工作正常)有没有办法用编译器标志来解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

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

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

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