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

Is there a way to log a stack trace with symbols from a kext on osx?

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

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

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

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