【发布时间】:2022-07-02 07:36:42
【问题描述】:
当我用gcc -g -O1 t.c编译以下代码时
int main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 4;
return 0;
}
GCC 优化所有未使用的局部变量。这可以通过 GDB disassemble 命令看到,只剩下return 0 的指令:
(gdb) disassemble main
Dump of assembler code for function main:
0x0000000000401106 <+0>: mov $0x0,%eax
0x000000000040110b <+5>: ret
End of assembler dump.
但是,GDB 不知何故知道 C 代码中的变量值
(gdb) info locals
a = 1
b = 2
c = 3
d = 4
如果生成的汇编代码中不存在这些值,GDB 如何知道这些值?
【问题讨论】:
-
调试符号包含在可执行文件中,除非它们在构建过程中被删除。这就是 GDB 了解任何符号的方式。当您编译 C 时,所有符号(函数名、变量等)都会消失,因为它们只是为了帮助您编程。任何调试器都知道的唯一方法是它们包含在可执行文件的调试信息中。
-
@siride 您可以将其发布为问题的答案。
-
如果您通过
gcc -S或在 godbolt.org 上查看生成的汇编代码,您会看到类似.section .debug_info,"",@progbits的内容,并且在该部分中,虽然通常不是人类可读的,但您可以发现信息。 -
@ks1322:有什么意义?如果你的程序不是那么简单,而是包含了一个像
arr[ i + a ]这样的表达式。您可以将该表达式复制粘贴到 GDB 中,如果它具有来自调试符号的a的值,以及有关i和arr在运行时位于程序内存中的位置的实际信息,则可以对其进行正确评估。 -
@ikegami 这就是彼得所说的。这些优化的变量可能是表达式的一部分,如果它们没有被优化出来,了解它们会是什么是很有用的。