我有 I/O Kit 驱动程序:虚拟以太网设备。经过一段时间的工作操作系统挂起,所以看起来我的驱动程序有一些死锁。
我已经完成了接下来的步骤:
- 通过 FireWire 连接两台 macbook
- 设置调试环境
- 初始化 NMI(通过电源按钮)
- 通过 gdb 连接到目标
- 获取我的 kext 的地址
- 创建和加载符号(这是最后一点在我读过的所有文档中)
到目前为止一切都很好。如果发生内核恐慌,这就足够了。但在我的情况下,没有内核恐慌,我驻留在处理 NMI 的线程中。
现在的问题是:如何切换到我的 kext 线程?
命令showalltasks
给了我所有任务的列表,我的 kext 可能正在运行的唯一任务是 kernel_task,所以我试图通过检查这个任务showtaskthreads
,showtaskstacks
但找不到任何与我的代码类似的东西。我错过了什么吗?
如有任何建议或文档链接,我将不胜感激。
问问题
363 次
2 回答
0
我没有直接回答你的问题 - 但是否可以用断点击中你的 kext 代码?内核调试的一种常用方法是对机器进行 nmi,附加调试器,在感兴趣的代码中设置断点,恢复执行 ( continue
),然后执行所需的任何操作来命中断点。
于 2013-03-29T03:08:00.020 回答
0
好吧,我正在回答我自己的问题。
要使用我的 kext 代码查看线程,我需要使用我的 kext 切换到进程。在我的情况下,它可能是一个浏览器(因为我的 kext 是 NKE)。
但实际上它对我没有多大帮助。但是旧的打印方法帮助我找到了死锁。所以我的建议是下一个:对于内核恐慌 - 使用调试器,对于死锁 - 使用打印,找到锁定的位置并分析代码。
于 2013-05-16T06:23:51.810 回答