如果在valgrind的输出中发现错误,我想使用程序的调试版本生成输出。但是,在调试中对数千次运行进行valgrinding过于耗费时间。
所以我想要做的是在发布模式下运行,如果发现错误则中止运行并在调试中完成测试。
如果没有监控输出并手动终止进程,是否有更好的解决方案?
答案 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.out
和a.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
二进制文件进行调解:
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
gdb ~/Sources/my_prog
(gdb) target remote | /usr/bin/vgdb --pid=2604
答案 3 :(得分:0)
您可以使用
valgrind --gen-suppressions=no|yes|all
目前的情况 - 它的抑制作用,但我相信它会符合您的需求。