定位段错误所在位置

概述

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

准备

  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,找到对应标志部分,打印输出。代码略

未来

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

转载于:https://my.oschina.net/u/145591/blog/3089491

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值