【发布时间】:2017-09-06 09:16:57
【问题描述】:
我已按照Creating a Generic Kernel Extension with Xcode 教程进行操作。
MyKext.c:
#include <sys/systm.h>
#include <mach/mach_types.h>
kern_return_t MyKext_start (kmod_info_t * ki, void * d)
{
printf("MyKext has started.\n");
return KERN_SUCCESS;
}
kern_return_t MyKext_stop (kmod_info_t * ki, void * d)
{
printf("MyKext has stopped.\n");
return KERN_SUCCESS;
}
我还禁用了 csrutil,它允许我加载自己的 kext。
# csrutil disable
当我将自己的 kext 加载到内核中时
$ sudo kextload -v /tmp/MyKext.kext
printf() 的结果没有写入 /var/log/system.log。
我也设置了引导参数
$ sudo nvram boot-args="original_contents debug=0x4"
谁能帮帮我?
【问题讨论】:
-
首先,您需要使用内核函数。所以
printf()应该是printk() -
写入系统日志有特定的功能。它们是:
openlog()、syslog()、closelog() -
@user3629249:是什么让你产生了这个想法?
printf()应该可以正常工作。 -
printf()在 macOS/OS X 内核扩展中是正确的。IOLog()的工作原理相同,但在设备驱动程序中更常见。您正在运行什么操作系统版本?从 10.12 开始,/var/log/system.log 不再是正确的查看位置,您现在需要查看新的系统日志记录服务,您可以使用log命令访问该服务。printk()是 Linux 的东西,syslog()是用于用户空间的。您的 kext 是否出现在kextstat的输出中?请不要使用kextload,而是使用kextutil,它的诊断效果要好得多。 -
您可能需要查看控制台应用程序并尝试将您的内核扩展名放入搜索文本字段。您的应用程序的所有日志都将显示在那里。
标签: c macos kernel kernel-extension mach