使用gdb进行调试时,请彻底退出valgrind

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用gdb进行调试时,请彻底退出valgrind相关的知识,希望对你有一定的参考价值。

我正在使用valgrind和gdb调试程序。但是,我以野蛮的方式终止这些调试会话......它真的是如何实现的吗?

Setting up the debugging session

按照official valgrind website的说明,我执行以下操作来运行程序:

  1. 我输入了valgrind valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prgm.run
  2. 从另一个终端会话,我运行gdb使用 gdb ./prgm.run
  3. 我将gdb连接到valgrind (gdb) target remote | vgdb
  4. 我从gdb CLI运行程序 (gdb) c

到目前为止一切顺利:程序在两个终端中运行(用于valgrind的程序和用于gdb的程序)。然后valgrind发现错误,例如读取无效,程序执行暂停。

Terminating the session

那时,我想摆弄我的代码:或许修改一些东西,或者从程序的源代码中注释/取消注释。因此,该程序需要重新编译。生成新的二进制文件。接下来,我想停止正在进行的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就是这样做的。

  1. (gdb) info inferiors应该列出gdb会话中的所有下级,找到一个以'remote target'为名的那个,注意它左边的数字(如果没有其他的下级在gdb中运行,则为1)
  2. (gdb) kill inferiors <number>用较差的数字替换<number>
  3. (gdb) quit
另一答案

以下适用于我:

  1. 首先从gdb分离:(gdb) detach
  2. 然后退出gdb(gdb) quit
  3. 然后CTRL + C valgrind。

以上是关于使用gdb进行调试时,请彻底退出valgrind的主要内容,如果未能解决你的问题,请参考以下文章

“gdb”和“valgrind”以不同的方式执行二进制文件?

valgrind使用简介

如何在 Linux (redhat) 上通过 gdb 在 xterm 中使用 valgrind?

使gdb在成功终止时自动退出?

程序使用 valgrind memcheck 提前终止

如何使用GDB查找引用内存空间中某个地址的所有指针?