【问题标题】:Why isn't my kernel extension writing to kernel.log为什么我的内核扩展没有写入 kernel.log
【发布时间】:2012-08-16 09:21:57
【问题描述】:

我有一个简单的内核扩展:

kern_return_t HelloWorld_start (kmod_info_t *ki, void * d) {
    printf("Hello World\n");
    return KERN_SUCCESS;
}

kern_return_t HelloWorld_stop (kmod_info_t * kid, void * d) {
    printf("Goodbye World\n");
    return KERN_SUCCESS;
}

我正在通过以下方式编译和加载:

sudo kextload HelloWorld.kext

它出现在 kextstat 列表中:

...
  129    0 0xffffff7f80fac000 0x4000     0x4000     com.apple.driver.AppleProfileThreadInfoAction (85.2) <123 6 4 3 1>
  130    0 0xffffff7f80fb0000 0x4000     0x4000     com.apple.driver.AppleProfileTimestampAction (85.2) <123 5 4 3 1>
  132    0 0xffffff7f807c6000 0x2000     0x2000     sk-r-d.HelloWorld (1) <4>

但是,我在 kernel.log(或 system.log)中没有任何内容 - 我应该看到我的 printf() 语句。知道为什么吗?

【问题讨论】:

  • 你确定你的 kext 没有被意外地当作 C++ (IOKit) kext 对待吗?如果是,则不会调用 start/stop。
  • 也许我在 xcode 中选择了错误的模板。我今晚去看看,谢谢。
  • 不,我肯定选择了IOKit驱动。
  • 那是你的问题,如果你想使用启动/停止功能,你需要使用“通用内核扩展”模板。

标签: macos kernel kernel-extension xnu


【解决方案1】:
sudo nvram boot-args="kext-dev-mode=1 debug=0x22"

【讨论】:

  • 请在您的答案中使用代码块作为代码 sn-p。更好的答案还包括解释为什么此代码行是 OP 问题的答案。
  • 请同时解释代码而不是仅发布代码。
【解决方案2】:

由于某种原因,控制台应用似乎没有显示来自 kexts 的 printf 消息,但日志控制台程序会显示。

我用以下神奇的词取得了成功......

log stream --predicate 'eventMessage contains "YourMatchingPatternHere"'

这将生成一个过滤流,仅显示与您的预定义模式匹配的消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多