linux 死锁问题查找方法

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::runpstack.txt 搜索这个函数, 查找到对应线程是 LWP 31394
在这里插入图片描述
查看代码在DistManager::getDistServer函数中正在等待获取锁对象锁对象 m_distCs。

总结原因:
线程   LWP 31387  持有锁对象m_distCs, 等待线程  LWP 31394 结束,
线程  LWP 31394  再等待获取锁对象m_distCs,导致死锁。
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值