定位段错误所在位置

概述

关于产生段错误之后很难定位,主要是在多线程中,不知道在哪个位置,目前发生一个方法可以发现段错误所在线程,记录如下

准备

  1. 线程创建需要使用 prctl 函数来指明线程名字,此名字将会在段错误时显示出来
  2. 没有了,好像

原理

  1. /proc/xxx/task/yyy/status xxx 进程号,yyy 线程号,task 线程目录, status 状态文件
  2. status 文件下有SigBlk 标志,当然也有其它的,但这个作用于段错误说明。
  3. 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,找到对应标志部分,打印输出。代码略

未来

是否还有什么可以利用的功能,待研究后再看,目前此方法的准确度也在验证中。

你可能感兴趣的:(定位段错误所在位置)