跳过回溯中最内向的框架

Skip innermost frames in backtrace

本文关键字:框架 回溯      更新时间:2023-10-16

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

我想做的是 skip 这是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两次似乎有效,但是随后将应用程序以无效状态保留,所以我无法使用它。

您对" 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帧以外的所有框架打印回轨。

如果可以在某个预定的长度上限制堆栈,则可以提供一个明确的长列表,类似于以下最多40帧,从框架4开始:

frame apply level 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 43 -q frame

框架数字超出了可用的数字。