Debugging 在源代码行级别跟踪程序/函数执行

Debugging 在源代码行级别跟踪程序/函数执行,debugging,gdb,trace,Debugging,Gdb,Trace,有没有办法根据执行的源代码行记录特定函数(或整个程序)的执行情况 Consdier我在gdb中设置了一个断点,使其能够执行foo,然后重复调用step,它会告诉我这样的信息: (gdb) break foo Thread 1 "main" hit Breakpoint 1, foo () at foo.cpp:10 (gdb) step foo () at foo.cpp:12 (gdb) step foo () at foo.cpp:13 (gdb) step foo () at foo.cp

有没有办法根据执行的源代码行记录特定函数(或整个程序)的执行情况

Consdier我在
gdb
中设置了一个断点,使其能够执行
foo
,然后重复调用
step
,它会告诉我这样的信息:

(gdb) break foo
Thread 1 "main" hit Breakpoint 1, foo () at foo.cpp:10
(gdb) step
foo () at foo.cpp:12
(gdb) step
foo () at foo.cpp:13
(gdb) step
foo () at foo.cpp:12
(gdb) step
foo () at foo.cpp:14
然后我重复,直到
foo
不再在
bt
的输出中。这给了我一个执行跟踪(foo.cpp:10->12->13->12->14),这对于比较长控制流特别有用

是否有一种方法可以通过
gdb
实现这一点,或者是否有其他工具可以实现这一点?我只对确定性跟踪感兴趣,而不是采样。理想情况下,这也可以用于
stepi
(在指令级)/
下一步(无需输入子例程)。

基于,我能够为自己的目的编写一个快速python脚本。幸运的是,所需的bug解决方法较少:

导入系统 导入gdb 导入操作系统 进口稀土 def in_帧(针): “”“检查传递的帧是否仍在当前堆栈上”“” hay=gdb.最新的_帧() 而干草: 如果干草==针: 返回真值 hay=hay.older() 返回错误 #使用此选项可减少任何不必要的噪音 def过滤器_步骤(输出): output=re.sub(r'^.*没有这样的文件或目录\.\n',r'',output,flags=re.M) output=re.sub(r'^\d+\s+in\s+.*\n',r'',output,flags=re.M) 返回输出 def step_trace(文件名=无,step=“step”): 计数器=0 如果文件名为: output=“” frame=gdb.frame() 打印(“单步执行,直到{}@{}:{}结束”。格式(frame.name(),frame.function().symtab,frame.function().line)) 在_帧(帧)中时: 计数器+=1 如果文件名为: 输出+=过滤器步骤(gdb.execute(步骤,to_string=True)) 其他: 执行(步骤) 如果文件名为: 打开(文件名为“w”)作为文件: file.write(输出) 打印(“通过{}行完成。”.format(计数器))
将跟踪输出到文件的步骤

(gdb) source step_trace.py
(gdb) python step_trace("filename.log")
或者直接

(gdb) source step_trace.py
(gdb) python step_trace()

看起来您调试了剥离的代码,或者没有提供源代码。这个代码是C++,而不是C。实际上,对于这个特殊的问题,源代码是不可用的,但是它不被剥离。当然,源代码行级别不适用于剥离的二进制文件。我坚信这个问题适用于C和C++,因此,根据C-tag Wiki,这两个标签都是合适的。唯一的区别是需求。如果删除标签,请说明C回答如何不适合C++。似乎有一个不同的是结束条件。我不确定我正在回答您的问题(因此它是一个注释),但是通常的方法是配对<代码>期望< /C> >和<代码> gdb/mi(参见)我想你可以使用你链接到的问题中的解决方案,但最终条件是
$_调用者是(“foo”,0)
(0表示只查看当前帧)。