debugging - GDB - 获取当前线程的调用堆栈上的总帧数
问题描述
当在断点处停止时,gdb 是否有一个命令可以打印当前线程的调用堆栈上有多少帧?
目前,我会bt
打印线程的整个回溯,然后手动计算帧数。我猜gdb有一个命令可以做到这一点,我只是找不到它。
解决方案
您可以给出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
推荐阅读
- python - 集合计数器 - 如何从输出中删除“计数器”
- c# - C# Google Drive Api v3 Uploadprogress 没有起火
- pandas - pandas,按周分组数据
- get - Angular 7 - 同步 http 请求
- python - 完成 env 处理后是否可以删除每个 Tox virtualenv
- css - Laravel snappy - 如何加载内部/外部 css
- java - 解决迭代的更好方法
- permutation - 在 Netlogo 中重复具有变量列表 lentgh 的列表的排列
- c# - Bot Framework - 为什么 Choice 持有 CardAction,每个角色的作用是什么?
- android - 无法使用 TextEditingController 更改文本字段列表中的值