为什么GDB不能从带有info符号的地址中找到符号?

问题描述 投票:2回答:1

当我试图调试一些简单的代码时,我无法让GDB从一个带有信息符号的内存地址中识别一个局部变量。info symbol.

该代码是用以下方法编译的 g++ -g3 -Wall -Wextra.

int main()
{
    int foo = 1234;
    return foo;
}
(gdb) p foo
$1 = 1234
(gdb) p &foo
$2 = (int *) 0x7fffffffd7c4
(gdb) info symbol 0x7fffffffd7c4
No symbol matches 0x7fffffffd7c4.
(gdb) info address foo
Symbol "foo" is a complex DWARF expression:
     0: DW_OP_fbreg -28
.

为什么在这种情况下,GDB不能识别变量?难道 info symbol 只对全局对象有效?

c++ debugging gdb g++
1个回答
1
投票

局部变量驻留在堆栈上,也可能在寄存器中。访问栈与程序的符号表无关。正如在 检查符号表

本章描述的命令允许你查询程序中定义的符号(变量、函数和类型的名称)。这些信息是程序文本中固有的,不会随着程序的执行而改变。

局部变量的位置从来都不是恒定不变的,因为堆栈框架的当前位置取决于调用深度和其他许多东西。局部变量根本不是程序符号表的一部分,所以你无法用 symbol 命令,就可以看到符号表中的内容。

您可以通过简单地调用 nm 从你的shell中,也许还可以用c++filt来获得可读的名字。

> nm|c++filt

© www.soinside.com 2019 - 2024. All rights reserved.