我想尝试使用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的stdout到/ dev / null,因为它作为一个守护进程运行,所以报告没用,我宁愿抓住行为中的罪魁祸首或更接近它)。
答案 0 :(得分:2)
在valgrind中没有这样的选择。
考虑在守护进程中添加非守护进程模式(调试模式)。
http://valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs 4.6解释了从调试程序到valgrind + memcheck的一些请求,因此您可以在守护程序中使用其中一些来在固定代码位置进行一些检查。