如果在valgrind的輸出中發現錯誤,我想使用該程序的調試版本生成輸出。但是,調試數千個運行調試的時間太多。有沒有辦法阻止Valgrind發現第一個錯誤?
所以我想要做的是在釋放模式運行,如果發現錯誤中止運行並完成調試測試什麼。
缺少監視輸出和手動殺死進程,是否有更好的解決方案?
如果在valgrind的輸出中發現錯誤,我想使用該程序的調試版本生成輸出。但是,調試數千個運行調試的時間太多。有沒有辦法阻止Valgrind發現第一個錯誤?
所以我想要做的是在釋放模式運行,如果發現錯誤中止運行並完成調試測試什麼。
缺少監視輸出和手動殺死進程,是否有更好的解決方案?
您可以使用
valgrind --gen-suppressions=no|yes|all
當前標準的 - 它鎮壓,但我相信它會滿足您的需求。
您可以使用--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