有没有办法阻止Valgrind发现它的第一个错误?

时间:2013-05-02 18:50:00

标签: debugging valgrind terminate

如果在valgrind的输出中发现错误,我想使用程序的调试版本生成输出。但是,在调试中对数千次运行进行valgrinding过于耗费时间。

所以我想要做的是在发布模式下运行,如果发现错误则中止运行并在调试中完成测试。

如果没有监控输出并手动终止进程,是否有更好的解决方案?

4 个答案:

答案 0 :(得分:2)

您可以使用--db-attach=yes--db-command=执行要停止Valgrind执行的特定命令。但是对于正常的调试过程,--db-command使用子进程调用gdb。因此,您无法通过使用--db-command=kill -9 %p终止进程来停止执行,因为它只会杀死子进程,而不是Valgrind本身。

如果您使用的是Linux且具有/proc文件系统支持,则可以在/proc/PID/stat的第4列中获取父进程号。这样你就有机会杀死父进程来阻止Valgrind。

例如,

valgrind --db-attach=yes --db-command="cat /proc/%p/stat | cut -d' ' -f4 | xargs kill -9" ./a.out

出现第一个错误时,系统会询问您

---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ----

当您按Y时,它将尝试调用debug命令。所以在这种情况下,它将获得父进程ID,即valgrind,并向进程发送KILL信号。因此,Valgrind将立即停止。

答案 1 :(得分:1)

  

所以我想要做的是在发布模式下运行,如果发现错误则中止运行并在调试中完成测试。

假设您有两个可执行文件:a.outa.out-g,并且您希望使用不同的参数集运行它们,这应该适用于bash

# Arguments to try
args=(
  "-foo"
  "-foo -bar"
  "-bar -baz"
  ...
)
for a in "${args[@]}"; do
   if valgrind -q --error-exitcode=1 \
       --db-attach=yes --db-command="kill -9 %p" ./a.out $a; then
     echo PASS: ./a.out $a
   else
     echo FAIL: ./a.out $a
     valgrind ./a.out-g $a
   fi 
done

答案 2 :(得分:1)

--db-attach=yes参数不再存在。

当前用法通过vgdb二进制文件进行调解:

  1. 使用valgrind启动程序:

valgrind --vgdb=yes --vgdb-error=0 my_prog

它显示下一步的操作:

==2466== Memcheck, a memory error detector
==2466== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2466== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==2466== Command: ./my_prog
==2466== 
==2466== (action at startup) vgdb me ... 
==2466== 
==2466== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==2466==   /path/to/gdb ./my_prog
==2466== and then give GDB the following command
==2466==   target remote | /usr/bin/vgdb --pid=2466
  1. 因此,您启动另一个终端并使用二进制文件运行gdb

gdb ~/Sources/my_prog

  1. 并附加到已停止的进程2466:

(gdb) target remote | /usr/bin/vgdb --pid=2604

答案 3 :(得分:0)

您可以使用

valgrind --gen-suppressions=no|yes|all

目前的情况 - 它的抑制作用,但我相信它会符合您的需求。