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,导致死锁。