GDB之死锁排查

本文探讨了多线程编程中常见的死锁问题,包括自身线程等待锁和两个线程间的相互等待。通过查看函数调用栈和分析互斥锁变量,可以定位死锁发生的原因。在不知道锁变量名的情况下,可以通过寄存器值来检查。针对x86和ARM平台,指出了不同架构下查看参数的寄存器。同时,给出了线程栈调用情况的示例,以帮助理解死锁现象。对于复杂场景,可能需要逐个线程排查。
摘要由CSDN通过智能技术生成

多线程中遇到的常见“死锁”可能有两种情况:1,自身线程等锁(这个应该不叫死锁);2,两个线程相互等对方的锁。

下面就两种情况分别举例:不管哪种情况,出现的时候首先查看函数调用栈,查找函数__lll_lock_wait。

1,本线程内等锁

出现这种情况一般是在一个函数里加锁了,在调用其他的函数里也加锁了,这样就像是嵌套加锁,导致卡死。

通过查看互斥锁变量值中的__owner可以得出,这个互斥锁所属线程为782(哪个线程先获取到锁,锁的拥有者就是该线程),其实就是当前线程。我这个是在项目代码中模拟死锁加的代码。这是已经知道互斥锁变量名称的情况下,打印出锁的信息,如果不知道互斥锁的情况下,该如何打印呢?办法是通过寄存器来看,如:

这个是ARM设备,通过打印r0寄存器查看参数。x86的话是另外一个寄存器,往下看。

2,死锁

这里直接取muduo里代码例子了。

打印thread 1的函数栈调用情况

 打印thread 2的函数栈调用情况

造成死锁的原因可以去看原文,截图如下:

 所举的例子都是线程少的情况下,如果是更多线程情况下呢,如:

 几十个线程都阻塞了,只能是一个一个线程查看了。

关于寄存器的测试得出:

x86机器:

64位:通过rdi寄存器传递第一个参数

32位:通过ebx寄存器传递第一个参数

ARM机器:通过r0传递第一个参数,r1传递第二个参数。

所以在不知道变量名的情况下,可以先切到对应的栈帧,再通过寄存器查看。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值