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

3

当我遇到核心转储(在段错误之后),并且我感兴趣的帧看起来像这样:

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

我该如何在 GDB 中提取给定帧中的参数值?

你可以尝试手动检查堆栈帧(info frame,info reg,x / <x> x $ sp ...)。看起来这个函数缺少调试信息,所以你可能需要反汇编代码并尝试理解发生了什么。 - dbrank0
函数的名称已经为我提供了足够的信息。我只是想知道参数的值。问题基本上是,如果我可以在不实际反汇编代码的情况下获取该值。我对gdb有基本的了解,但快速搜索没有给我任何结果。 - Pavel Horal
1
不知道在崩溃时该参数存储在哪里,例如它可能在寄存器中,在堆栈上,这取决于调用约定和函数当前状态。除非至少知道使用的处理器和操作系统(并且可能还取决于使用的编译器和优化级别),否则没有人会知道。 - Mats Petersson
@MatsPetersson 还有没有我可以参考的在线资源来学习这些东西?(顺便说一下,它是amd64,glibc cpp。) - Pavel Horal
http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ - dbrank0
1个回答

0

凭记忆而言,列出帧中参数的命令序列为:

frame 2
info args

2
最终结果为“没有可用的符号表信息。” - Pavel Horal
你有那段代码的调试符号吗?你能获取这样的版本吗?如果可以,你可以使用“symbol-file”命令加载符号,如果函数没有被大量优化,它应该可以工作。 - dbrank0
4
我猜这就是问题的关键:如何在不分配符号的情况下获取该值? - Pavel Horal
1
结合 disassembleinfo registersx,也许可以解决问题?(当然还需要理解实际的代码) - Mats Petersson
没有符号表,这些命令将无法工作,正如其他人所说的那样。你需要深入了解汇编语言才能获得所需的信息。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接