1

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

4

1 回答 1

1

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

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

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

于 2017-06-22T11:53:20.877 回答