是否有办法在发现第一个错误时停止Valgrind?

问题描述 投票:3回答:4

如果在valgrind的输出中发现错误,我想使用程序的调试版本生成输出。但是,在调试中验证成千上万次运行会非常耗时。

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

监视输出并手动终止进程的简短方法,是否有更好的解决方案?

debugging valgrind terminate
4个回答
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时,它将尝试调用调试命令。因此,在这种情况下,它将获取父进程ID(即valgrind),并将KILL信号发送到该进程。因此,Valgrind应该立即停止。


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

0
投票

您可以使用

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

按目前的状态-用于抑制,但我确定它会满足您的需求。


0
投票

[--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

© www.soinside.com 2019 - 2024. All rights reserved.