суббота, 11 сентября 2010 г.

Valgrind

Только что примерно час искал в своей программе на C ошибку при работе с памятью. В процессе работы программы периодически замусоривалась информация в одном массиве. Сначала некоторое время в массиве сохраняется правильная информация, потом некоторое время идёт мусор, а затем снова идёт правильная информация. Я долго не мог понять в чём дело, проверял каждый этап работы программы - вроде бы всё должно нормально работать. Создавалось ощущение, что память повреждалась где-то между вызовами двух функций, каждая из которых работала правильно.

Поставил valgrind, запустил свою программу под его управлением. Посмотрел лог и нашёл причину ошибки - неправильно расчитывался размер памяти при перевыделении памяти под массив с помощью realloc. При первом вызове realloc массив имел нулевой размер, поэтому первый же вызов realloc создавал некоторый запас памяти для дальнейшей правильной работы. Когда этот запас заканчивался, происходила запись информации куда-то за пределы распределённого пространства (повреждая при этом часть уже распределённых до этого структур). Потом происходил ещё один вызов realloc и памяти вновь становилось достаточно, дальше в массив вновь сохранялась правильная информация.

Очень глупая ошибка, но как сложно её было найти! Valgrind - прекрасная программа. Спасибо разработчикам за столь полезный инструмент.