- 积分
- 2102
- 最后登录
- 2024-4-19
- 精华
- 1
- 阅读权限
- 220
- 主题
- 288
- UID
- 3081083
- 帖子
- 2708
- PB币
- 90423
- 威望
- 169
- 贡献
- 0
- 技术
- 56
- 活跃
- 2785
这货不是澎湖冰洲
- UID
- 3081083
- 帖子
- 2708
- PB币
- 90423
- 贡献
- 0
- 技术
- 56
- 活跃
- 2785
|
沙发
发表于 2020-4-14 14:21:18
IP属地黑龙江
|只看该作者
本帖最后由 penghubingzhou 于 2020-4-16 16:02 编辑
关于我们所写的驱动问题,我们已经基本分析了个大概。接下来,让我们谈一点比较有意思的话题,那就是五国分析。什么是五国呢?相信各位同学装黑果时,经常可以看到类似这样的图(前提是你开启了啰嗦模式也就是启动的-v参数,同时还开启了keepsym=1这个启动参数):
- Backtrace (CPU 7), Frame : Return Address
- 0xffffff81f0423830 : 0xffffff80003aeafd mach_kernel : _handle_debugger_trap + 0x48d
- 0xffffff81f0423880 : 0xffffff80004e85a3 mach_kernel : _kdp_i386_trap + 0x153
- 0xffffff81f04238c0 : 0xffffff80004d9fca mach_kernel : _kernel_trap + 0x4fa
- 0xffffff81f0423930 : 0xffffff800035bca0 mach_kernel : _return_from_trap + 0xe0
- 0xffffff81f0423950 : 0xffffff80003ae517 mach_kernel : _panic_trap_to_debugger + 0x197
- 0xffffff81f0423a70 : 0xffffff80003ae363 mach_kernel : _panic + 0x63
- 0xffffff81f0423ae0 : 0xffffff80004da1ed mach_kernel : _kernel_trap + 0x71d
- 0xffffff81f0423c50 : 0xffffff800035bca0 mach_kernel : _return_from_trap + 0xe0
- 0xffffff81f0423c70 : 0xffffff7f8353155c com.alexandred.VoodooI2C : __ZN27VoodooI2CMT2SimulatorDevice24getMultitouchPreferencesEPvS0_P9IOServiceP10IONotifier + 0x6c
- 0xffffff81f0423d70 : 0xffffff8000a28a7a mach_kernel : __ZN9IOService14invokeNotifierEP18_IOServiceNotifier + 0xea
- 0xffffff81f0423dc0 : 0xffffff8000a345ab mach_kernel : __ZN9IOService23addMatchingNotificationEPK8OSSymbolP12OSDictionaryPFbPvS5_PS_P10IONotifierES5_S5_i + 0x4b
- 0xffffff81f0423df0 : 0xffffff7f83531773 com.alexandred.VoodooI2C : __ZN27VoodooI2CMT2SimulatorDevice5startEP9IOService + 0x1f5
- 0xffffff81f0423e20 : 0xffffff7f83532cab com.alexandred.VoodooI2C : __ZN21VoodooI2CNativeEngine5startEP9IOService + 0x9d
- 0xffffff81f0423e40 : 0xffffff8000a2c65b mach_kernel : __ZN9IOService14startCandidateEPS_ + 0x6b
- 0xffffff81f0423e80 : 0xffffff8000a2c3a1 mach_kernel : __ZN9IOService15probeCandidatesEP12OSOrderedSet + 0x911
- 0xffffff81f0423f00 : 0xffffff8000a2b8f7 mach_kernel : __ZN9IOService14doServiceMatchEj + 0x2c7
- 0xffffff81f0423f50 : 0xffffff8000a2d3c6 mach_kernel : __ZN15_IOConfigThread4mainEPvi + 0x1a6
- 0xffffff81f0423fa0 : 0xffffff800035b0ce mach_kernel : _call_continuation + 0x2e
- Kernel Extensions in backtrace:
- com.alexandred.VoodooI2C(2.1.4)[F3C676CB-CAAC-3748-A38E-E339E7C8426D]@0xffffff7f83528000->0xffffff7f83556ff
- dependency: com.apple.iokit.IOACPIFamily(1.4)[99A8A054-9F64-3FB8-BB1D-5973F8AB04A1]@0xffffff7f80d10000
- dependency: com.apple.iokit.IOHIDFamily(2.0.0)[2AEFB432-C333-3CFC-955E-24BBDDDE0F5E]@0xffffff7f81233000
- dependency: com.apple.iokit.IOPCIFamily(2.9)[7EA30FDD-A2FB-390F-99DD-42BC19691BB4]@0xffffff7f80c95000
- dependency: org.coolstar.VoodooGPIO(1.1)[4E12B69A-2ECF-3D57-8DFE-F1F9D21FAF03]@0xffffff7f83512000
复制代码
这样的东西,由于在非啰嗦模式下通常显示一个五国文字的重启图,所以被我们亲切地称为五国图。其实,它的标准称呼,应该叫内核崩溃(Kernel Panic),简称KP。内核崩溃的原因很简单,你所执行的内核指令遇到了某些错误,才导致了内核停止工作。对于我们装黑果而言,碰上五国可不是什么好事情,但是对于编写IOKit驱动而言,五国图可以帮助我们更快地找到出错代码行的位置,从而实现帮助我们调试的效果。前面讲过,我们的IOKit所用的cpp,是不支持运行时功能的,也就没法使用断点。因此,除了IOLog,剩下KP Log几乎是我们仅剩的调试手段。那么这节,我们就来看下到底怎样从这样的一个看似无序的KP Log中挖出东西来。
首先,这个Log是VoodooI2C 2.1.4时期的一个KP Log。通过分析上面的这个Log,我们注意到这样一行:
- Kernel Extensions in backtrace:
- com.alexandred.VoodooI2C(2.1.4)[F3C676CB-CAAC-3748-A38E-E339E7C8426D]@0xffffff7f83528000->0xffffff7f83556ff
复制代码
这一行证明了我们发生KP的驱动是VoodooI2C驱动。
接下来,我们再继续分析,往前看,又发现了这样一行:
- 0xffffff81f0423c50 : 0xffffff800035bca0 mach_kernel : _return_from_trap + 0xe0
复制代码
这一行顾名思义,系统从这个追踪中返回,即成功追踪到了一个KP。那么也就是说,在它下面的这行代码,就是KP的具体内存位置:
- 0xffffff81f0423c70 : 0xffffff7f8353155c com.alexandred.VoodooI2C : __ZN27VoodooI2CMT2SimulatorDevice24getMultitouchPreferencesEPvS0_P9IOServiceP10IONotifier + 0x6c
复制代码
根据symbol的名称我们不难得知,引起问题的代码出在VoodooI2CMT2SimulatorDevice::getMultitouchPreferences这个函数里。
到目前,我们已经分析出了不少的信息出来,但这些还不够,因为我们仍然不知道具体出错的代码行在哪。
回过头看Kernel Extensions in backtrace:这块的代码。我们注意到了它有一个地址的导出:
- @0xffffff7f83528000->0xffffff7f83556ff
复制代码
这里,0xffffff7f83528000就是驱动发生KP的入口地址。接下来继续查看__ZN27VoodooI2CMT2SimulatorDevice24getMultitouchPreferencesEPvS0_P9IOServiceP10IONotifier 这一行,我们不难发现这里也有两个地址:
- 0xffffff81f0423c70 : 0xffffff7f8353155c
复制代码
这里,0xffffff7f8353155c就是我们要的返回地址。
有了这两个地址,我们就可以利用macOS系统自带的调试工具atos导出代码具体出错的位置了。打开终端,输入以下命令:
- atos -arch x86_64 -o /path/to/VoodooI2C.kext/Contents/MacOS/VoodooI2C -l 0xffffff7f83528000 0xffffff7f8353155c
复制代码
其中/path/to/VoodooI2C.kext依旧是你的VoodooI2C驱动的地址。当此命令成功执行后,将返回如下的信息:
- VoodooI2CMT2SimulatorDevice::getMultitouchPreferences(void&, void&, IOService&, IONotifider&) (in VoodooI2C) (VoodooI2CMT2SimulatorDevice.cpp:265)
复制代码
从这我们终于可以得知,位于VoodooI2CMT2SimulatorDevice.cpp文件的第265行,同时也位于VoodooI2CMT2SimulatorDevice::getMultitouchPreferences里的这行代码,就是KP的罪魁祸首。
|
|