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

时间:2016-06-09 16:26:20

标签: debugging gdb valgrind terminate

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

设置调试会话

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

  1. 我输入

    运行valgrind
    <div className="field">
      <select className="ui dropdown input" {...options}>
        <option value="">This is the header side the input</option>
        <option value="1">Option 1</option>
        <option value="0">Option 2</option>
        <option value="2">Option 3</option>
      </select>
    </div>
    
  2. 在另一个终端会话中,我使用

    运行gdb
    valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prgm.run 
    
  3. 我将gdb连接到valgrind

    gdb ./prgm.run
    
  4. 我从gdb CLI运行程序

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

    终止会话

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

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

    (gdb) c
    

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

    在那种情况下,我杀了&#34; memcheck-amd64 - &#34;对应于我的valgrind会话的进程。该进程的数量在valgrind消息中指示,例如(gdb) q 中的16195

    ==16195== Invalid read of size 8

    常规杀戮是不够的:我需要使用kill -9 16195 选项。

    我不认为调用-9是如何做的......我错过了什么?

    valgrind版本:3.10.1

    gdb版本:7.7.1

3 个答案:

答案 0 :(得分:8)

你也可以使用命令

(gdb)monitor v.kill

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

答案 1 :(得分:0)

先前的答案对我不起作用,所以我发现this可以解决问题。

  1. (gdb) info inferiors应该列出gdb会话中的所有下级,找到名称为“ remote target”的远程,并记下左侧的数字(如果gdb中没有其他下级运行,则为1)
  2. (gdb) kill inferiors <number>用较低的数字替换<number>
  3. (gdb) quit

答案 2 :(得分:-2)

以下适用于我:

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