GDB排查死锁问题

news/2024/5/20 15:17:57 标签: linux, 死锁, gdb

不是专业开发,偶尔遇到死锁问题,请前辈检查,记录如下:

首先,通过如下指令,找到名为hw的进程:

ps -ef |grep hw

然后,进入gdb

sudo gdb

关闭分页功能:

set pagination off

通过attach进入到进程中(假设hw进程为3223):

attach 3223

对所有的线程执行bt指令(栈回溯)

thread apply all bt

 我们发现某个线程中持续显示锁的等待:

__lll_lock_wait

所以注意到mutex的值是0x55ecaba12a40,使用

print *((pthread_mutex_t *)0x55ecaba12a40) 

可以看到其在某个函数中正在持锁等待。(这句话的意思和C语言类似,把地址0x55ecaba12a40中的值枪值转换成pthread_mutex_t类型的指针,并采用*取出实际的值打印一下。

下面内容源自chatgpt,请教了大佬,好多是错的,因此内容仅供参考。。

`pthread_mutex_t` 是用于在多线程环境下实现互斥锁的 POSIX 标准的结构体类型。它的定义通常包含以下成员:

```c

typedef struct

{

int __lock; // 用于存储锁状态的整数,可以是 0 或 1。

int __count; // 当前持有该锁的线程数目。 这里有误,实际表示std::recursive_mutex加锁的次数

int __owner; // 当前持有该锁的线程 ID。

int __nusers; // 正在尝试获取该锁的线程数目。  这里有误,实际表示持有该锁的线程数目

int __kind; // 锁的类型,可以是 PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_RECURSIVE 或 PTHREAD_MUTEX_ERRORCHECK。

int __spins; // 自旋等待的次数。

__pthread_list_t __list; // 链表头结构体,用于维护等待该锁的线程。

} pthread_mutex_t;

```

需要注意的是,这个结构体的具体实现可能会因不同的操作系统、编译器或代码库而有所不同。此外,由于这个结构体是 POSIX 标准的一部分,因此其成员的名称前缀通常是双下划线 `__`。

在 POSIX 标准中,`__lock` 字段表示互斥量或锁的锁定状态,可以是 0 或 1。具体含义如下:

- 当 `__lock` 字段为 0 时,表示互斥量或锁当前处于未锁定状态,即没有线程持有该互斥量或锁。

- 当 `__lock` 字段为 1 时,表示互斥量或锁当前处于锁定状态,即某个线程持有了该互斥量或锁。

- 当 `__lock` 字段为 2 时,表示互斥量或锁的状态值被意外修改,可能是代码出现了错误。

(ps:这里不准确)

需要注意的是,这里的 `__lock` 字段通常是 POSIX 系统实现所使用的,具体实现可能因操作系统、编译器或代码库的不同而有所不同。因此,在具体应用中,应该根据实际情况进行解释。

经过发现,此时1580线程根本就不存在,以至于卡死在这个函数流程中。

总之通过这种方式可以排查死锁问题。这次的死锁发现,发生在第三方sdk当中,于是这个锅甩到了供应商那里。。

ps:至于__lock = 2 到底是不是意味着异常,这点存疑,所以试了一下,用三个进程分别去拿锁, 打印状态:

发现刚开始,在gdb中直接打印锁(p lock_a) 其中lock_a为锁的变量名,发现__lock字段为0。当有一个线程持有锁以后,__lock字段变为1。当第二个线程开始尝试持有lock_a的时候,__lock就会变成2。第三个线程没有拿到,等待过程中lock_a仍然为2。

因此,结论是:

__lock为0时,代表锁没有被持有;

__lock为1时,代表有人持有锁;

__lock为2时,代表有地方持有锁,另一个地方正处于异常等待当中。

 


http://www.niftyadmin.cn/n/4962724.html

相关文章

飞天使-k8s基础组件分析-服务与ingress

文章目录 服务的介绍服务代理服务发现连接集群外服务服务发布无头服务 服务,pod和dns的关系端口转发通过expose 暴露应用服务案例INGRESSMetalLB使用参考文档 服务的介绍 服务的作用是啥? 提供外部调用,保证podip的真实性看看服务解决了什么…

AWS解决方案日:Web 3业务安全方案

近日,AWS合作伙伴之Web3解决方案日在香港举办,多家科技公司专家和企业代表就WEB 3.0方案、AI创新和Web 3.0安全进行了探讨。顶象现场展示了Web 3.0业务安全解决方案。 NFT是Web 3.0典型场景之一。NFT基于区块链技术的非同质化代币,具有不可分…

ip地址和地理位置有关系吗

在互联网时代,网络已经成为了人们生活中不可或缺的一部分。而在网络通信中,IP地址扮演着非常重要的角色。那么,IP地址和地理位置之间是否有关系呢?虎观代理小二二将从以下几个方面进行探讨。 一、IP地址和地理位置的基本概念 首…

repair taillights

自己修理汽车尾灯,可以根据型号去某宝买个回来自己安装:

手搭手入门MyBatis-Plus

MyBatis-Plus Mybatis-Plus介绍 为简化开发而生 MyBatis-Plus(opens new window)(简称 MP)是一个 MyBatis(opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 特性 无侵入&#…

【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

数组习题答案

基础题目 第一题:需求实现 模拟大乐透号码: 一组大乐透号码由10个1-99之间的数字组成定义方法,打印大乐透号码信息 代码实现,效果如图所示: 开发提示: 使用数组保存录入的号码 参考答案: p…

【面试经典150题】移除元素·JavaScript版

题目来源 大致思路:遍历数组,如果遇到值为val的元素,使用数组最后一个元素替换它。详细过程: /*** param {number[]} nums* param {number} val* return {number}*/ var removeElement function(nums, val) {let i0,nnums.leng…