是否可以使用 GDB 查看未命名的框架/函数参数?

Posted

技术标签:

【中文标题】是否可以使用 GDB 查看未命名的框架/函数参数?【英文标题】:Is it possible to view unnamed frame / function argument with GDB? 【发布时间】:2016-07-04 06:49:43 【问题描述】:

当我有一个核心转储(在段错误之后)并且我感兴趣的框架看起来像这样时:

#2  0x000000000043cbfa in foo::Bar::baz(float) ()

如何使用 GDB 提取给定框架中的参数值?

【问题讨论】:

您可以尝试手动检查堆栈帧(信息帧、信息注册、x/x $sp...)。看起来此函数缺少调试信息,因此您可能必须反汇编代码并尝试了解发生了什么。 函数名对我来说已经足够信息了。我只想知道参数值。问题基本上是我是否可以在不实际反汇编代码的情况下获得值。我有 gdb 的基本知识,但快速谷歌搜索没有结果。 在崩溃时也不知道该参数存储在哪里 - 例如它可能位于堆栈中的寄存器中,具体取决于调用约定和函数中的当前状态。没有人知道至少不知道什么处理器和什么操作系统(并且可能也取决于使用什么编译器和什么优化级别) @MatsPetersson 我可以通过任何在线资源了解这些内容吗? (顺便说一句。它是 amd64,glibc cpp。) eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64 【参考方案1】:

离开记忆。在框架中列出参数的命令序列是

frame 2
info args

【讨论】:

最后是 “没有可用的符号表信息。” 你有那个代码的调试符号吗?你能得到这样的版本吗?如果可以的话,你可以使用“symbol-file”命令来加载符号,如果功能没有经过大量优化,它应该可以工作。 我想这就是问题的症结所在:如何在没有分配符号的情况下获取值? 可能是disassembleinfo registersx 的组合? (当然还要了解实际代码) 没有符号表,这些命令将无法工作,正如其他人所说。您需要深入了解程序集以获取所需的信息。

以上是关于是否可以使用 GDB 查看未命名的框架/函数参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 gdb tui 程序集输出以显示指令?

JavaScript:未命名函数的参数

PostgreSQL中的函数中是不是有命名参数的约定

gdb小结

在某些情况下,ADO 组件,尤其是 TADOCommand,是不是可以更可靠地使用未命名或命名参数?

第一部分牛刀小试:启动GDB开始调试