Я работаю с демоном во встроенном устройстве linux, демон аварийно завершает работу во время работы, обычно после запуска через несколько часов. Я исследовал отчет о сбое (дамп стека) и обнаружил, что он дает сбой по 2 сценариям, следуйте этим следам вызовов:
- Случай 1. моя функция -> calloc -> malloc -> realloc (сбой SIGSEGV)
- Случай 2. моя функция -> calloc -> malloc -> realloc -> abort ->
поднять (сбой SIGABRT)
Я прочитал эту ссылку, и моя проблема возникает из-за повреждения кучи Почему я получаю ошибку подтверждения malloc? .
Я сделал свою собственную версию оболочки для функций выделения памяти (malloc, calloc, realloc и free), чтобы прикрепить ограждения вокруг выделенной памяти и контролировать их с помощью хеш-таблицы, чтобы я мог обнаружить переполнение буфера или освобождение дважды. Однако он по-прежнему падает без каких-либо нарушений памяти на моих заборах.
Итак, я хочу задать 2 вопроса:
- Есть ли у вас идеи отладить такого рода проблемы?
- Когда malloc вызывает realloc? Я кратко посмотрел исходный код malloc на glibc и не вижу вызова realloc.