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

C 为什么gdb-7.4不显示使用最新编译器生成的二进制文件的源代码信息?,c,debugging,gcc,gdb,clang,C,Debugging,Gcc,Gdb,Clang,我使用的是Ubuntu12.04和GDB7.4、gcc-4.6和gcc-4.8 在构建这个简单的程序时 #include <stdio.h> int main(void) { printf("hello world\n"); return 0; } #包括 内部主(空) { printf(“hello world\n”); 返回0; } 使用gcc-4.6,然后使用objdump-W提取调试部分,我看到一个名为.debug\u loc的部分。gcc-4.8或更高

我使用的是Ubuntu12.04和GDB7.4、gcc-4.6和gcc-4.8

在构建这个简单的程序时

#include <stdio.h>

int main(void)
{
    printf("hello world\n");
    return 0;
}
#包括
内部主(空)
{
printf(“hello world\n”);
返回0;
}
使用gcc-4.6,然后使用
objdump-W
提取调试部分,我看到一个名为
.debug\u loc
的部分。gcc-4.8或更高版本并非如此。使用clang-3.6或更高版本都不走运

我的系统(7.4)上的gdb版本似乎要求本节能够将源代码和执行关联起来

使用带有叮当声的线程消毒剂时也会出现同样的问题。它无法将源代码行与调用堆栈相关联


为什么不再有debug_loc-section和/或为什么gdb 7.4无法处理缺少该部分的二进制文件?(GDB 7.7在同一个二进制文件上运行良好)有没有办法用编译器标志来解决这个问题?

部分的
.debug\u loc
与程序源代码行的地址不匹配,这是
.debug\u line
部分的工作


.debug\u loc
部分包含位置列表,即变量所在的位置。如果变量在其生命周期内存在于多个位置,则需要位置列表,此位置列表位于
.debug\u loc
部分。如果变量仅存在于一个位置,则可以将位置表达式内联放置到
.debug\u info
部分。显然,如果不需要位置列表,则可以完全删除
.debug\u loc
部分。在没有变量的简单程序中,我有点惊讶于曾经有一个
.debug\u loc
部分,没有看到完整的调试,我不知道它的用途。对于后来(更好)的编译器成功地删除了
.debug\u loc
部分的使用,我并不感到惊讶

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


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

感谢您的解释。你对矮人版的提示对我来说是关键:尝试gcc-4.8-ggdb3没有帮助。但是gcc-4.8-gdwarf-2让gcc生成我的gdb可以使用的调试信息,而clang的tsan现在也向我显示了源位置。