debugging - 使用 valgrind 实现 gdb 的便捷工作流程
问题描述
我正在重新编译调试周期中进行调试,如下所示:
- 编译二进制
- 运行调试器
gdb prog
- 查找错误并修复源
ctrl+d
按下或键入退出调试器quit
我想在工作流中添加 Valgrind,以便在我遇到不正确的超出范围的内存读取或写入时立即中断。我发现如果我按照官方记录的使用 gdb 运行 Valgrind 的过程,我必须执行更多耗时的步骤。
- 编译二进制
- 运行 valgrind
valgrind --vgdb=yes --vgdb-error=0 prog
- 打开新的终端窗口并输入
gdb prog
- 运行
target remote | vgdb
(或者,更糟糕的是,如果我正在运行多个调试会话,则在 valgrind 窗口中打印的连接的复制粘贴命令) - 查找错误并修复源
- 退出调试器
- 使用 valgrind 进程终止应用程序
kill -9
(因为 Valgrind 不会在 gdb 退出时停止它)
我如何自动化这 3 个额外的步骤?理想情况下,我希望有一个命令,mygdb
作为在引擎盖下运行 Valgrind 的替代命令gdb
,可能调试速度较慢,但一旦 Valgrind 检测到错误就会中断。
解决方案
--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
推荐阅读
- ios - 如何解决 iOS 14 破坏我的应用(在应用商店发布)的问题?
- javascript - Prototype、jQuery 和 Highcharts 的冲突问题
- java - 在 AppCompatActivity 中未调用 onRequestPermissionResult
- python - 在 pytorch 上计算 Monte carlo Dropout 的准确性
- r - RMarkdown 到 Microsoft Word 中的下划线
- node.js - 带有 sequelize 的打字稿:UserAdmin.belongsTo 调用的东西不是 Sequelize.Model 的子类
- python - 如何制作一个填充父级的 *args 和 **kwargs 的子类?
- c - 如何从 C 中的 PDF 文件中读取字符串?
- .net - 调试时会显示更改,但在构建应用程序后不会显示更改
- python - 无法在 python 中为长 URL 连接 sqlite3