我在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在相同的二进制文件上工作正常)有没有办法用编译器标志来解决这个问题?
答案 0 :(得分:2)
.debug_loc
部分与计划源代码行的地址不匹配,这是.debug_line
部分的工作。
.debug_loc
部分包含位置列表,即变量所在的位置。如果变量在其生命周期中存在于许多位置,则需要位置列表,此位置列表放在.debug_loc
部分中。如果变量仅存在于一个位置,则位置表达式可以内嵌到.debug_info
部分。显然,如果不需要位置列表,则可以完全删除.debug_loc
部分。在没有变量的简单程序中,我有点惊讶的是,有一个.debug_loc
部分,没有看到完整的调试我不知道它用于什么。我后来(更好的)编译器设法删除了.debug_loc
部分的使用,我并不感到惊讶。
至于为什么旧版本的gdb在较新版本处理二进制文件时遇到困难,我猜这是一些较新的DWARF结构(DWARF是调试格式)。或者如果不是更新的构造可能只是一个以前从未见过的构造,因此在旧版本的gdb中不受支持。如果不能访问特定的二进制文件,就很难知道。
作为一般规则,请始终使用您有权访问的最新版本的gdb,以获得对最广泛的DWARF结构的支持。