Linux程序崩溃时的信号量(signal)说明

一、概念说明

在程序崩溃的时候,我们将会获取到两个信息:

• signal: 信号量,下文将会详细的说明不同的信号量及其含义

• code: 错误码, 除了几个所有信号量(signal) 公共的错误码(code),一般不同信号量(signal)有特定的错误码(code),可以看做是信号量(signal)的补充说明。

二、信号量(signal) 和 错误码(code)说明

本节只介绍与崩溃相关的几个 signal(CrashSDK 捕获的 signal)及相关 code 的说明,更多内容见后面的参考文献或网上找资料了解。

1. SIGILL

SIG是信号名的通用前缀,ILL是 illegal instruction( 非法指令 ) 的缩写。

对应的数值为 4

SIGILL 是当一个进程尝试执行一个非法指令时发送给它的信号。

常见原因有:

  1. CPU架构不匹配
  2. .so 文件被破坏,或者代码段被破坏导致;
  3. 主动崩溃,如 _builtintrap() 也会使用非法指令来实现。

si_addr 为出错的指令。

该信号量中常见的错误码说明:

Code
说明
ILL_ILLOPC非法的操作码(opcode)
ILL_ILLOPN非法的操作数(operand)
ILL_ILLADR非法的寻址模式
ILL_ILLTRP非法的trap
ILL_PRVOPC特权操作码(Privileged opcode)
ILL_PRVREG特权寄存器(Privileged register)
ILL_COPROC协处理器错误
ILL_BADSTK内部堆栈错误

2. SIGBUS

SIG是信号名的通用前缀,BUS是bus error (总线错误 ) ,意味着系统检测到硬件问题后发送给进程的信号。

对应的数值为7

通常该信号的产生不是因为硬件有物理上的损坏,而是代码实现有 bug 导致 ,如地址不对齐,或者不存在的物理地址等。

si_addr 为所访问的非法地址。

该信号量中常见的错误码说明:

Code
说明
BUS_ADRALN访问的地址不对齐。32位处理器一般要求指针是4字节对齐的
BUS_ADRERR访问不存在的物理地址。一般是由于 mmap 的文件发生 truncated 导致。常见于文件访问过程中,被删除或者替换;或 mmap 到内存后,继续向文件写入且导致文件 truncated,再读取时就会出现该错误;另外, mmap 且访问超过文件实际大小的空间时,也可能会出现该错误
BUS_OBJERR特定对象的硬件错误
BUS_MCEERR_ARBUS_MCEERR_AR
BUS_MCEERR_AQBUS_MCEERR_AQ

3. SIGSEGV

SIG 是信号名的通用前缀, SEGV 是 segmentation violation 的缩写。

对应的数值为 11

该信号意味着一个进程执行了一个无效的内存引用,或发生段错误

si_addr 为所访问的无效地址。

该信号量中常见的错误码说明:

Code
说明
SEGV_MAPERR地址不在 /proc/self/map 映射中
SEGV_ACCERR没有访问权限

4. SIGFPE

SIG是信号名的通用前缀。FPE是floating-point exception(浮点异常)的首字母缩写拼接而成。

对应的数值为 8

该信号一般是算术运算相关问题导致的。

si_addr 为失败的指令。

该信号量中常见的错误码说明:

Code
说明
FPE_INTDIV整数除以 0
FPE_INTOVF整数溢出
FPE_FLTDIV浮点数除以 0
FPE_FLTOVF浮点数向下溢出
FPE_FLTRES浮点数结果不精确
FPE_FLTINV无效的浮点运算
FPE_FLTSUB下标超出范围

5. SIGABRT

SIG是信号名的通用前缀。ABRT是abort program的缩写。

对应的数值为 6

该信号意味着异常退出;通常是调用 abort(), raise(), kill(), pthread_kill() 或者被系统进程杀死时出现。

当错误码为 SI_USER 时表示是被其它程序杀死,一般情况是由于ANR被 system_server 杀死;

其他错误码一般是业务自己调用 abort() 等函数退出,此时错误码一般认为无效。

6. SIGSTKFLT

SIG是信号名的通用前缀,STKFLT是stack fault 的缩写。

对应的数值为 16

按照官方文档说明,该信号量意味着协处理器栈故障。

根据网上的部分问题结论说明,在内存耗尽时,一般 malloc 返回 NULL 且设置 errno 为 ENOMEM,但有些系统可能会使用 SIGSTKFLT 信号代替。

7. SIGPIPE

该信号对应的数值为 13

该信号意味着管道错误,通常在进程间通信产生,比如采用FIFO(管道)通信的两个进程,读管道没打开或者意外终止仍继续往管道写,写进程就会收到 SIGPIPE 信号。

8. SIGUSR2

为 12。用户自定义信号2。

9. SIGTERM

SIG是信号名的通用前缀,TERM 是 Termination 的缩写。该信号对应的数值为 15

与 SIGKILL (signal 9) 类似,不过 SIGKILL 不可捕获,而 SIGTERM 可被捕获。一般常见于 APP 处于后台时,被系统 vold 进程使用 SIGTERM 杀死,该情形基本没有意义,可忽略。

另外,chromium 多进程架构中,经常也会使用 SIGTERM 杀死出现了异常的子进程。

