c++ - 为什么 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
仅适用于全局对象吗?
解决方案
局部变量驻留在堆栈或寄存器中。访问堆栈与程序的符号表无关。如检查符号表中所述
本章描述的命令允许您查询程序中定义的符号(变量名、函数名和类型)。此信息是程序文本中固有的,不会随着程序的执行而改变。
局部变量的位置永远不会恒定,因为堆栈帧的当前位置取决于调用深度和许多其他因素。局部变量根本不是程序符号表的一部分,因此您无法使用symbol
命令检查它们。
您可以通过简单地从 shell 调用来查看符号表中的内容nm
,也许还可以使用 c++filt 来获得可读的名称。
> nm|c++filt
推荐阅读
- sql - 内部连接表 A 和 B 返回 50 行。左连接 B 到 A 返回 125 行。这里发生了什么?
- node.js - 将 React 应用程序的内容移动到另一个文件夹后出现 npm 启动错误
- python-camelot - 多页pdf上的不同table_areas
- python - 交互 Python 笔记本/组件的概念(例如,用于多智能体强化学习) - 类似 EJB-bean 的组件?
- python - TS SS 矢量相似度使用矩阵
- kotlin - 协程没有完成,因为它有一个与之关联的异步没有完成,如何独立运行异步?
- unity3d - Unity 错误 CS1503 将双精度转换为浮点
- python - 在Python中的列表中减去浮点值
- elasticsearch - 搜索引擎正确有效的 Elasticsearch 结构
- nuxt.js - 如何在 Nuxt 中为 .env 文件指定另一个目录或名称