我使用-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
)。输出包括aFunction
和main
,但不包括argc
而不包括intVariable
。
我已阅读了很多问题/答案/帖子/文章等。试图弄清楚为什么gcc / g ++没有为我的变量生成调试符号,但我无法解决这个问题。大多数消息来源仅提及-g
,-O0
,-Og
,以及避免-s
和编译优化。
我需要在gdb中调试符号。如果我gdb a.out
然后break main
,请让它运行并中断,然后bt
确认我在main
和print argc
或print 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)
开头的输出。
答案 0 :(得分:1)
nm
通常不会显示调试符号。您可以尝试使用-a
或--debug-syms
选项来显示它们。
为了更好地显示调试符号,您可以尝试dwarfdump
最可能的解释是你在可执行文件中获得了调试符号,但是gdb无法读取它们,因为你的发行版有一个旧的(呃)版本的gdb,它不能理解由new生成的矮人版本(呃)gcc的版本。解决方案通常是将gdb更新到最新版本(可能需要在某些发行版上从源代码构建)。