首页 > 解决方案 > 如何使用 atos 正确符号化来自 OSReportWithBacktrace 的地址?

问题描述

我正在尝试在一个开源项目中寻找保留泄漏,以支持基于 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 确认我的情况是第二种情况(类被终止但没有正确释放)。此外,我通过覆盖 taggedRelease 和 taggedRetain ( https://stackoverflow.com/a/13471512/48660 ) 使用 pmdj 的提示来打印函数调用的堆栈跟踪。

这是我遇到问题的地方,我无法atos将十六进制地址转换回人类可读的符号。我使用以下命令生成符号:

atos -arch x86_x64 -o VoodooI2C.kext/Contents/MacOS/VoodooI2C -l 0xffffff7f8432b000 0xffffff804588dfa0

加载地址参数是从中检索的kextstat,我希望该-l参数应该处理滑动算术。

atos应该返回一个有效的符号,但我得到的只是十六进制地址。在上面的例子中,我得到0xffffff804588dfa0了输出。谁能指出我到底错过了什么?

标签: macoskernelkernel-extensiondarwinxnu

解决方案


两者都kextstat报告OSReportWithBacktrace未滑动的地址,因此 KASLR 不是您的问题。

请注意,您的 kext 显然是在 加载的0xffffff7f8432b000,而您的回溯帧地址是0xffffff804588dfa0. 这相距甚远,并且确实 kexts 总是加载在0xffffff7f8???????(未滑动的)范围内,因此0xffffff804588dfa0不能靠近 kext 代码。(偏移量约为 3GB)它几乎可以肯定是内核中的一个函数。如果您使用atos适当的运行内核的二进制文件,它应该能够找到哪一个。例如:

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

(我不知道你用的是什么内核版本,而且这个地址在18F132内核中似乎没有意义,但你明白了。)


推荐阅读