Я хотел бы отслеживать использование mallocs и frees в приложении с помощью malloc и free хуков.
Вот документация http://www.gnu.org/s/libc/manual/html_node/Hooks-for-Malloc.html
На странице примера вы можете видеть, что my_malloc_hook
временно отключает обработчик malloc (или переключает на предыдущий обработчик в цепочке) перед повторным вызовом malloc.
Это проблема при мониторинге многопоточных приложений (объяснение см. В конце вопроса).
Другие примеры использования ловушки malloc, которые я нашел в Интернете, имеют ту же проблему.
Есть ли способ переписать эту функцию для корректной работы в многопоточном приложении?
Например, существует ли внутренняя функция libc, которую может вызвать ловушка malloc, которая завершает выделение без необходимости деактивировать мою ловушку.
Я не могу посмотреть исходный код libc из-за корпоративной правовой политики, поэтому ответ может быть очевиден.
Моя спецификация дизайна говорит, что я не могу заменить malloc другим дизайном malloc.
Могу предположить, что никаких других крючков здесь нет.
ОБНОВИТЬ
Поскольку ловушка malloc временно удаляется при обслуживании malloc, другой поток может вызвать malloc и НЕ получить ловушку.
Было высказано предположение, что у malloc есть большая блокировка, которая предотвращает это, но это не задокументировано, и тот факт, что я эффективно рекурсивно вызываю malloc, предполагает, что любая блокировка должна существовать либо после перехвата, либо быть очень умной:
caller ->
malloc ->
malloc-hook (disables hook) ->
malloc -> # possible hazard starts here
malloc_internals
malloc <-
malloc-hook (enables hook) <-
malloc
caller