1. 改写/etc/syslog.conf,在后面加了这么一行:
kern.info /tmp/debug.log
2. 然后用touch命令生成debug.log作为kernel info级别消息的输出
bash-3.2#touch /tmp/debug.log
3. 重启一下syslogd这个daemon, 用ps命令查找syslogd的pid:
bash-3.2# ps -All | grep syslogd
240001 A 0 3932306 3211424 0 60 20 800360590 792 - 0:01 syslogd
上述命令的输出表明syslogd的pid=3932306
当然也可以直接cat /etc/syslog.pid这个文件来获取上述pid信息
4. 重启syslogd:
bash-3.2# kill -hup 3932306
注:如果后续删除掉/tmp/debug.log这个文件,然后再用touch重新生成,那么必须重启syslogd.
5. 现在内核扩展的代码中使用bsdlog就可以把消息输出到/tmp/debug.log文件中了,比如下面的代码片段:
- } else if (error == EEXIST) {
- bsdlog(LOG_INFO | LOG_KERN, "error = EEXIST\n");
- } else if (error == ENOMEM) {
- bsdlog(LOG_INFO | LOG_KERN, "error = ENOMEM\n");
- } else if (error == EINVAL) {
- bsdlog(LOG_INFO | LOG_KERN, "error = EINVAL\n");
- }
bash-3.2# cat /tmp/debug.log
Dec 19 01:35:54 dennis-test kern:info unix: error = EINVAL
不过我们目前遇到的问题上边的bsdlog也不管用,简单描述一下:
通过kernel service提供的inbound_fw,后者相当与aix中tcp/ip协议栈中的一个hook,当有ip包进入ip层时,内核在inboud_fw不为空的情形下调用它所指向的函数,所以类似一个kernel hook,我们将inbond_fw指向我们自己实现的函数,在那个函数中使用bsdlog无效,虽然我们可以确定inbound_fw所指向的函数被调用了。目前这个问题无解。内核里面的调试就是这样让人抓狂...
update: udp will be used by syslog to send msg? udp->ip... reenter??
又或者:A kernel process can use a larger set of system calls than a user process in kernel mode... Kernel routines running under user-mode processes cannot directly use a system call having parameters passed by reference...