进程和线程
进程是管理者由task_struct进行统一管理
其实一个进程对应着一个task_struct
线程是真实处理任务的,单线程来讲,其本身就是一个进程
线程有自己的堆栈空间
通过ulimit -a可以看到线程栈空间的限制为8192kb
所以当你创建一个线程时会开辟出自己的空间,线程之间访问内存是由task_struct实现的。
所以一个进程内的线程是可以访问另外一个线程的变量(锁暂且不提)
下面在来说下异常捕获
捕获异常需要注册信号
最简单的是signal函数signal(int, void(*)(int)),异常信号是SIGABRT
注册意味着内核收到进程内某一线程触发的信号时会调用该函数做后续处理,当然也存在默认处理方式
当内核收到异常信号,会触发注册过的回调,此时执行该回调的就是出现问题的线程,所以获取的堆栈也为该线程的堆栈信息。
本文重点是想说明进程是虚拟的,线程是实体,以及捕获信号时的函数执行位置
因为有些人会困惑自己注册了异常捕获函数,但获得的堆栈信息是否为出现问题的线程堆栈
下面给出一例捕获异常的函数堆栈信息

此处是由多free了一次导致的异常。
所以问题点可以直接找析构函数,查看哪个析构导致的。
如果不用这种方法来查看在哪多free了,估计时间要消耗很久
本文探讨了进程和线程的区别,指出进程是虚拟概念,由task_struct管理,而线程是执行实体。重点讲解了线程有自己的堆栈空间及异常捕获中信号处理函数的位置。通过实例解析异常来源并追踪堆栈信息。

2万+

被折叠的 条评论
为什么被折叠?



