我试图使用核心文件中的宏来查找堆栈的开始和结束.为了实现同样的目的,我试图从最后一帧和第一帧中找到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
Run Code Online (Sandbox Code Playgroud)
你可以看到最外面的框架是#9.
然而,脚本编写这有点痛苦.例如,您无法使用它frame -1来选择该帧.
此时您有两种选择.
一种选择是使用gdb Python API迭代帧并做任何你喜欢的事情.如果可以使用,这是最简单的路线.Python API已记录并易于使用; 在这种情况下,您将主要对gdb.Frame代码感兴趣.
如果你不能使用Python,你可以使用传统的,可怕的gdb hack来使用set logging写入bt -1文件的输出; 然后shell将此文件的内容重写为有效的gdb命令(如frame 9); 最后source得到的转换文件.