2011-05-11 44 views
3

我想嘗試使用valgrind做一些堆腐敗檢測。用下面的腐敗「單元測試」:使valgrind中止堆錯誤檢查錯誤?

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char * c = (char *) malloc(10) ; 

    memset(c, 0xAB, 20) ; 
    printf("not aborted\n") ; 

    return 0 ; 
} 

我很驚訝地發現,在Valgrind的錯誤不會中止,只是產生一個消息:

 
valgrind -q --leak-check=no a.out 
==11097== Invalid write of size 4 
==11097== at 0x40061F: main (in /home/hotellnx94/peeterj/tmp/a.out) 
==11097== Address 0x51c6048 is 8 bytes inside a block of size 10 alloc'd 
==11097== at 0x4A2058F: malloc (vg_replace_malloc.c:236) 
==11097== by 0x400609: main (in /home/hotellnx94/peeterj/tmp/a.out) 
... 
not aborted 

我沒有看到的valgrind選項在錯誤時中止(如gnu-libc的mcheck所做的,但我不能使用mcheck,因爲它不是線程安全的)。有沒有人知道這是否可行(我們的代碼dup2的標準輸出爲/ dev/null,因爲它作爲守護進程運行,所以報告沒有用處,我寧願捕捉行爲中的罪魁禍首或更接近它)。

回答

2

valgrind中沒有這樣的選項。

考慮在守護進程中添加一個非守護進程模式(調試模式)。

http://valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs 4.6解釋了從調試程序到valgrind + memcheck的一些請求,因此您可以在守護進程中使用其中的一些功能在固定代碼位置執行一些檢查。