сделать Valgrind прервать по ошибке для проверки повреждения кучи? - PullRequest
3 голосов
/ 12 мая 2011

Я бы хотел попробовать использовать 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 для прерывания при ошибке (как это делает mcheck из gnu-libc, но я не могу использовать mcheck, потому что он не безопасен для потоков).Кто-нибудь знает, возможно ли это (стандартный вывод нашего кода dup2 в / dev / null, поскольку он запускается как демон, поэтому отчет бесполезен, и я бы лучше поймал виновника в действии или ближе к нему).

1 Ответ

2 голосов
/ 12 мая 2011

В valgrind такой опции нет.

Подумайте о том, чтобы добавить в свой демон режим, отличный от демона (режим отладки).

http://valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs 4.6 объясняет некоторые запросы отлаживаемой программы к valgrind + memcheck, поэтому вы можете использовать часть этого в своем демоне для выполнения некоторых проверок в фиксированных позициях кода.

...