2017-04-11 66 views
1

我遵循Creating a Generic Kernel Extension with Xcode教程。Mac内核编程通用内核扩展prinf()不起作用

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,这让我加载我自己的内核扩展。

# csrutil disable 

当我打开我自己的内核扩展到内核

$ sudo kextload -v /tmp/MyKext.kext 

的printf()的结果写不进/var/log/system.log。

我还设置启动参数

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

谁能帮助我吗?

+0

首先,您需要使用内核函数。所以'printf()'应该是'printk()' – user3629249

+0

有写入系统日志的特定函数。它们是:''openlog()','syslog()','closelog()' – user3629249

+0

@ user3629249:什么让你有这个想法? 'printf()'应该可以正常工作。 –

回答

1

显然,自Sierra至少(10.12)以来,他们重新组织了日志写入的方式(iOS支持?),因此您无法再在system.log中看到它。但是,在您的控制台应用程序中,您可以在边栏中找到一个Devices部分,您可以在其中选择您的设备(通常是您的Mac系统),并在搜索框中查看仅限于“内核”的实时日志。因此,我可以使用内核扩展负载/ 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变化。

重要对于一些怪异的原因,我需要重新启动控制台,以反映我的信息的变化,否则它显示的关键字(开始&停止)从以前的版本。确实很奇怪!

+0

关于控制台的评论刚刚解决了我的日志问题.....仍然没有得到为什么苹果没有提及它在任何地方......感谢信息:) – J1and1