如何执行只显示函数名而不显示其他内容的GDB回溯跟踪?
我一直在做一系列复杂代码的分析,为了解释如何工作,我经常想回溯到只包含函数名的感兴趣点 然而,当我这样做时:如何执行只显示函数名而不显示其他内容的GDB回溯跟踪?,gdb,Gdb,我一直在做一系列复杂代码的分析,为了解释如何工作,我经常想回溯到只包含函数名的感兴趣点 然而,当我这样做时: 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 是否有一种方法只打印函数
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
configures可以完成任务,我也有兴趣了解它们
在Ubuntu19.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
这给了我想要的输出