Я пытаюсь найти утечки в проекте с открытым исходным кодом для поддержки трекпадов на основе 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
в качестве вывода. Может ли кто-нибудь указать, что именно мне не хватает?