记录用bsdlog来输出aix内核信息的步骤

本文发布时间: 2019-Mar-22
之前曾写过一个关于用gcc在aix中做内核扩展的博文,当时的信息输出用uprintf,当时的目的只是简单验证gcc做个内核扩展的可行性,所以bsdlog貌似当时也试过可以,但是觉得相对uprintf,步骤要繁琐一点。现在实际的项目当中,发现uprintf有时候不可行,事实上目前我们遇到的问题是bsdlog也不可行,不过至少用bsdlog要稍微有点驾轻就熟的意思了。1. 改写/etc/syslog.conf,在后面加了这么一行: kern.info /tmp/debug.log2. 然后用touch命令生成debug.log作为kernel info级别消息的输出 bash-3.2#touch /tmp/debug.log3. 重启一下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"); }内核模块加载后,查看/tmp/debug.log文件:bash-3.2# cat /tmp/debug.logDec 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??


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:11pm
栏目列表