有没有办法用 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)调试器。
我想用它来调试内核驱动程序,但我会尽量避免向所有函数添加日志记录。 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)调试器。