有没有办法使用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)。