2017-04-11 62 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