在尝试调试一些简单的代码时,我无法让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
仅适用于全局对象吗?
答案 0 :(得分:1)
局部变量驻留在堆栈中或可能位于寄存器中。访问堆栈与程序的符号表无关。如Examining the symbol table
中所述本章中描述的命令使您可以查询程序中定义的符号(变量的名称,函数和类型)。该信息是程序文本中固有的信息,不会随着程序执行而改变。
局部变量的位置永远不会恒定,因为堆栈帧的当前位置取决于调用深度和许多其他因素。局部变量根本不属于程序符号表的一部分,因此您无法使用symbol
命令对其进行检查。
只需从外壳中调用nm
,您就可以查看符号表中的内容,也许还可以使用c ++ filt来获得可读的名称。
> nm|c++filt