Mac内核编程通用内核扩展prinf()无法正常工作

时间:2017-04-11 06:26:00

标签: c macos kernel kernel-extension mach

我已经按照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。

我也设置了boot-args

$ sudo nvram boot-args="original_contents debug=0x4"

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

显然,至少从Sierra(10.12)起,他们重新组织了日志的编写方式(iOS支持?),所以你再也看不到system.log了。尽管如此,在您的控制台应用程序中,您可以在侧边栏中找到Devices部分,您可以在其中选择您的设备(通常是您的Mac系统),并在搜索框中查看仅限于“内核”的实时日志。所以我在使用kext load / kextunload时可以看到这些:

default 11:58:27.608228 +0200   kernel  MyKext has started.
default 11:58:34.446824 +0200   kernel  MyKext has stopped.
default 11:58:44.803350 +0200   kernel  MyKext has started.

无需csrutilnvram更改。

重要出于某种原因,我需要重新启动控制台以反映我的消息更改,否则它会显示上一版本中的那些(开始和停止)。确实很奇怪!

稍后要恢复旧日志,请尝试sudo log collect --last 1d并使用Consolemore here)打开结果。

答案 1 :(得分:0)

很抱歉,死尸发布了,但是我发现将log(1)与它的许多命令之一一起使用(如上述评论中的@pmdj所建议)比使用Console有用。从手册中:

log-访问由os_log,os_trace和其他日志创建的系统范围的日志消息 ging系统。

例如,一个人可以运行:

log stream

查看系统的实时输出,包括MacOS内核扩展中的printf()