首页 > 解决方案 > 为什么 GDB 不能从带有信息符号的地址中找到符号?

问题描述

在尝试调试一些简单的代码时,我无法让 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++debugginggdbg++

解决方案


局部变量驻留在堆栈或寄存器中。访问堆栈与程序的符号表无关。如检查符号表中所述

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

局部变量的位置永远不会恒定,因为堆栈帧的当前位置取决于调用深度和许多其他因素。局部变量根本不是程序符号表的一部分,因此您无法使用symbol命令检查它们。

您可以通过简单地从 shell 调用来查看符号表中的内容nm,也许还可以使用 c++filt 来获得可读的名称。

> nm|c++filt


推荐阅读