malloc вызывает realloc, затем вылетает - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю с демоном во встроенном устройстве linux, демон аварийно завершает работу во время работы, обычно после запуска через несколько часов. Я исследовал отчет о сбое (дамп стека) и обнаружил, что он дает сбой по 2 сценариям, следуйте этим следам вызовов:

  • Случай 1. моя функция -> calloc -> malloc -> realloc (сбой SIGSEGV)
  • Случай 2. моя функция -> calloc -> malloc -> realloc -> abort ->
    поднять (сбой SIGABRT)

Я прочитал эту ссылку, и моя проблема возникает из-за повреждения кучи Почему я получаю ошибку подтверждения malloc? .

Я сделал свою собственную версию оболочки для функций выделения памяти (malloc, calloc, realloc и free), чтобы прикрепить ограждения вокруг выделенной памяти и контролировать их с помощью хеш-таблицы, чтобы я мог обнаружить переполнение буфера или освобождение дважды. Однако он по-прежнему падает без каких-либо нарушений памяти на моих заборах.

Итак, я хочу задать 2 вопроса:

  1. Есть ли у вас идеи отладить такого рода проблемы?
  2. Когда malloc вызывает realloc? Я кратко посмотрел исходный код malloc на glibc и не вижу вызова realloc.

1 Ответ

0 голосов
/ 19 ноября 2018

Мой коллега нашел основную причину (изучив файл дампа ядра и исходный код libc malloc), есть момент, когда он записывает в освобожденную память из-за ошибки в функции удаления связанного списка => поврежденная память => сбой calloc.

Обычно malloc не вызывает realloc , malloc , вместо этого __ malloc_consolidate .В файле дампа obj libc ассемблерный код __ malloc_consolidate находится под ассемблерным кодом realloc , поэтому я malloc вызывает realloc .

...