一个线程内存泄漏问题定位过程( 三 )


如果一个线程结束运行 , 但没有被join 。则它的状态类似进程中的Zombie Process , 即还有一部分资源没有被回收 , 所以创建线程者应该调用pthread_join()来等待线程结束 , 并可得到线程的退出代码 , 回收其资源 。
如果父进程调用pthread_detach(child_thread_id)或者子进程调用pthread_detack(pthread_self())即可将子进程状态设置为detached , 该程序运行结束后会自动释放所有资源 。
4.2 关于在maps中显示[stack:TID]在进程maps中显示线程栈信息 , 最后在内核中被放弃 。
首先在《procfs: mark thread stack correctly in proc/<pid>/maps》中 , 添加了[stack:TID]用于表示此vma对应的是线程TID的stack区域 。
这样做的好处是 , 可以从maps中明确知道此段vma是被哪个线程使用的 。
有一个坏处就是先线程非常多情况下 , 主线程中为了显示[stack:TIS] , 开销就会很大 , 而实际上用处不是很大 。
所以在《proc: revert /proc/<pid>/maps [stack:TID] annotation》将进程maps中的[stack:TID]删除了 , 只显示为匿名内存 。
最终再《fs/proc: Stop trying to report thread stacks》将所有[stack:TID]全部移除 。
那么在没有[stack:TID]的情况下如何断定vma是否是线程栈呢?
首先线程栈大小可以通过ulimit -s查看 , 所以maps中vma大小和这个一致;并且属性应该是匿名的rw-p 。
然后上面应该是一页大小作为分隔区间 , 分隔页的属性应该是---p 。

【一个线程内存泄漏问题定位过程】


推荐阅读