gpt4 book ai didi

c++ - 为什么 GDB 不能从带有信息符号的地址中找到符号?

转载 作者:行者123 更新时间:2023-12-01 14:52:49 24 4
gpt4 key购买 nike

当尝试调试一些简单的代码时,我无法让 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 是否只对全局对象有效?

最佳答案

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

The commands described in this chapter allow you to inquire about the symbols (names of variables, functions and types) defined in your program. This information is inherent in the text of your program and does not change as your program executes.

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

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

> nm|c++filt

关于c++ - 为什么 GDB 不能从带有信息符号的地址中找到符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61507267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com