linux 死锁问题查找方法
步骤
pstack 输出进程堆栈信息到文件,查找死锁线程
pstack 进程pid > pstack.txt

__lll_lock_wait () 可能就是死锁相关的线程,记录LWP 31391
gdb 查看进程的堆栈信息
#进入正在运行的进程
gdb attach 进程pid
#查看线程信息,查找到 LWP 31391 对应的线程ID
(gdb) info threads

#进入线程
(gdb) t 线程ID
#查看线程堆栈
(gdb) bt

#查看第7帧
(gdb) f 7

__lock = 2,m_distCs 为死锁对象, 查找锁的拥有者线程(__owner的值) LWP 31387
#查看线程信息,查找到 LWP 31387对应的线程ID
(gdb) info threads

(gdb) t 线程ID
#查看线程堆栈 分析死锁原因
(gdb) bt

查看堆栈代码 DistManager::closeDistServer 函数中有锁对象 m_distCs ;
pthread_join () 查看代码 进行了停止线程并等待线程退出,被停止的线程一直不退出,导致这个线程一直未释放锁对象 m_distCs ,这就是死锁的原因;
那么就根据代码逻辑去找到对应的线程处理函数;
我的代码线程处理函数是 GBTcpMediaAgent::run 去 pstack.txt 搜索这个函数, 查找到对应线程是 LWP 31394

查看代码在DistManager::getDistServer函数中正在等待获取锁对象锁对象 m_distCs。
总结原因:
线程 LWP 31387 持有锁对象m_distCs, 等待线程 LWP 31394 结束,
线程 LWP 31394 再等待获取锁对象m_distCs,导致死锁。
本文介绍了一种通过pstack和gdb工具定位Linux系统中进程死锁的方法。具体步骤包括使用pstack获取进程堆栈信息,利用gdb进一步分析锁定状态,最终确定导致死锁的线程及原因。
635

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



