我正在尝试使用核心文件中的宏来查找堆栈的开始和结束。为了完成同样的任务,我试图从 last 和 first frame 中找到 esp 值。相同的差异会给我使用中的堆栈大小。
我们有办法找到堆栈中的帧数吗?bt 给我所有的框架。从第 0 帧我可以找到堆栈的顶部吗?我们有办法找到最后一帧号吗?
我们是否有另一种方法来找到堆栈的开始和堆栈的结束?谢谢
我正在尝试使用核心文件中的宏来查找堆栈的开始和结束。为了完成同样的任务,我试图从 last 和 first frame 中找到 esp 值。相同的差异会给我使用中的堆栈大小。
我们有办法找到堆栈中的帧数吗?bt 给我所有的框架。从第 0 帧我可以找到堆栈的顶部吗?我们有办法找到最后一帧号吗?
我们是否有另一种方法来找到堆栈的开始和堆栈的结束?谢谢
您可以使用以下方法找到最外层框架的帧号bt -1
:
(gdb) bt -1
#9 0x0000000000464c45 in main (argc=<optimized out>, argv=<optimized out>)
at ../../binutils-gdb/gdb/gdb.c:32
你可以看到最外面的框架是#9
。
但是,编写脚本有点痛苦。例如,您不能使用frame -1
来选择该框架。
此时,您有两个选择。
一种选择是使用 gdb Python API 来迭代帧并做任何你喜欢的事情。如果您可以使用,这是最简单的路线。Python API 有文档且易于使用;在这种情况下,您将主要对gdb.Frame
代码感兴趣。
如果你不能使用 Python,你可以使用传统的、可怕的 gdb hackset logging
来将输出写入bt -1
文件;然后shell
将该文件的内容重写为有效的 gdb 命令(如frame 9
);最后source
是生成的转换文件。