Ошибки в malloc () и malloc_consolidate () - PullRequest
26 голосов
/ 23 июня 2010

Иногда в моем приложении происходят ошибки, в основном в malloc () и malloc_consolidate (), когда я смотрю на обратную трассировку в gdb.

Я проверил, что на компьютере достаточно памяти, он даже не начал подкачку. Я проверил ulimits на сегментацию данных и максимальный объем памяти, и оба установлены на «неограниченный». Я также запустил приложение под valgrind и не обнаружил ошибок памяти.

Теперь у меня нет идей, что еще может быть причиной этих ошибок. Есть идеи?

Обновление: Поскольку я ничего не могу найти с помощью valgrind (или ptrcheck), может ли другое приложение уничтожить структуру памяти libc или существует отдельная структура для каждого процесса?

Ответы [ 2 ]

24 голосов
/ 15 сентября 2010

С http://www.gnu.org/s/libc/manual/html_node/Heap-Consistency-Checking.html#Heap-Consistency-Checking:

Другая возможность проверки и защиты от ошибок при использовании malloc, realloc и free - установить переменную окружения MALLOC_CHECK_.Когда задано значение MALLOC_CHECK_, используется специальная (менее эффективная) реализация, предназначенная для обеспечения устойчивости к простым ошибкам, таким как двойные вызовы free с одним и тем же аргументом, или переполнению одного байта (ошибки с ошибками)Однако не все такие ошибки могут быть защищены от утечек памяти.Если MALLOC_CHECK_ установлен в 0, любое обнаруженное повреждение кучи молча игнорируется;если установлено в 1, диагностика печатается на stderr;если установлено значение 2, прерывание вызывается немедленно.Это может быть полезно, потому что в противном случае сбой может произойти намного позже, и тогда истинную причину проблемы будет очень трудно отследить.

13 голосов
/ 23 июня 2010

Скорее всего, вы уничтожаете кучу, т. Е. Вы записываете за пределы выделенного фрагмента памяти, и это переписывает структуры данных, которые malloc() использует для управления кучей.Это приводит к тому, что malloc() получает доступ к неверному адресу, и ваше приложение падает.

Недостаточно памяти не приведет к сбою malloc() - просто вернется NULL.Это может привести к сбою вашего кода, если вы не проверяете NULL, но сайт сбоя не будет находиться в malloc().

Немного странно, что Valgrind не сообщает о каких-либо ошибках - но тамнекоторые ошибки, которые может пропустить инструмент по умолчанию "Memcheck".Попробуйте запустить Valgrid с помощью инструмента «Ptrcheck» .

...