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

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

问题描述:

我想用它来调试内核驱动程序,但我会尽量避免将日志记录添加到所有功能。 OSReportWithBacktrace似乎工作,但我需要符号。有没有办法使用OSX上的kext中的符号记录堆栈跟踪?

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

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

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