如果在valgrind的输出中发现错误,我想使用程序的调试版本生成输出。但是,在调试中验证成千上万次运行会非常耗时。
所以我想做的是在发布模式下运行,如果发现错误,则中止运行并在调试中完成测试。
监视输出并手动终止进程的简短方法,是否有更好的解决方案?
您可以使用--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应该立即停止。
所以我想做的是在发布模式下运行,如果发现错误,则中止运行并在调试中完成测试。
假设您有两个可执行文件: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
您可以使用
valgrind --gen-suppressions=no|yes|all
按目前的状态-用于抑制,但我确定它会满足您的需求。
[--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