gcc / g ++不为变量生成调试符号

时间:2016-10-21 23:11:14

标签: gcc g++

我使用-g-O0-Og及其各种组合(甚至是gcc -g -Og -c main.c -O0 -g -g -g -g)尝试了gcc和g ++。我不知道变量的符号。

我使用以下代码制作了一个简化的测试程序:

#include <stdio.h>

void aFunction() { printf("?\n"); }

int main(int argc, char** argv)
{
    int intVariable = 0;
    printf("argc = %d, intVariable = %d\n", argc, intVariable);
    return 0;
}

即使使用gcc或g ++编译的代码,使用-g / -O0 / -Og的所有方式,也要尝试-c以确保链接阶段没有将其剥离,仍然在.o或.out文件我可以看到函数而不是变量。

我正在检查nm main.o(或省略-c时nm a.out)。输出包括aFunctionmain,但不包括argc而不包括intVariable

我已阅读了很多问题/答案/帖子/文章等。试图弄清楚为什么gcc / g ++没有为我的变量生成调试符号,但我无法解决这个问题。大多数消息来源仅提及-g-O0-Og,以及避免-s和编译优化。

我需要在gdb中调试符号。如果我gdb a.out然后break main,请让它运行并中断,然后bt确认我在mainprint argcprint intVariable在当前的背景下,我得到了“无符号”argc。因为它们的符号不存在。

在gdb中运行时,我也收到消息“Missing separate debuginfos,use:debuginfo-install glibc -...”我在这里提到它是为了完整性,但我不认为这是相关的,因为我理解正确地说,只有在我想调试更低级别的glibc特定代码时才需要这样做。如果我错了,请纠正我。

这不是我第一次尝试解决这个问题,而这次尝试又浪费了很多时间。如果我能正确使用gdb会很棒。

如何解决已编译代码中缺少的符号?

我正在使用gcc 4.9.2。我已经在几台不同的计算机上测试过几个版本的Red Hat。我没有能力更改任何版本或在工作中安装任何东西,但我可能会在家里尝试不同版本的gcc或操作系统。

Chris Dodds指出,也许这是我的GDB版本,而不是我的版本或用法或GCC。执行gdb --version会产生以GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6)开头的输出。

1 个答案:

答案 0 :(得分:1)

nm通常不会显示调试符号。您可以尝试使用-a--debug-syms选项来显示它们。

为了更好地显示调试符号,您可以尝试dwarfdump

最可能的解释是你在可执行文件中获得了调试符号,但是gdb无法读取它们,因为你的发行版有一个旧的(呃)版本的gdb,它不能理解由new生成的矮人版本(呃)gcc的版本。解决方案通常是将gdb更新到最新版本(可能需要在某些发行版上从源代码构建)。