Как использовать atos для правильной символизации адресов из OSReportWithBacktrace? - PullRequest
1 голос
/ 17 июня 2019

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

1 Ответ

0 голосов
/ 17 июня 2019

Как kextstat, так и OSReportWithBacktrace сообщают о незанятых адресах, поэтому KASLR не является вашей проблемой.

Обратите внимание, что ваш kext явно загружен в 0xffffff7f8432b000, тогда как адрес фрейма обратной трассировки равен 0xffffff804588dfa0.Это довольно далеко друг от друга, и на самом деле кексы всегда загружаются в диапазоне 0xffffff7f8??????? (unslid), поэтому 0xffffff804588dfa0 не может быть где-то рядом с кодом kext.(смещение около 3 ГБ) Это почти наверняка функция в самом ядре.Если вы используете atos с соответствующим исполняемым двоичным файлом ядра, он сможет найти, какой именно.Например:

atos -o /Library/Developer/KDKs/KDK_10.14.5_18F132.kdk/System/Library/Kernels/kernel 0xffffff804588dfa0

(я не знаю, какую версию ядра вы используете, и этот адрес не имеет смысла в ядре 18F132, но вы поняли идею.)

...