2017-01-25 60 views
1

由于堆栈转向较小的addesses,使用gdb对它进行检查对我来说很费力。到目前为止我使用在gdb中检查堆栈的正确方法是什么?

x/64xw 0xffffd0e8-64*4 

如果我想看以下它在堆栈上位于0xffffd0e8(堆栈上)的值以及值(在这种情况下一个32位机器上的以下64个字)。

有没有更简单的方法?

此外,有没有什么办法可以自动标记栈与相应的变量名称上的内容?或者每行只显示一个字,而不是四个?

+1

请考虑使用'x/64xw $ esp'来代替。 – Jester

+0

我知道。但有时我想检查当前帧,它不在栈顶。 –

+0

定义一个辅助函数。 – Jester

回答

2

如果你没有调试信息来帮助你,有没有别的做的比知道ABI并用手阅读它,用GDB的帮助,你在做其他的,已经可以做一个很好的集仅基于ABI的事物(如回溯,但未命名呼叫者)。

如果你有你的二进制文件的调试信息,您可以用info locals列出所选堆栈帧的局部变量,并在使用framebtinfo frameinfo frame <address>updownetc堆栈导航。

你不能真正的“注释”的记忆,但你可以做的是创造convenience variables动态创建GDB的变量。

关于如何方便地读取存储大数组,我认为非常有用只需使用print和铸造地址。例如:print (char(*)[]) 0xdeadbeef。并且还使用artifical arrays来打印大区域。 GDB将聚合连续的相同值,使得读取同类存储区域(这不是堆栈的实际情况)非常清楚和容易。

相关问题