作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想在 gdb 中创建回溯(在脚本中)。命令 bt 2
只打印最里面的 2 个帧,而 bt -2
只打印最外面的 2 个帧。
我想做的是跳过最里面的 2 个框架,并显示所有外部框架。我试过了
up 2
bt
(和类似的up-silently
,frame
,select-frame
),但是它不影响的输出bt
。明确地说,我想去掉此输出中的第一行:
#0 0x0000003167e0f33e in waitpid () from /lib64/libpthread.so.0
#1 0x00007f2779835de8 in print_trace() () at /path/to/MyAnalysis.cxx:385
#2 0x00007f2779836ec9 in MyAnalysis::getHistHolder(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) () at /path/to/MyAnalysis.cxx:409
#3 0x00007f27798374aa in MyAnalysis::execute() () at /path/to/MyAnalysis.cxx:599
#4 0x00007f2783a9670f in EL::Worker::algsExecute() () from /blah/lib/libEventLoop.so
...
有什么办法吗?
调用 return
两次似乎有效,但随后应用程序处于无效状态,因此我无法使用它。
最佳答案
您对“bt”的论点取决于当前存在的帧数。也许这也可以直接在 gdb 中完成(不确定),但是这个 python 脚本正是这样做的:
import gdb
class TopBt (gdb.Command):
""" tbt n Shows backtrace for top n frames """
def __init__ (self):
super(TopBt, self).__init__ ("tbt", gdb.COMMAND_DATA)
def framecount():
n = 0
f = gdb.newest_frame()
while f:
n = n + 1
f = f.older()
return n
def invoke (self, arg, from_tty):
top = int(arg[0])
btarg = -(TopBt.framecount() - top)
if btarg < 0:
gdb.execute("bt " + str(btarg))
TopBt()
将其保存到某个文件 (tbt.py) 中,在 gdb 中获取它(来源 tbt.py)。现在你有了新命令 tbt。 tbt N 将打印除前 N 帧以外的所有帧的回溯。
关于c++ - 跳过回溯中最内层的帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40991943/
我是一名优秀的程序员,十分优秀!