10. SIGSYS

该信号对应的数值为 31,通常是因为无效的 linux 内核系统调用而产生。

在 android O (android 8.0) 中,部分不安全的系统调用被移除,若代码中仍然使用它们,则会出现 SIGSYS。

11. SIGTRAP

该信号对应的数值为 5。gdb 调试设置断点等操作使用的信号。

Code
说明
TRAP_BRKPTTRAP_BRKPT
TRAP_TRACETRAP_TRACE
TRAP_BRANCHTRAP_BRANCH
TRAP_HWBKPTTRAP_HWBKPT

其他的信号对应的数值如下

参考文献:

  1. siginfo_t — data structure containing signal information
  2. linux系统编程之信号(一):中断与信号
  3. linux系统编程之信号(六):信号发送函数sigqueue和信号安装函数sigaction
  4. SIGSTKFLT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/125945.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle OCP OCM MySQL OCP认证难吗?

好多人在初次考OCP时,不知道如何选择,本文让姚远ACE老师为大家总结一下吧! 选择OCP认证时要注意的问题: 1,授课老师师资经验(非常重要) 2,课程大纲 3,试听课程 4&am…

7.wifi开发【智能家居:终】,实践总结:智能开关,智能采集温湿,智能灯。项目运行步骤与运行细节,技术归纳与提炼,项目扩展

一。项目运行步骤与运行细节 1.项目运行步骤(一定有其他的运行方式,我这里只提供一种我现在使用的编译方式) (1)项目运行使用软件与技术: 1.Virtual linux 使用这个虚拟机进行程序的编译 2.Makefile与shl…

10.4| QT实现TCP服务器客户端搭建的代码,现象

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件#include<QList> //链表容器 #include<QMessageBox> …

10.3 C++运算符重载实现的过程,代码

目录 运算符重载背景&#xff08;operator&#xff09; 定义 重载的方法 不能重载的运算符 运算符重载注意事项 代码实现 运行结果 运算符重载背景&#xff08;operator&#xff09; 自定义的类中&#xff0c;系统默认只提供两个运算符供用户使用&#xff0c;分别是赋值…

spark on hive

需要提前搭建好hive&#xff0c;并对hive进行配置。 1、将hive的配置文件添加到spark的目录下 cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf2、开启hive的hivemetastore服务 提前创建好启动日志存放路径 mkdir $HIVE_HOME/logStart nohup /usr/local/lib/apache-hi…

合并不同年度收入数据-外连接

案例需求&#xff1a;统计2019年和2020年的客户销售收入并求和 思路&#xff1a;使用pandas读取excel数据横向连接&#xff0c;使用sum()含函数求和 代码如下&#xff1a; 1、使用pandas读取excel数据 2、由于两个表一个是"客户名称"&#xff0c;一个是客户描述,使…

PHP 行事准则:allow_url_fopen 与 allow_url_include

文章目录 参考环境allow_url_fopenallow_url_fopen 配置项操作远程文件file 协议 allow_url_includeallow_url_include 配置项 allow_url_include 与 allow_url_fopen区别联系默认配置配置项关闭所导致异常运行时配置ini_set()限制 参考 项目描述搜索引擎Bing、GoogleAI 大模型…

毕设-原创医疗预约挂号平台分享

医疗预约挂号平台 不是尚医通项目&#xff0c;先看项目质量&#xff08;有源码论文&#xff09; 项目链接&#xff1a;医疗预约挂号平台git地址 演示视频&#xff1a;医疗预约挂号平台 功能结构图 登录注册模块&#xff1a;该模块具体分为登录和注册两个功能&#xff0c;这些…

C++库函数——set与map的模拟实现

1.红黑树的迭代器与改造 ①红黑树的迭代器 对于上面这棵红黑树&#xff0c;我们可以很容易得知道begin()是红黑树的最左节点&#xff0c;end()应该是一个空节点。即 iterator begin() {Node* cur _root;while (cur && cur->_left){cur cur->_left;}return cu…

蓝桥杯---第二讲---二分与前缀和

文章目录 前言Ⅰ. 数的范围0x00 算法思路0x00 代码书写 Ⅱ. 数的三次方根0x00 算法思路0x01代码书写 Ⅲ. 前缀和0x00 算法思路0x01 代码书写 Ⅳ. 子矩阵的和0x00 算法思路0x01 代码书写 Ⅴ. 机器人跳跃问题0x00 算法思路0x01 代码书写 Ⅵ. 四平方和0x00 算法思路0x01 代码书写 …

创意中秋与国庆贺卡 - 用代码为节日增添喜悦

目录 ​编辑 引言 贺卡的初始主题 - 中秋节 点击头像&#xff0c;切换至国庆主题 文本动画 用代码制作这个贺卡 获取完整代码&#xff08;简单免费&#xff09; 总结 引言 中秋佳节和国庆日是中国两个重要的传统节日&#xff0c;一个寓意团圆与祝福&#xff0c;另一个…

【AI视野·今日NLP 自然语言处理论文速览 第四十七期】Wed, 4 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 4 Oct 2023 Totally 73 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Contrastive Post-training Large Language Models on Data Curriculum Authors Canwen Xu, Corby Rosset, Luc…