linux段错误问题

这几天程序运行过程中出现段错误,然后程序崩溃。不知道具体是哪个代码出问题了,有人恶意触发,导致程序一直崩溃。求解决

66666[27964]: segfault at 6a ip 00000000006d9c66 sp 00007fd0f2bf74b0 error 4 in 66666[400000+6ea000]
6[28118]: segfault at 6a ip 00000000006d9c66 sp 00007f608ebf74b0 error 4 in 6[400000+6ea000]
6666[31349]: segfault at 6a ip 00000000006d9c66 sp 00007fc8cd7f54b0 error 4 in 6666[400000+6ea000]
666[28386]: segfault at 6a ip 00000000006d9c66 sp 00007efe2159c4b0 error 4 in 666[400000+6ea000]
66[36668]: segfault at 6a ip 00000000006d9c66 sp 00007fde6ebf74b0 error 4 in 66[400000+6ea000]

这是一个段错误,原因是跟随一个空指针试图寻找要运行的代码(即在获取指令期间)。

如果这是一个程序,而不是一个共享库.

运行addr2line -e 段错误程序 00000000006d9c66 (并对给出的其他指令指针值重复)来查看错误发生的地方。

更好的做法是获得一个调试工具构建,并在调试器(比如gdb)下重新生成问题。

错误意味着什么?
以下是各领域的细分:
address(在at之后)——代码试图访问的内存位置(很可能6a是我们期望设置为有效值的指针的偏移量,但它却指向0)
IP-指令指针,即。执行此操作的代码存在于何处
Sp-堆栈指针

error—页面错误的错误代码;关于这在x86上的意义,请参阅下面的内容。
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/include/asm/trap_pf.h?h=v5.16#n5

/*

*页面错误错误码位:*bit0 == 0:没有发现页面1:保护故障

* bit 1 == 0:读访问1:写访问

* bit 2 == 0:内核模式访问1:用户模式访问

* bit 3 == 1:检测到保留位

* bit 4 == 1:错误是一个指令获取

* bit 5 == 1:保护键块访问

* bit 15 == 1: SGX MMU页面故障

*/

用gdb调试定位发现问题,或者输出dump文件查找定位。

ip6d9c66的6a服务无法有效寻址,该服务一共有5个sp(6,66,666,6666,666666),地址偏移是[400000+6ea000],错误码是4。可能是相关服务没有开机。

可以按这个试试

朋友你好,“error 4”是什么意思?你其实可以理解成:把它更换成二进制表示,就是:100。
说明是用户态内存访问越界了
bit2:值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址

这条信息是由于用户态程序写操作访问越界造成的,结论的得出基于下面的理论:
bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/include/asm/trap_pf.h?h=v5.16#n5