在Linux驱动调试工作中,如果遇到内核卡死,只能断电复位,复位后打开/var/log/syslog文件,会发现卡死时的日志都丢了。
原因我猜是内核卡死后文件系统的缓存无法同步到磁盘,于是掉电时卡死前的日志就丢了。
而这些日志对我们定位问题意义重大,有了这些日志,我们才知道卡死的原因是空指针?还是死锁?还是死循环?
连接设备串口到上位机,然后配置好串口调试工具的波特率等参数,同时下位机在uboot
或grub
里配好console
参数值(一般是console=/dev/ttyS0,115200
之类的),串口打印就能看到了
优点:
缺点:
ssh连接到设备后,执行下面命令
watch -n 1 tail -30 /var/log/syslog
上面命令的意思是每间隔1s打印syslog文件的最后30行。这样当内核卡死时,watch
命令已经将日志从文件系统缓存搬移到屏幕缓存,所以日志信息不会丢
优点:
缺点:
更准确的说,该方法其实是ssh转发文件系统缓存。一般情况下,该方法也够用了。
由rsyslog
系统主动向上位机转发日志,需要上位机显式接收
优点:
缺点:
修改设备的rsyslog配置文件
,一般在/etc/rsyslog.d/50-default.conf
,添加一行UDP
转发规则
# Default rules for rsyslog.
#
# For more information see rsyslog.conf(5) and /etc/rsyslog.conf
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
#daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
#lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
#user.* -/var/log/user.log
*.*;auth,authpriv.none @192.168.20.103 #将日志以UDP形式转发到目标IP
接收端一般是Windows上位机,需要修改防火墙设置,开放syslog协议对应的514端口,否则Windows会拒绝接收
怎么配都收不到,放弃!
注意在过滤器
栏填写syslog
,这样就只显示syslog日志了。
只要思想不滑坡,办法总比困难多。