我想在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
似乎有效,但之后应用程序处于无效状态,因此我无法使用它。
答案 0 :(得分:0)
你对“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(source tbt.py)中获取。现在你有了新的命令tbt。 tbt N将打印除前N帧之外的所有帧的回溯。