在回溯中跳过最里面的帧

时间:2016-12-06 09:31:01

标签: c++ gdb backtrace

我想在gdb中创建一个回溯(在脚本中)。命令bt 2仅打印2个最里面的帧,而bt -2仅打印2个最外面的帧。

我想做的是跳过 2个最里面的帧,并显示所有外帧。我试过了

up 2
bt

(类似地up-silentlyframeselect-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似乎有效,但之后应用程序处于无效状态,因此我无法使用它。

1 个答案:

答案 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帧之外的所有帧的回溯。