#valgrind #abort #heap-corruption
#valgrind #прервать #повреждение кучи
Вопрос:
Я хотел бы попробовать использовать valgrind для некоторого обнаружения повреждения кучи. Со следующим повреждением «модульного теста»:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char * c = (char *) malloc(10) ;
memset( c, 0xAB, 20 ) ;
printf("not abortedn") ;
return 0 ;
}
Я был удивлен, обнаружив, что valgrind не прерывается при ошибке, а просто выдает сообщение:
valgrind -q --проверка на утечку = нет ответа.выход ==11097 == Недопустимая запись размера 4 ==11097 == в 0x40061F: main (в / home/hotellnx94/peeterj /tmp /a.out) ==11097 == Адрес 0x51c6048 равен 8 байтам внутри выделенного блока размером 10 ==11097 == в 0x4A2058F: malloc (vg_replace_malloc.c:236) ==11097 == по 0x400609: main (в / home/hotellnx94/peeterj/tmp/a.out) ... не прервано
Я не вижу опции valgrind для прерывания при ошибке (как это делает mcheck в gnu-libc, но я не могу использовать mcheck, потому что это не потокобезопасно). Кто-нибудь знает, возможно ли это (стандартный вывод нашего кода dup2 в / dev / null, поскольку он выполняется как демон, поэтому отчет бесполезен, и я бы предпочел поймать виновника с поличным или ближе к нему).
Ответ №1:
В valgrind нет такой опции.
Рассмотрите возможность добавления режима, отличного от демона (режим отладки), в ваш демон.
http://valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs 4.6 объясняет некоторые запросы от отлаживаемой программы к valgrind memcheck, поэтому вы можете использовать некоторые из них в своем демоне для выполнения некоторых проверок на фиксированных позициях кода.