Подтвердить что ты не робот

Segfaults в malloc() и malloc_consolidate()

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

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

Теперь у меня нет идей, что еще может вызвать эти segfaults. Любые идеи?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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