【发布时间】:2016-10-21 23:11:13
【问题描述】:
我已经尝试过 gcc 和 g++,它们中的每一个都使用 -g、-O0、-Og 以及它们的各种组合,甚至是 gcc -g -Og -c main.c -O0 -g -g -g -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 中运行时,我还收到消息“缺少单独的调试信息,请使用: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) 开头的输出。
【问题讨论】:
-
您使用的是什么版本的 gdb? gcc4.9 通常会生成较旧版本的 gdb 无法理解的 dwarf v4 调试符号,但通常您会从 gdb 收到关于无法读取调试符号的错误。
-
gdb --version输出:GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6) 版权所有 (C) 2010 Free Software Foundation, Inc. 许可证 GPLv3+:GNU GPL 版本 3 或更高版本(这里有更多不相关的许可证信息)这个 GDB 被配置为“x86_64-redhat-linux-gnu”。 -
而
gcc --version提供4.9.2 -
这是一个非常古老的 gdb 版本。我已经成功地将 7.8.1 与 gcc 4.9 一起使用。 7.12 似乎是最新的 gdb 版本。
-
我会看看我是否可以更新 GDB。希望这就是问题的全部。如果/何时(这是一个很大的如果/何时)我会报告我可以让某人更新 GDB。我之前曾要求对其进行更新但没有成功,但由于它现在可能实际上会导致问题,我将尝试将其向上移动。谢谢。