进程和线程以及异常信号捕获堆栈

进程和线程

进程是管理者由task_struct进行统一管理
其实一个进程对应着一个task_struct
线程是真实处理任务的,单线程来讲,其本身就是一个进程
线程有自己的堆栈空间
通过ulimit -a可以看到线程栈空间的限制为8192kb

所以当你创建一个线程时会开辟出自己的空间,线程之间访问内存是由task_struct实现的。
所以一个进程内的线程是可以访问另外一个线程的变量(锁暂且不提)

下面在来说下异常捕获

捕获异常需要注册信号
最简单的是signal函数signal(int, void(*)(int)),异常信号是SIGABRT
注册意味着内核收到进程内某一线程触发的信号时会调用该函数做后续处理,当然也存在默认处理方式
当内核收到异常信号,会触发注册过的回调,此时执行该回调的就是出现问题的线程,所以获取的堆栈也为该线程的堆栈信息。

本文重点是想说明进程是虚拟的,线程是实体,以及捕获信号时的函数执行位置
因为有些人会困惑自己注册了异常捕获函数,但获得的堆栈信息是否为出现问题的线程堆栈

下面给出一例捕获异常的函数堆栈信息
在这里插入图片描述
此处是由多free了一次导致的异常。
所以问题点可以直接找析构函数,查看哪个析构导致的。
如果不用这种方法来查看在哪多free了,估计时间要消耗很久

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值