由于堆栈转向较小的addesses,使用gdb对它进行检查对我来说很费力。到目前为止我使用在gdb中检查堆栈的正确方法是什么?
x/64xw 0xffffd0e8-64*4
如果我想看以下它在堆栈上位于0xffffd0e8(堆栈上)的值以及值(在这种情况下一个32位机器上的以下64个字)。
有没有更简单的方法?
此外,有没有什么办法可以自动标记栈与相应的变量名称上的内容?或者每行只显示一个字,而不是四个?
由于堆栈转向较小的addesses,使用gdb对它进行检查对我来说很费力。到目前为止我使用在gdb中检查堆栈的正确方法是什么?
x/64xw 0xffffd0e8-64*4
如果我想看以下它在堆栈上位于0xffffd0e8(堆栈上)的值以及值(在这种情况下一个32位机器上的以下64个字)。
有没有更简单的方法?
此外,有没有什么办法可以自动标记栈与相应的变量名称上的内容?或者每行只显示一个字,而不是四个?
如果你没有调试信息来帮助你,有没有别的做的比知道ABI并用手阅读它,用GDB的帮助,你在做其他的,已经可以做一个很好的集仅基于ABI的事物(如回溯,但未命名呼叫者)。
如果你有你的二进制文件的调试信息,您可以用info locals
列出所选堆栈帧的局部变量,并在使用frame
,bt
,info frame
,info frame <address>
,up
,down
,etc堆栈导航。
你不能真正的“注释”的记忆,但你可以做的是创造convenience variables动态创建GDB的变量。
关于如何方便地读取存储大数组,我认为非常有用只需使用print
和铸造地址。例如:print (char(*)[]) 0xdeadbeef
。并且还使用artifical arrays来打印大区域。 GDB将聚合连续的相同值,使得读取同类存储区域(这不是堆栈的实际情况)非常清楚和容易。
请考虑使用'x/64xw $ esp'来代替。 – Jester
我知道。但有时我想检查当前帧,它不在栈顶。 –
定义一个辅助函数。 – Jester