可以默认在 panic 日志中显示调试 KEXT 符号吗?
possible to display debug KEXT symbols in the panic log by default?
回到 IOKit 的摇摆(El Capitan 带来的 USB 变化似乎非常全面),我发现调试 kext 恐慌日志是后端的一个痛苦。
当我在开发和测试时,是否可以将符号 IN 留在内核扩展中,以便它们将在 panic.log 回溯中打印出来?
对于调试 KEXT,我尝试更改 "Strip Debug Symbols During Copy" 设置(a.k.a。COPY_PHASE_STRIP
)和 "Strip Linked Product"(a.k.a。STRIP_INSTALLED_PRODUCT
) 目标设置为 NO
.
我的紧急日志中仍然收到未符号化的输出。是我运气不好,MacOS 根本做不到,还是我缺少其他设置?
即而不是:
Anonymous UUID: A8A49864-0847-0BFD-AE70-67EE1BA71682
Fri Dec 18 07:43:19 2015
*** Panic Report ***
panic(cpu 3 caller 0xffffff8013d98fd9): Kernel trap at 0xffffff7f96f00056, type 14=page fault, registers:
CR0: 0x0000000080010033, CR2: 0x0000000000000018, CR3: 0x000000022c105000, CR4: 0x0000000000002660
RAX: 0x00000000c0a8bc01, RBX: 0x0000000000000000, RCX: 0x0000000000000000, RDX: 0x0000000000003dbd
RSP: 0xffffff811dd2b810, RBP: 0xffffff811dd2b8a0, RSI: 0x0000000027a3aee5, RDI: 0x00000000c0a8bc01
R8: 0x0000000000000000, R9: 0x0000000000000000, R10: 0x0000000000000000, R11: 0x0000000000000000
R12: 0xffffff811799b400, R13: 0xffffff8025bb6530, R14: 0x000000000000012c, R15: 0xffffff802a051980
RFL: 0x0000000000010296, RIP: 0xffffff7f96f00056, CS: 0x0000000000000008, SS: 0x0000000000000010
Fault CR2: 0x0000000000000018, Error code: 0x0000000000000000, Fault CPU: 0x3, PL: 0
Backtrace (CPU 3), Frame : Return Address
0xffffff811dd2b4a0 : 0xffffff8013c838c7
0xffffff811dd2b520 : 0xffffff8013d98fd9
0xffffff811dd2b700 : 0xffffff8013db7d83
0xffffff811dd2b720 : 0xffffff7f96f00056
0xffffff811dd2b8a0 : 0xffffff7f96f00571
0xffffff811dd2b9a0 : 0xffffff7f96f01490
0xffffff811dd2ba50 : 0xffffff7f96efaf85
0xffffff811dd2bab0 : 0xffffff7f94f8ea66
0xffffff811dd2baf0 : 0xffffff7f94f8e795
0xffffff811dd2bb50 : 0xffffff7f94f8e9c8
0xffffff811dd2bb90 : 0xffffff8013f2da05
0xffffff811dd2bcc0 : 0xffffff8013f16a0e
0xffffff811dd2bd50 : 0xffffff8013ef5ed0
0xffffff811dd2bdd0 : 0xffffff8013eeab70
0xffffff811dd2be50 : 0xffffff801419b207
0xffffff811dd2bef0 : 0xffffff801419b03e
0xffffff811dd2bf50 : 0xffffff80141fcf9f
0xffffff811dd2bfb0 : 0xffffff8013db8586
我很想看:
Anonymous UUID: A8A49864-0847-0BFD-AE70-67EE1BA71682
Fri Dec 18 07:43:19 2015
*** Panic Report ***
panic(cpu 3 caller 0xffffff8013d98fd9): Kernel trap at 0xffffff7f96f00056, type 14=page fault, registers:
CR0: 0x0000000080010033, CR2: 0x0000000000000018, CR3: 0x000000022c105000, CR4: 0x0000000000002660
Fault CR2: 0x0000000000000018, Error code: 0x0000000000000000, Fault CPU: 0x3, PL: 0
Backtrace (CPU 3), Frame : Return Address
MyWorkOfArtKext::doSomething : 0xffffff8013c838c7
MyWorkOfArtKext::start : 0xffffff8013d98fd9
假设您没有明确去除符号,它们将保留在您的 kext 二进制文件中。问题是内核的动态加载器没有将它们保留在内存中。但是,您可以通过设置 keepsyms=1
内核参数(通过 nvram
boot-args
变量,或通过 /Library/Preferences/SystemConfiguration/
中的 com.apple.Boot.plist
来更改它 - 如果您设置了flag,内核将保留 kexts 和内核本身的符号,并在 panic 日志中符号化堆栈跟踪。
请注意,您仍将获得 C 风格的符号名称,因此您需要使用 c++filt
命令取消对任何 C++ 函数名称的修改。
更新: keepsyms=1
Apple Silicon/arm64e
内核似乎不受尊重,不幸的是。
回到 IOKit 的摇摆(El Capitan 带来的 USB 变化似乎非常全面),我发现调试 kext 恐慌日志是后端的一个痛苦。
当我在开发和测试时,是否可以将符号 IN 留在内核扩展中,以便它们将在 panic.log 回溯中打印出来?
对于调试 KEXT,我尝试更改 "Strip Debug Symbols During Copy" 设置(a.k.a。COPY_PHASE_STRIP
)和 "Strip Linked Product"(a.k.a。STRIP_INSTALLED_PRODUCT
) 目标设置为 NO
.
我的紧急日志中仍然收到未符号化的输出。是我运气不好,MacOS 根本做不到,还是我缺少其他设置?
即而不是:
Anonymous UUID: A8A49864-0847-0BFD-AE70-67EE1BA71682
Fri Dec 18 07:43:19 2015
*** Panic Report ***
panic(cpu 3 caller 0xffffff8013d98fd9): Kernel trap at 0xffffff7f96f00056, type 14=page fault, registers:
CR0: 0x0000000080010033, CR2: 0x0000000000000018, CR3: 0x000000022c105000, CR4: 0x0000000000002660
RAX: 0x00000000c0a8bc01, RBX: 0x0000000000000000, RCX: 0x0000000000000000, RDX: 0x0000000000003dbd
RSP: 0xffffff811dd2b810, RBP: 0xffffff811dd2b8a0, RSI: 0x0000000027a3aee5, RDI: 0x00000000c0a8bc01
R8: 0x0000000000000000, R9: 0x0000000000000000, R10: 0x0000000000000000, R11: 0x0000000000000000
R12: 0xffffff811799b400, R13: 0xffffff8025bb6530, R14: 0x000000000000012c, R15: 0xffffff802a051980
RFL: 0x0000000000010296, RIP: 0xffffff7f96f00056, CS: 0x0000000000000008, SS: 0x0000000000000010
Fault CR2: 0x0000000000000018, Error code: 0x0000000000000000, Fault CPU: 0x3, PL: 0
Backtrace (CPU 3), Frame : Return Address
0xffffff811dd2b4a0 : 0xffffff8013c838c7
0xffffff811dd2b520 : 0xffffff8013d98fd9
0xffffff811dd2b700 : 0xffffff8013db7d83
0xffffff811dd2b720 : 0xffffff7f96f00056
0xffffff811dd2b8a0 : 0xffffff7f96f00571
0xffffff811dd2b9a0 : 0xffffff7f96f01490
0xffffff811dd2ba50 : 0xffffff7f96efaf85
0xffffff811dd2bab0 : 0xffffff7f94f8ea66
0xffffff811dd2baf0 : 0xffffff7f94f8e795
0xffffff811dd2bb50 : 0xffffff7f94f8e9c8
0xffffff811dd2bb90 : 0xffffff8013f2da05
0xffffff811dd2bcc0 : 0xffffff8013f16a0e
0xffffff811dd2bd50 : 0xffffff8013ef5ed0
0xffffff811dd2bdd0 : 0xffffff8013eeab70
0xffffff811dd2be50 : 0xffffff801419b207
0xffffff811dd2bef0 : 0xffffff801419b03e
0xffffff811dd2bf50 : 0xffffff80141fcf9f
0xffffff811dd2bfb0 : 0xffffff8013db8586
我很想看:
Anonymous UUID: A8A49864-0847-0BFD-AE70-67EE1BA71682
Fri Dec 18 07:43:19 2015
*** Panic Report ***
panic(cpu 3 caller 0xffffff8013d98fd9): Kernel trap at 0xffffff7f96f00056, type 14=page fault, registers:
CR0: 0x0000000080010033, CR2: 0x0000000000000018, CR3: 0x000000022c105000, CR4: 0x0000000000002660
Fault CR2: 0x0000000000000018, Error code: 0x0000000000000000, Fault CPU: 0x3, PL: 0
Backtrace (CPU 3), Frame : Return Address
MyWorkOfArtKext::doSomething : 0xffffff8013c838c7
MyWorkOfArtKext::start : 0xffffff8013d98fd9
假设您没有明确去除符号,它们将保留在您的 kext 二进制文件中。问题是内核的动态加载器没有将它们保留在内存中。但是,您可以通过设置 keepsyms=1
内核参数(通过 nvram
boot-args
变量,或通过 /Library/Preferences/SystemConfiguration/
中的 com.apple.Boot.plist
来更改它 - 如果您设置了flag,内核将保留 kexts 和内核本身的符号,并在 panic 日志中符号化堆栈跟踪。
请注意,您仍将获得 C 风格的符号名称,因此您需要使用 c++filt
命令取消对任何 C++ 函数名称的修改。
更新: keepsyms=1
Apple Silicon/arm64e
内核似乎不受尊重,不幸的是。