Прежде чем я начну изобретать колесо, я решил провести поиск, чтобы посмотреть, реализована ли где-то моя желаемая функция.
Как правило, я хотел бы проанализировать мой macOS kext и найти любые проблемы с памятью (особенно утечка памяти).
Более конкретно, я хочу найти профилировщик на основе кода (поскольку внешний профилировщик не поддерживает отладочные модули ядра), который используется в качестве оболочки для malloc / free.
1. on every malloc it record where you allocated the memory (file/line)
2. on every free, it remove this meta data (along with the memory itself).
3. on tear-down, it scans for all left dynamic memory regions
and prints them out (along with their corresponding meta-data).
This analysis may be called when unloading the driver, which is the point
where all memory should be free.
Вот вариант реализации, использующий двусвязный список, что при запросе на выделение с некоторым входным размером фактический malloc сделан для size + overhead
где вторая часть должна содержать ссылки на предыдущее распределение и следующее распределение, а также метаданные (получение имени файла с использованием ФАЙЛ макрос и строка кода с использованием ЛИНИЯ макрос и, возможно, больше информации), адрес возврата является смещением overhead
от фактического распределения, так что пользователь может обрабатывать только прочитанные данные.
на free
мы используем входной адрес — offset
как фактический вклад в free
поскольку это исходная выделенная память, но перед ее освобождением элемент должен быть надлежащим образом удален из связанного списка.
После анализа мы повторяем список и печатаем каждый элемент.
Обратите внимание, что есть некоторые детали реализации, такие как поддержка многопоточной среды путем блокировки раздела кода и вставки / удаления элемента из связанного списка.
В качестве альтернативы, возможно, есть плагин GDB / LLDB, который сканирует всю динамически выделяемую память (и печатает ее размер) …
P.S
В Windows есть такой модуль, который называется driver verifier
что дает вашему модулю ядра возможности, указанные выше, и вам не нужно ничего перекомпилировать (это активируется во время выполнения) … есть ли такой инструмент в macOS?
Задача ещё не решена.
Других решений пока нет …