段错误

signal: 11

exit code: 139

信号名: SIGSEGV

最常见的一类错误了

产生原因

  1. 访问不存在的内存地址
  2. 访问系统保护的内存地址
  3. 对内存地址进行不符合该内存地址权限的操作,例如读不可读的地址,写不可写的地址,执行不可执行的地址
  4. 内存对齐问题,经常会遇到类似这样的汇编命令movaps xmmword ptr [r64 + 0x??], xmm0,操作涉及到xmm寄存器,属于SIMD指令,其中movaps会检查[r64 + 0x??]地址是否16字节对齐,不对齐则异常,抛出段错误.

Bus error

signal: 7

exit code: 135

信号名: SIGBUS

产生原因

文件映射访问异常

这是 SIGBUS 在用户态最为常见最容易触发的情况,通常来说根本原因都是进程 mmap 了一个文件后,另外的进程把这个文件截断了,导致 mmap 出来的某些内存页超出文件的实际大小,访问那些超出的内存页就会触发 SIGBUS,具体来说有以下几种场景:

  1. 进程 mmap 一个文件后,其它进程 truncate 该文件到更小。

  2. 动态库更新,直接 cp 覆盖。

  3. 可执行文件更新,直接 cp 覆盖。

系统读取磁盘文件通常是按页映射到内存,出于效率考虑常常使用 copy on write 机制,所以文件映射之后,如果对应的文件 page 不存在了(truncated),也不见得会马上出问题,只有到访问时才会出错,因此有一定滞后期。

访问不对齐的内存

X86 平台上访问不对齐的内存时,默认不会有问题,但用户可以手动设置 EFLAGS 把 CPU 设置为不允许非对齐的内存访问,此时如果出现不对齐的内存访问,SIGBUS 就会抛出。

错误的系统调用

signal: 31

exit code: 159

信号名: SIGSYS

常见在开启了seccomp的程序中,当进行了被限制的系统调用时,抛出该错误

定时器信号

signal: 14

exit code: 14

信号名: SIGALRM

长时间未响应程序时抛出该信号

终止进程

signal: 6

exit code: 134

信号名: SIGABRT

产生原因

  1. 执行abort函数
  2. 执行assert函数
  3. double free or corruption (!prev),其实就是堆操作错误了,归根结底最后还是由abort函数触发

信号表