4

我想尝试使用 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== 大小为 4 的无效写入
==11097== 在 0x40061F:主要(在 /home/hotellnx94/peeterj/tmp/a.out)
==11097== 地址 0x51c6048 在大小为 10 的块中分配了 8 个字节
==11097== 在 0x4A2058F: malloc (vg_replace_malloc.c:236)
==11097== 由 0x400609:主要(在 /home/hotellnx94/peeterj/tmp/a.out 中)
...
未中止

我没有看到 valgrind 选项在错误时中止(就像 gnu-libc 的 mcheck 一样,但我不能使用 mcheck,因为它不是线程安全的)。有谁知道这是否可能(我们的代码 dup2 的标准输出到 /dev/null,因为它作为守护进程运行,所以报告没有用,我宁愿抓住罪魁祸首或更接近它)。

4

1 回答 1

3

There is no such option in valgrind.

Consider adding a non-daemon mode (debug mode) into your daemon.

http://valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs 4.6 explains some requests from debugged program to valgrind+memcheck, so you can use some of this in your daemon to do some checks at fixed code positions.

于 2011-05-12T16:58:40.483 回答