近期接触了Linux平台的测试,遇到了软件发生异常,从而接触到了 Linux平台下的Signal——信号,用来通知进程发生了异步事件。
作为测试,免不了需要初步判断一下是否是正在的异常,因此学习了一下Signal
NO
1
信号事件的发生有两个来源:
硬件来源(比如我们按下了键盘或者其它硬件故障);
软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。
按发出信号的原因简单分类,如下:
(1) 与进程终止相关的信号。
当进程退出,或者子进程终止时,发出这类信号。
(2) 与进程例外事件相关的信号。
如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。
(3) 与在系统调用期间遇到不可恢复条件相关的信号。
如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。
(4) 与执行系统调用时遇到非预测错误条件相关的信号。
如执行一个并不存在的系统调用。
(5) 在用户态下的进程发出的信号。
如进程调用系统调用kill向其他进程发送信号。
(6) 与终端交互相关的信号。
如用户关闭一个终端,或按下break键等情况。
(7) 跟踪进程执行的信号。
NO
2
Linux支持的信号列表如下(很多信号是与机器的体系结构相关的)
信号值 默认处理动作 发出信号的原因
SIGHUP 1 A 终端挂起或者控制进程终止
SIGINT 2 A 键盘中断(如break键被按下)
SIGQUIT 3 C 键盘的退出键被按下
SIGILL 4 C 非法指令
SIGABRT 6 C 由abort(3)发出的退出指令
SIGFPE 8 C 浮点异常
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管道破裂:写一个没有读端口的管道
SIGALRM 14 A 由alarm(2)发出的信号
SIGTERM 15 A 终止信号
处理动作一项中的字母含义如下
A 缺省的动作是终止进程
C 缺省的动作是终止进程并进行内核映像转储(dump core),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。
E 信号不能被捕获
F 信号不能被忽略
了解了以上信息后,再来看软件生成异常的log文件,其他的信息可以暂时不关注,将log信息中的Signal字段找出来,解读后面的数值
未了解之前:
跟开发了解了软件在出现异常时会写log,因此实时关注log的情况,生成log后就给开发提交bug
了解之后:
在生成的log中,很多的信号都是因一些操作产生的,如
1和15,在注销系统后就会产生;
9,测试的操作中经常会有kill进程的操作,log中的这些信号可以直接忽略
11是经常出现且需要重点关注的信号,遇到这个数字千万要放过
6和14,遇到这个信号也千万不要忽略,需要找开发进行分析讨论的哟,它可能是问题,当然,也可能不是问题
其他的信号,目前位置没有遇到过
以上简单分享了Linux下的Signal的含义,以及一些常用的信号值,后续还会继续有分享哟