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

Gae*_*eul 9 debugging gdb valgrind terminate

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

设置调试会话

按照官方valgrind网站的说明,我执行以下操作来运行该程序:

  1. 我输入了valgrind

    valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prgm.run 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从另一个终端会话,我运行gdb使用

    gdb ./prgm.run
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我将gdb连接到valgrind

    (gdb) target remote | vgdb
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我从gdb CLI运行程序

    (gdb) c
    
    Run Code Online (Sandbox Code Playgroud)

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

终止会话

那时,我想摆弄我的代码:或许修改一些东西,或者从程序的源代码中注释/取消注释.因此,该程序需要重新编译.生成新的二进制文件.接下来,我想停止正在进行的valgrind和gdb会话(使用旧的二进制文件)并启动将使用新二进制文件的新valgrind和gdb会话.

为了停止正在进行的会话,我退出了gdb

(gdb) q
Run Code Online (Sandbox Code Playgroud)

有时valgrind会注意到gdb不再存在并退出.但其他时候valgrind仍然保持平衡 - 虽然没有gdb进程存在...

在那种情况下,我杀死了与我的valgrind会话相对应的"memcheck-amd64-"进程.该进程的数量在valgrind消息中指示,例如16195in ==16195== Invalid read of size 8).

kill -9 16195
Run Code Online (Sandbox Code Playgroud)

定期杀人是不够的:我需要使用该-9选项.

我不认为调用kill -9它是如何完成的......我错过了什么?

valgrind版本:3.10.1

gdb版本:7.7.1

小智 9

你也可以使用这个命令

(gdb)monitor v.kill
Run Code Online (Sandbox Code Playgroud)

它在gdb的监视器帮助中列出.