我一直在对复杂代码进行一堆分析,并且为了解释事情的进行,我经常想回溯到仅包含函数名称的某个兴趣点。
但是,当我这样做时:
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 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()
现在我可以:
btf
这给了我想要的输出。