使用 gdb 调试时彻底退出 valgrind
Quit valgrind cleanly when debugging with gdb
我正在使用 valgrind 和 gdb 调试程序。然而,我以一种野蛮的方式终止了那些调试会话……这真的是应该如何完成的吗?
设置调试会话
按照 official valgrind website 的说明,我对 运行 程序执行以下操作:
我通过输入运行 valgrind
valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prgm.run
在另一个终端会话中,我 运行 gdb 使用
gdb ./prgm.run
我将 gdb 连接到 valgrind
(gdb) target remote | vgdb
我运行来自gdb CLI的程序
(gdb) c
到目前为止一切顺利:两个终端中的程序 运行s(一个用于 valgrind,一个用于 gdb)。然后 valgrind 发现错误,例如无效读取,程序执行暂停。
终止会话
那时,我想 fiddle 使用我的代码:也许从程序的源代码中修复某些东西或 comment/uncomment 东西。因此,程序需要重新编译。生成一个新的二进制文件。之后,我想停止正在进行的 valgrind 和 gdb 会话(使用旧二进制文件)并启动将使用新二进制文件的新 valgrind 和 gdb 会话。
为了停止正在进行的会话,我退出了 gdb
(gdb) q
有时 valgrind 注意到 gdb 不再存在并退出。但有时 valgrind 会继续运行,即使不再存在 gdb 进程......
在这种情况下,我终止了与我的 valgrind 会话对应的 "memcheck-amd64-" 进程。该进程的编号在 valgrind 消息中指示,例如16195
在 ==16195== Invalid read of size 8
).
kill -9 16195
常规杀戮是不够的:我需要使用-9
选项。
我不认为调用 kill -9
是应该如何完成的……我是不是漏掉了什么?
valgrind 版本:3.10.1
gdb 版本:7.7.1
你也可以使用命令
(gdb)monitor v.kill
它在 gdb 的监视器帮助中列出。
之前的答案对我不起作用,所以我找到了 this 成功了。
(gdb) info inferiors
应该列出gdb session中的所有下级,找到名称为'remote target'的那个,记下它左边的数字(如果没有其他下级则为1 运行 在 gdb 中)
(gdb) kill inferiors <number>
将 <number>
替换为更小的数字。
(gdb) quit
只需使用 kill
命令或简单地
k
- 在
.gdbinit
文件 中使用 set confirm off
来摆脱询问
我正在使用 valgrind 和 gdb 调试程序。然而,我以一种野蛮的方式终止了那些调试会话……这真的是应该如何完成的吗?
设置调试会话
按照 official valgrind website 的说明,我对 运行 程序执行以下操作:
我通过输入运行 valgrind
valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prgm.run
在另一个终端会话中,我 运行 gdb 使用
gdb ./prgm.run
我将 gdb 连接到 valgrind
(gdb) target remote | vgdb
我运行来自gdb CLI的程序
(gdb) c
到目前为止一切顺利:两个终端中的程序 运行s(一个用于 valgrind,一个用于 gdb)。然后 valgrind 发现错误,例如无效读取,程序执行暂停。
终止会话
那时,我想 fiddle 使用我的代码:也许从程序的源代码中修复某些东西或 comment/uncomment 东西。因此,程序需要重新编译。生成一个新的二进制文件。之后,我想停止正在进行的 valgrind 和 gdb 会话(使用旧二进制文件)并启动将使用新二进制文件的新 valgrind 和 gdb 会话。
为了停止正在进行的会话,我退出了 gdb
(gdb) q
有时 valgrind 注意到 gdb 不再存在并退出。但有时 valgrind 会继续运行,即使不再存在 gdb 进程......
在这种情况下,我终止了与我的 valgrind 会话对应的 "memcheck-amd64-" 进程。该进程的编号在 valgrind 消息中指示,例如16195
在 ==16195== Invalid read of size 8
).
kill -9 16195
常规杀戮是不够的:我需要使用-9
选项。
我不认为调用 kill -9
是应该如何完成的……我是不是漏掉了什么?
valgrind 版本:3.10.1
gdb 版本:7.7.1
你也可以使用命令
(gdb)monitor v.kill
它在 gdb 的监视器帮助中列出。
之前的答案对我不起作用,所以我找到了 this 成功了。
(gdb) info inferiors
应该列出gdb session中的所有下级,找到名称为'remote target'的那个,记下它左边的数字(如果没有其他下级则为1 运行 在 gdb 中)(gdb) kill inferiors <number>
将<number>
替换为更小的数字。(gdb) quit
只需使用 kill
命令或简单地
k
- 在
.gdbinit
文件 中使用
set confirm off
来摆脱询问