2013-05-02 96 views
2

如果在valgrind的輸出中發現錯誤,我想使用該程序的調試版本生成輸出。但是,調試數千個運行調試的時間太多。有沒有辦法阻止Valgrind發現第一個錯誤?

所以我想要做的是在釋放模式運行,如果發現錯誤中止運行並完成調試測試什麼。

缺少監視輸出和手動殺死進程,是否有更好的解決方案?

回答

0

您可以使用

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

當前標準的 - 它鎮壓,但我相信它會滿足您的需求。

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 
相關問題