【问题标题】:Debugging kext with gdb: deadlock使用 gdb 调试 kext:死锁
【发布时间】:2013-03-28 15:47:54
【问题描述】:

我有 I/O Kit 驱动程序:虚拟以太网设备。经过一段时间的工作操作系统挂起,所以看起来我的驱动程序出现了一些死锁。

我已经完成了接下来的步骤:
- 通过 FireWire 连接两台 macbook
- 设置调试环境
- 初始化 NMI(通过电源按钮)
- 通过 gdb 连接到目标
- 获取我的 kext 的地址
- 创建和加载符号(这是我读过的所有文档中的最后一点)
到目前为止一切顺利。如果发生内核恐慌,这就足够了。 但是在我的情况下没有内核恐慌,我驻留在处理 NMI 的线程中。

现在的问题是:如何切换到我的 kext 的线程?
命令showalltasks 列出了所有任务,我的kext 可能正在运行的唯一任务是kernel_task,所以我试图通过showtaskthreadsshowtaskstacks 检查此任务,但找不到与我的代码类似的任何内容.我错过了什么吗?

如有任何建议或文档链接,我将不胜感激。

【问题讨论】:

    标签: macos debugging gdb kernel kernel-extension


    【解决方案1】:

    我没有直接回答您的问题 - 但是否可以使用断点命中您的 kext 代码?内核调试的一种常用方法是对机器进行 nmi,附加调试器,在感兴趣的代码中设置断点,恢复执行 (continue),然后执行所需的任何操作来命中断点。

    【讨论】:

    • 感谢您的建议,但它无济于事:死锁后我无法继续执行,之前......好吧,通常它在大约一两个小时左右工作正常,所以情况并非如此跨度>
    【解决方案2】:

    好吧,我正在回答我自己的问题。
    要使用我的 kext 代码查看线程,我需要使用我的 kext 切换到进程。在我的情况下,它可能是一个浏览器(因为我的 kext 是 NKE)。

    但实际上它对我没有多大帮助。但是旧的打印方法帮助我找到了死锁。所以我的建议是接下来:对于内核恐慌 - 使用调试器,对于死锁 - 使用打印,找到锁定的位置并分析代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      相关资源
      最近更新 更多