Я пытаюсь найти утечки в проекте с открытым исходным кодом для поддержки трекпадов на основе I2C (https://github.com/kprinssu/VoodooI2CHID).
Причина, по которой я считаю наличие утечек, заключается в том, что при попытке выгрузить расширение ядра с помощью следующих команд:
sudo kextunload -verbose 6 VoodooI2CHID.kext
Я получаю следующий вывод:
Kext user-space log filter changed from 0xff2 to 0xfff.
Kext kernel-space log filter changed from 0xff2 to 0xfff.
Kext library architecture set to x86_64.
Requesting unload of com.alexandred.VoodooI2CHID (with termnation of IOServices).
(kernel) User-space log flags changed from 0x0 to 0xfff.
(kernel) Received 'Unload' request from user space.
(kernel) Rescheduling scan for unused kexts in 60 seconds.
(kernel) Can't unload kext com.alexandred.VoodooI2CHID; classes have instances:
(kernel) Kext com.alexandred.VoodooI2CHID class VoodooI2CPrecisionTouchpadHIDEventDriver has 1 instance.
(kernel) Kext com.alexandred.VoodooI2CHID class VoodooI2CMultitouchHIDEventDriver has 1 instance.
Kernel error handling kext request - (libkern/kext) kext is in use or retained (cannot unload).
Failed to unload com.alexandred.VoodooI2CHID - (libkern/kext) kext is in use or retained (cannot unload).
Я столкнулся с отличным ответом pmdj по отслеживанию утечек хранения ( Невозможно выгрузить расширение ядра; у классов есть экземпляры ). Я подтвердил, что моя ситуация - это второй случай с помощью ioreg (занятия заканчиваются, но не освобождаются должным образом). Кроме того, я использовал подсказку pmdj, переопределив taggedRelease и taggedRetain (https://stackoverflow.com/a/13471512/48660), чтобы напечатать трассировку стека вызовов функций.
Здесь я сталкиваюсь с проблемами, я не могу использовать atos
для преобразования шестнадцатеричных адресов обратно в удобочитаемые символы. Я использую следующую команду для генерации символов:
atos -arch x86_x64 -o VoodooI2C.kext/Contents/MacOS/VoodooI2C -l 0xffffff7f8432b000 0xffffff804588dfa0
Параметр адреса загрузки получен из kextstat
, и я ожидаю, что аргумент -l
должен обрабатывать арифметику слайдов.
atos
должен вернуть действительный символ, но все, что я получаю, это шестнадцатеричный адрес обратно. В приведенном выше примере я получаю 0xffffff804588dfa0
в качестве вывода. Кто-нибудь может указать, что именно мне не хватает?