如何执行GDB回溯,仅显示函数名称,不显示其他内容?

问题描述 投票:0回答:1

我一直在对复杂代码进行一堆分析,并且为了解释事情的进行,我经常想回溯到仅包含函数名称的某个兴趣点。

但是,当我这样做时:

bt

它添加了很多额外的信息,例如地址和参数,我必须手动删除它们:

#0  f2 (i=0) at main.c:1
#1  0x0000555555555155 in f1 (i=1) at main.c:6
#2  0x0000555555555177 in main (argc=1, argv=0x7fffffffc178) at main.c:10

有没有一种方法可以只打印函数名称,而不能打印其他内容,如:

f2
f1
main

测试程序:

main.c

int f2(int i) {
    return i + 1;
}

int f1(int i) {
    return f2(i) + 1;
}

int main(int argc, char *argv[]) {
    return f1(argc);
}

编译并运行:

g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.c
gdb -nh -batch -q -ex 'b f2' -ex r -ex bt main.out

对于这个用例,我最感兴趣的是一个用法选项,但是如果有完成任务的set配置,我也很想知道它们。

在Ubuntu 19.10,GDB 8.3中测试。

gdb
1个回答
0
投票

由于无法轻松找到一个选项,我最终为此破解了一个GDB Python脚本:

class BtFuncOnly(gdb.Command):
    """Backtrace with function names only
"""
    def __init__(self):
        super(self.__class__, self).__init__('btf', gdb.COMMAND_FILES)
    def invoke(self, argument, from_tty):
        frame = gdb.selected_frame()
        while frame is not None:
            gdb.write('{}\n'.format(frame.name()))
            frame = frame.older()
BtFuncOnly()

GitHub upstream

现在我可以:

btf

这给了我想要的输出。

© www.soinside.com 2019 - 2024. All rights reserved.