【问题标题】:Mac kernel programming generic kernel extension prinf() not workingMac内核编程通用内核扩展prinf()不起作用
【发布时间】: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


【解决方案1】:

显然,至少从 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 并使用Console(more here) 打开结果。

【讨论】:

  • 关于控制台的评论刚刚解决了我的日志问题.....仍然不明白为什么苹果没有在任何地方提到它......感谢您提供的信息:)
【解决方案2】:

抱歉,necro-post,但我发现使用 log(1) 及其众多命令之一(如上面 cmets 中的 @pmdj 所建议)而不是使用控制台很有用。来自手册:

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

例如,可以运行:

log stream

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 2010-10-26
    • 1970-01-01
    • 2018-11-12
    • 2011-06-24
    • 2018-02-18
    • 2011-01-03
    • 2019-03-27
    相关资源
    最近更新 更多