3

我遵循了使用 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"

谁能帮我吗?

4

2 回答 2

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更改。

重要由于某些奇怪的原因,我需要重新启动控制台以反映我的消息更改,否则它会显示之前构建的那些(开始和停止)。确实很奇怪!

稍后要恢复旧日志,请尝试使用( more heresudo log collect --last 1d )打开结果。Console

于 2017-09-25T10:04:16.750 回答
0

很抱歉发布 necro-post,但我发现使用log(1)它的许多命令之一(如上面评论中的@pmdj 所建议)而不是使用控制台很有用。从手册:

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

例如,可以运行:

log stream

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

于 2020-05-19T13:32:28.887 回答