GDB为什么无法从带有信息符号的地址中找到符号?

时间:2020-04-29 16:56:27

标签: c++ debugging gdb g++

在尝试调试一些简单的代码时,我无法让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仅适用于全局对象吗?

1 个答案:

答案 0 :(得分:1)

局部变量驻留在堆栈中或可能位于寄存器中。访问堆栈与程序的符号表无关。如Examining the symbol table

中所述

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

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

只需从外壳中调用nm,您就可以查看符号表中的内容,也许还可以使用c ++ filt来获得可读的名称。

> nm|c++filt