如何在调试器中进行代码路径分析?

时间:2018-11-09 00:29:13

标签: c++ debugging gdb

是否有可用于执行代码路径分析的调试器,工具和gdb脚本?

说我有一个可执行文件(在C ++中,但问题不受语言限制),可以在一个输入下正常运行,而在另一个输入下崩溃。我希望看到两个执行路径之间的差异,而不必单步执行(或检测)可能的数千行代码。

理想情况下,我将能够在(C ++)语句的2个不同流之间进行比较(最好不是汇编程序),并查明差异。也许某个分支执行某个分支,而不是另一个执行,等等。

有没有办法实现/自动化呢?预先感谢。

1 个答案:

答案 0 :(得分:0)

因此,假设该错误的源可以位于一个(或几个)源文件中,则实现比较代码执行路径的最简单方法似乎是GDB脚本。您创建一个gdb脚本文件:

set args <arg_list>
set logging off
set logging file <log_file_1>
set logging on
set pagination off
set breakpoint pending on
b <source_file>:<line_1>
commands
frame
c
end
...
b <source_file>:<line_n>
commands
frame
c
end

带有序言(所有 set 命令),然后在源文件中的 each 行中使用断点+命令(可以通过脚本轻松生成;不要不必担心空白或注释行,它们将被跳过)。

将可执行文件加载到gdb中(当然是使用调试标志正确构建的); source 上面的gdb脚本文件(称为gdb_script.txt)并运行:

source gdb_script.txt
run

然后使用稍有更改的脚本文件(gdb_script.txt)重复上述过程。具体来说,更改<arg_list>以修改输入;并将日志文件设置为其他文件<log_file_2>

来源并运行。然后将<log_file_1><log_file_2>与您喜欢的比较工具(例如tkdiff)进行比较。

这不会比 gcov (上面建议)做得更好。但是,它可以帮助更好地将您的输出限制在可疑的代码区域。