定位段错误所在位置
作者:互联网
概述
关于产生段错误之后很难定位,主要是在多线程中,不知道在哪个位置,目前发生一个方法可以发现段错误所在线程,记录如下
准备
- 线程创建需要使用
prctl
函数来指明线程名字,此名字将会在段错误时显示出来 - 没有了,好像
原理
/proc/xxx/task/yyy/status
xxx 进程号,yyy 线程号,task 线程目录, status 状态文件- status 文件下有
SigBlk
标志,当然也有其它的,但这个作用于段错误说明。 SigBlk
内容说明如下
01001011 10000001 01111110 11111011
| | || | | |||||| ||||| ||
| | || | | |||||| ||||| |+-- 1 SIGHUP (hangup)
| | || | | |||||| ||||| +--- 2 SIGINT (interrupt)
| | || | | |||||| ||||+----- 4 SIGILL (illegal instruction)
| | || | | |||||| |||+------ 5 SIGTRAP (trace/trap)
| | || | | |||||| ||+------- 6 SIGABRT (abort)
| | || | | |||||| |+-------- 7 SIGEMT (emulation trap)
| | || | | |||||| +--------- 8 SIGFPE (floating point exception)
| | || | | |||||+------------ 10 SIGBUS (bus error)
| | || | | ||||+------------- 11 SIGSEGV (segmentation violation)
| | || | | |||+-------------- 12 SIGSYS (bad system call)
| | || | | ||+--------------- 13 SIGPIPE (broken pipe)
| | || | | |+---------------- 14 SIGALRM (alarm)
| | || | | +----------------- 15 SIGTERM (termination)
| | || | +-------------------- 17 SIGUSR2 (user signal 2)
| | || +--------------------------- 24 SIGTSTP (stop -- can be ignored)
| | |+----------------------------- 25 SIGCONT (continue)
| | +------------------------------ 26 SIGTTIN (terminal input)
| +-------------------------------- 28 SIGVTALRM (timer expiration)
+----------------------------------- 31 SIGXFSZ (file size exceeded)
可以看到,如果值是 00000400 即为段错误。在代码中可以直接检测如果有值,即不是全0,就可以输出。
实现
直接获取进程id,然后遍历线程号中的 status,找到对应标志部分,打印输出。代码略
未来
是否还有什么可以利用的功能,待研究后再看,目前此方法的准确度也在验证中。
标签:status,定位,SigBlk,错误,yyy,线程,所在位置,trap 来源: https://blog.csdn.net/leishengsheng/article/details/99414757