放了一个定时任务,定时执行dmesg -c
$ cd /etc/cron.d
$ cat dmesg_clean
*/1 * * * * root dmesg -c &> /dev/null
$ sudo ls /var/log/messages* -alk
-rw------- 1 root root 566 Aug 21 11:37 /var/log/messages
-rw------- 1 root root 20 Feb 4 2018 /var/log/messages-20180204
-rw------- 1 root root 31 Feb 11 2018 /var/log/messages-20180211
-rw------- 1 root root 36 Feb 18 2018 /var/log/messages-20180218
$ sudo tail -n 100 /var/log/messages
Aug 21 08:59:40 bd-prod-xxx-websocket0 kernel: php[13658]: segfault at 700000001 ip 000000000080db71 sp 00007ffd50e816e8 error 4 in php[400000+acc000]
Aug 21 09:36:47 bd-prod-xxx-websocket0 kernel: php[26264] general protection ip:80db71 sp:7ffd50e7f7b8 error:0 in php[400000+acc000]
Aug 21 09:47:23 bd-prod-xxx-websocket0 kernel: php[17303]: segfault at 700000001 ip 000000000080db71 sp 00007ffd50e814b8 error 4 in php[400000+acc000]
Aug 21 10:06:43 bd-prod-xxx-websocket0 kernel: php[7963]: segfault at 700000001 ip 000000000080db71 sp 00007ffd50e7f6a8 error 4 in php[400000+acc000]
Aug 21 10:18:16 bd-prod-xxx-websocket0 kernel: php[23554]: segfault at 700000001 ip 000000000080db71 sp 00007ffd50e7f7b8 error 4 in php[400000+acc000]
Aug 21 10:29:10 bd-prod-xxx-websocket0 kernel: php[9988]: segfault at 700000001 ip 000000000080ecc0 sp 00007ffd50e7f240 error 4 in php[400000+acc000]
Aug 21 10:47:32 bd-prod-xxx-websocket0 kernel: php[12081] general protection ip:80db71 sp:7ffd50e816e8 error:0 in php[400000+acc000]
Aug 21 10:53:05 bd-prod-xxx-websocket0 kernel: php[23095] general protection ip:80db71 sp:7ffd50e814b8 error:0 in php[400000+acc000]
Aug 21 11:12:15 bd-prod-xxx-websocket0 kernel: php[4216]: segfault at 700000001 ip 000000000080db71 sp 00007ffd50e7f248 error 4 in php[400000+acc000]
Aug 21 11:37:10 bd-prod-xxx-websocket0 kernel: php[16907] general protection ip:80db71 sp:7ffd50e816e8 error:0 in php[400000+acc000]
段错误:
Nov 3 17:03:54 haier-45 kernel: haierUpassServe[22708]: segfault at 3946 ip 0000000000003946 sp 00007f56edf20e18 error 14 in haierUpassServer[400000+13000]
以上信息说明:
开始是系统当前时间
进程名字及pid
segfault at 引起故障的地址
ip 指令的内存地址
sp 堆栈指针地址, 及栈顶指针
err is not an errno nor a signal numbe, but page fault error code
[400000+13000] 对象崩溃时映射的虚拟内存起始地址和大小
这种信息一般都是由内存访问越界造成的,不管是用户态程序还是内核态程序访问越界都会出core, 并在系统日志里面输出一条这样的信息。这条信息的前面分别是访问越界的程序名,进程ID号,访问越界的地址以及当时进程堆栈地址等信息,比较有用的信息是 最后的error number.
在上面的例子中,error number是4, 转成二进制就是100, 即bit2=1, bit1=0, bit0=0, 按照上面的解释,我们可以得出这条信息是由于用户态程序读操作访问越界造成的。
error number是由三个字位组成的,从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7.
bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址
reference: https://stackoverflow.com/questions/2549214/interpreting-segfault-messages