什么是“segfault”?

段错误 - segmentation fault(通常简称为segfault)或者访问冲突是由具有内存保护的硬件引发的错误,用于通知操作系统 (OS) 内存访问冲突。
Linux 内核将通过执行一些纠正措施来响应它,通常通过向进程发送类似 #11 的信号将故障传递给违规进程。
在某些情况下,进程可以安装自定义信号处理程序,允许它们自行恢复,否则将使用 Linux 默认信号处理程序。
段错误通常会导致进程终止,并生成具有正确 ulimit 设置的核心转储。

/var/log/messages 文件中的“segfault”消息是什么

这篇文章解释了如何分析消息文件中的段错误消息以及如何识别应用程序或者操作系统端的问题。

查看更多教程 https://on  itroad.com

如何检查segfault?

1.表示段错误

段错误通常仅表示一个特定进程或者程序中的错误。
它并不表示 Linux 内核的错误。
内核只是检测进程或者程序的错误,并(在某些架构上)将信息打印到日志中,如下所示:

kernel: login[118125]: segfault at 0 ip 00007f4e4d5334a8 sp 00007fffe9177d60 error 15 in pam_unity_uac.so[7f4e4d530000+b000]
kernel: crond[16398]: segfault at 14 ip 00007fd612c128f2 sp 00007fff6a689010 error 4 in pam_seos.so[7fd612baf000+f5000]
kernel: crond[17719]: segfault at 14 ip 00007fd612c128f2 sp 00007fff6a689010 error 4 in pam_seos.so[7fd612baf000+f5000

2. 这条消息的详细信息是什么意思?

RIP 值为指令指针寄存器值,RSP 为堆栈指针寄存器值。
错误值是缺页错误代码位的位掩码(来自 arch/x86/mm/fault.c):

* bit 0 == 0: no page found 1: protection fault
* bit 1 == 0: read access 1: write access
* bit 2 == 0: kernel-mode access 1: user-mode access
* bit 3 == 1: use of reserved bit detected
* bit 4 == 1: fault was an instruction fetch

这是错误位定义:

enum x86_pf_error_code {
PF_PROT = 1 << 0,
PF_WRITE = 1 << 1,
PF_USER = 1 << 2,
PF_RSVD = 1 << 3,
PF_INSTR = 1 << 4,
};

错误代码 15 是 1111 位。
最后,我们可以知道1111的含义如下:

01111
^^^^^
||||+---> bit 0
|||+----> bit 1
||+-----> bit 2
|+------> bit 3
+-------> bit 4

此消息表明应用程序触发保护错误,因为该进程尝试在用户模式下对内存的保留部分进行写访问。

日期:2020-09-17 00:14:14 来源:oir作者:oir