Segfaults в malloc() и malloc_consolidate()
Мое приложение segfaults иногда и в основном в malloc() и malloc_consolidate(), когда я смотрю на обратную трассировку в gdb.
Я проверил, что у машины достаточно памяти, она даже не начала заменять.
Я проверил ulimits для разделения данных и максимального объема памяти, и оба установлены на "неограниченный".
Я также запускал приложение под valgrind и не обнаружил ошибок памяти.
Теперь у меня нет идей, что еще может вызвать эти segfaults. Любые идеи?
Update:
Поскольку я не нахожу ничего с valgrind (или ptrcheck), может ли это быть другим приложением, разрушающим структуру памяти libc или существует отдельная структура для каждого процесса?
Ответы
Ответ 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" .