首页 > 解决方案 > GDB - 获取当前线程的调用堆栈上的总帧数

问题描述

当在断点处停止时,gdb 是否有一个命令可以打印当前线程的调用堆栈上有多少帧?

目前,我会bt打印线程的整个回溯,然后手动计算帧数。我猜gdb有一个命令可以做到这一点,我只是找不到它。

标签: debugginggdb

解决方案


您可以给出bt参数 -1 以仅显示最底部的帧(请参阅GDB:Backtraces),然后将 1 添加到帧号(因为帧是连续编号的,从 0 开始):

$ gdb fib2
...
(gdb) bt
#0  fib (n=4) at fib2.c:5
#1  0x0000000008000714 in fib (n=5) at fib2.c:7
#2  0x0000000008000714 in fib (n=6) at fib2.c:7
#3  0x0000000008000714 in fib (n=7) at fib2.c:7
#4  0x0000000008000714 in fib (n=8) at fib2.c:7
#5  0x0000000008000714 in fib (n=9) at fib2.c:7
#6  0x0000000008000757 in main () at fib2.c:15

(gdb) bt -1
#6  0x0000000008000757 in main () at fib2.c:15

或者,如果您想要更多自定义输出,以下是使用 GDB 的 Python 扩展的方法(请参阅GDB:Python 中的框架):

$ cat framecount.py
def framecount():
  f = gdb.newest_frame()
  count = 0
  while f:
    count += 1
    f = f.older()
  print(count, "frames")

$ gdb fib2
...
(gdb) source framecount.py
(gdb) py framecount()
7 frames

推荐阅读