macos - 如何使用 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
了输出。谁能指出我到底错过了什么?
解决方案
两者都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内核中似乎没有意义,但你明白了。)
推荐阅读
- flyway - NullPointerException 在 OC4J 中通过 flyway 迁移
- java - Selenium GRID:org.openqa.selenium.SessionNotCreatedException:无法创建新服务:ChromeDriverService
- ios - 在 swift 中使用 NMSSH 为 scp 传递密码
- code-coverage - 我想忽略伊斯坦布尔报道报告中的文件夹 db_scripts
- php - 如何在 xampp 中为 windows 中的 php 7.2 版本安装 mcrypt
- c++ - 无法编译我的旧项目(使用 gcc)
- ios - 使用 replaykit 的 iOS 广播扩展不起作用
- python - 如何在 django 中验证表单时访问外键?
- r - 在 Rcpp 中访问命名列表元素
- javascript - 无法在 indexedDB 中获取新插入的记录