GDB回溯:查找总帧数

GDB回溯:查找总帧数,gdb,Gdb,我试图从核心文件中使用宏来查找堆栈的开始和结束。为了达到同样的效果,我试图从最后一帧和第一帧中找到esp值。相同的差异将给出正在使用的堆栈大小 我们有办法找到堆栈中的帧数吗? 给我所有的框架。从第0帧我可以找到堆栈的顶部? 我们有办法找到最后一帧的编号吗 我们是否有其他方法来找到堆栈的开始和结束? 谢谢您可以使用bt-1找到最外层帧的帧号: (gdb) bt -1 #9 0x0000000000464c45 in main (argc=<optimized out>, argv=&

我试图从核心文件中使用宏来查找堆栈的开始和结束。为了达到同样的效果,我试图从最后一帧和第一帧中找到esp值。相同的差异将给出正在使用的堆栈大小

我们有办法找到堆栈中的帧数吗? 给我所有的框架。从第0帧我可以找到堆栈的顶部? 我们有办法找到最后一帧的编号吗

我们是否有其他方法来找到堆栈的开始和结束?
谢谢

您可以使用
bt-1
找到最外层帧的帧号:

(gdb) bt -1
#9  0x0000000000464c45 in main (argc=<optimized out>, argv=<optimized out>)
    at ../../binutils-gdb/gdb/gdb.c:32
(gdb)bt-1
#主屏幕中的9 0x0000000000464c45(argc=,argv=)
在.././binutils gdb/gdb/gdb.c:32
您可以看到最外面的帧是
#9

然而,编写脚本有点痛苦。例如,不能使用
frame-1
选择该帧

此时,您有两个选择

一个选项是使用gdb-pythonapi在帧上迭代,并执行任何您喜欢的操作。这是最简单的路线,如果你可以的话。pythonapi是文档化的,易于使用;在这种情况下,您将主要对
gdb.Frame
代码感兴趣

如果你不能使用Python,你可以使用传统的、可怕的gdb黑客,使用
set logging
bt-1
的输出写入一个文件;然后
shell
将此文件的内容重写为有效的gdb命令(如
frame 9
);最后是
source
生成的转换文件