2011-09-06 203 views

回答

26

由於valgrind本身和它運行的客戶端程序都在一個進程中執行,因此沒有「內部進程」。

發送到該進程的信號將正常傳遞到客戶端程序。如果信號導致進程變暗,那麼valgrind的正常退出處理程序將運行並(例如)報告任何泄漏。

因此,舉例來說,如果我們在睡眠命令啓動的valgrind:

bericote [~] % valgrind sleep 240 
==9774== Memcheck, a memory error detector 
==9774== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. 
==9774== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info 
==9774== Command: sleep 240 
==9774== 

然後殺死命令:

bericote [~] % kill -TERM 9774 

那麼該過程將退出,並Valgrind的的退出處理程序將運行:

==9774== 
==9774== HEAP SUMMARY: 
==9774==  in use at exit: 0 bytes in 0 blocks 
==9774== total heap usage: 30 allocs, 30 frees, 3,667 bytes allocated 
==9774== 
==9774== All heap blocks were freed -- no leaks are possible 
==9774== 
==9774== For counts of detected and suppressed errors, rerun with: -v 
==9774== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6) 
[1] 9774 terminated valgrind sleep 240 

唯一的例外是kill -9,因爲在那種情況下pro cess在沒有被告知信號的情況下被內核殺死,所以valgrind沒有機會做任何事情。

+1

我在嘗試之前嘗試過'殺死-SIGTERM',但是valgrind停止(〜10分鐘)需要很長時間,所以我懷疑它不起作用。感謝您的回答。 –

+0

延遲是掃描所有分配的內存,試圖解決是否存在任何泄漏 - 這可能需要比平時更長的時間,因爲處於運行中的程序可能比正常退出的程序分配更多的內存。 – TomH

+6

這在OS X 10.7.5和valgrind-3.8.1上不適用。 valgrind會高興地忽略殺人。 –