默认情况下可以在紧急日志中显示调试KEXT符号?

时间:2015-12-18 13:05:11

标签: macos iokit darwin kernel-extension

使用IOKit回归事物(El Capitan带来的USB变化似乎非常彻底),我发现调试kext恐慌日志是后端的痛苦。

在我开发和测试时,是否可以在内核扩展中留下符号 IN ,以便它们在panic.log回溯中打印出来?

对于我的调试KEXT,我尝试将“复制期间的条带调试符号”设置(又名COPY_PHASE_STRIP)和“剥离链接产品”(又名STRIP_INSTALLED_PRODUCT)目标设置更改为{{1 }}

我仍然在恐慌日志中获得非符号化输出。我只是运气不好,这是MacOS根本不做的事情,还是我还缺少其他设置?

即。而不是:

NO

我很乐意看到:

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 

1 个答案:

答案 0 :(得分:3)

假设您没有明确地删除符号,它们将保留在您的kext二进制文件中。问题是内核的动态加载器并没有将它们保留在内存中。但是,您可以通过设置keepsyms=1内核参数(通过nvram boot-args变量,或通过com.apple.Boot.plist中的/Library/Preferences/SystemConfiguration/)来更改它 - 如果您设置了flag,内核将保留kexts和内核本身的符号,并在恐慌日志中表示堆栈跟踪。

请注意,您仍然会获得C样式符号名称,因此您需要使用c++filt命令取消任何C ++函数名称。