有没有办法用osx上的kext中的符号记录堆栈跟踪?

时间:2017-06-21 19:48:49

标签: macos iokit kernel-extension xnu

我想用它来调试内核驱动程序,但我会尽量避免向所有函数添加日志记录。 OSReportWithBacktrace似乎有效,但我需要符号。

1 个答案:

答案 0 :(得分:1)

我不知道直接从kext打印符号化堆栈跟踪的方法。通过将keepsyms=1添加到boot-args nvram变量,您可以获得符号化的恐慌日志。我怀疑这个数据结构有私有链接,所以你可能无法在你自己的kext中复制符号化的恐慌代码。 (它位于xnu源的osfmk/i386/AT386/model_dep.c中,但如果你想尝试的话。)

您的另一个选择是通过OSReportWithBacktrace命令行工具发送atos的输出。对于kext符号,您需要从kextstat中找到kext的加载地址,并将其传递给-l命令行参数。

最后,您当然可以使用lldb内核调试来获取堆栈跟踪。如果您需要在早期kext加载期间设置断点,在您有机会从lldb命令行执行此操作之前,可以在代码中要插入的__asm__("int $3")(IIRC)处插入调试器。