1.场景
公司项目使用多线程开发,因此使用gdb exec -c corefile运行core文件后,使用bt打印堆栈信息 看不出问题,需要进入到线程内部分析。
2.分析
1. info threads 打印线程信息

可以看到有多个__lll_lock_wait () , 看到这里,我们推测可能是锁出现问题了。那么继续往,进入到线程内部,随便找一个是__lll_lock_wait ()状态的,使用thread(缩写 t)t 639 ,在使用bt查看堆栈

使用frame(错写 f) f 3进入到函数内部,打印函数内部的变量查看是哪个锁被哪个线程锁住了

可以看到 gUserStateInfoLock 被线程 19204 锁住了。在info thread 打印的线程信息可以看到19204 对应的线程号是566,进入到 566 线程内部 t 566,该线程占用了 gUserStateInfoLock

在findCorpInfoNodeByPhoneNu 内部,请求使用g_XmlCorpInfoListLock 锁,该锁被 t 14 占用

t 14 线程占用了g_XmlCorpInfoListLock ,同时又在等待 gUserStateInfoLock,
而gUserStateInfoLock 被19024 这个程序,因此可以断定是发生死锁了。
3 解决
使用了四种解决死锁方式里其中的一种,就是保持枷锁顺序的一致性。线程1使用锁1,和锁2的顺序,那么线程2也应该使用锁1和锁2 的顺序
本文通过一个具体的多线程开发项目中遇到的死锁问题,详细展示了如何使用gdb工具进行线程分析,定位并解决死锁的方法。通过打印线程信息和堆栈跟踪,最终确定死锁发生在特定的线程间,并采用一致的锁顺序策略解决了问题。
7451

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



