首页 > 解决方案 > 使用 valgrind 实现 gdb 的便捷工作流程

问题描述

我正在重新编译调试周期中进行调试,如下所示:

我想在工作流中添加 Valgrind,以便在我遇到不正确的超出范围的内存读取或写入时立即中断。我发现如果我按照官方记录的使用 gdb 运行 Valgrind 的过程,我必须执行更多耗时的步骤。

我如何自动化这 3 个额外的步骤?理想情况下,我希望有一个命令,mygdb作为在引擎盖下运行 Valgrind 的替代命令gdb,可能调试速度较慢,但​​一旦 Valgrind 检测到错误就会中断。

标签: debugginggdbvalgrind

解决方案


--vgdb-error=0 指示 valgrind 在开始执行程序之前停止,以便您可以连接 GDB 并设置断点。

但是,如果您只想在检测到错误后进行调试,请给出 --vgdb-error=1。

有了这个,只要 valgrind 没有报错,就不需要用粗体做这 3 个步骤,因为 valgrind 会运行你的程序直到结束并退出。

当 valgrind 遇到错误停止时,你必须启动一个 gdb。您可以编写一个 shell 脚本来自动化部分其他命令,例如

gdb -ex 'target remote | vgdb'

此脚本可以从日志文件输出或任何其他方式中提取 vgdb 命令。

您还可以在 .gdbinit 中定义一个命令,例如

define vquit
  kill
  quit
end

并使用 vquit 而不是退出。

您还可以定义一个 gdb 命令来直接在 valgrind 下启动您的应用程序并将 gdb 连接到它,例如:

define vrun
  shell valgrind --vgdb-error=0 $arg0 &
  target remote | vgdb --wait=10
  continue
end

然后在 gdb 中,您可以执行以下操作:

(gdb) vrun your_application

推荐阅读