【Linux】Linux下的gbd调试,你学废了吗

这篇具有很好参考价值的文章主要介绍了【Linux】Linux下的gbd调试,你学废了吗。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

操作系统 核心数
centos 3.10.0 32位单核

线程死锁状态时查看栈

在线程-线程安全之互斥中,我们自己写了一个模拟实现的线程死锁情况
【Linux】Linux下的gbd调试,你学废了吗

我们用gbd调试查看了当前线程的调用,仅仅能知道当前线程处于lock_wait请求锁阻塞状态,
【Linux】Linux下的gbd调试,你学废了吗

我们不知道当前线程持有哪把锁,被阻塞的锁是什么,那么首先需要将gbd调试工具升级一下了

升级gbd

升级gbd调试工具(升级后可以看到当前线程加的是哪把锁)

1.先修改"/etc/yum.repos.d/CentOS-Debuginfo.repo"文件的 enable=1;有时候该文件不存在,则需要手工创建此文件并加入以下内容:

[debug]
name=CentOS-7 - Debuginfo
baseurl=http://debuginfo.centos.org/7/$basearch/ 
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7 
enabled=1

2.执行sudo yum install -y glibc
3.执行sudo debuginfo-install glibc


升级完成后,再次调用pstack [pid]就能看到当前的线程加的是哪把锁了。
【Linux】Linux下的gbd调试,你学废了吗

我们现在可以知道当前线程要加哪把锁了,但是不知道当前线程已经加了哪把锁

通过gdb在程序运行时进行调试

首先在makefile文件中需要加入两个命令行参数:-lpthread -g分别表示需要链接线程库和需要进行gbd调试。
运行起来之后,

  1. gdb attach[pid]
    【Linux】Linux下的gbd调试,你学废了吗

  2. thread apply all bt (展示所有线程的调用堆栈)
    【Linux】Linux下的gbd调试,你学废了吗

  3. t 3 (展示线程3的当前堆栈)
    【Linux】Linux下的gbd调试,你学废了吗

  4. bt (展示当前线程的调用堆栈)
    【Linux】Linux下的gbd调试,你学废了吗

  5. 由于线程A拿不到B锁,所以查看当前线程A的调用堆栈f 3
    【Linux】Linux下的gbd调试,你学废了吗

  6. 查看锁B,以此来看为什么线程A拿不到锁B p lock_B
    【Linux】Linux下的gbd调试,你学废了吗

通过查看锁B,发现锁B的owner是线程号为30072的线程持有,回看线程ID,发现30072是线程B。意味着当前的B锁是被线程B持有的。而线程A在请求由线程B持有的锁,故线程A一直在等待。
【Linux】Linux下的gbd调试,你学废了吗

至此,终于知道了为何当前程序运行起来后就卡死了,由于当前线程中AB线程分别拿着自己的AB锁,又在同时请求对方的BA锁,这时造成了死锁。文章来源地址https://www.toymoban.com/news/detail-431237.html

到了这里,关于【Linux】Linux下的gbd调试,你学废了吗的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux操作系统下的权限设置

    Linux操作系统是一个多用户的操作系统,可以同时存在多个用户去访问我们的设备;在同一台Linux设备下,当我们不希望我们的文件被其它用户访问时,我们可以为其设置相应的权限~ 在开始介绍今天的内容之前,我们先一起来思考一个问题:  作为用户的我们,在访问操作系

    2024年02月04日
    浏览(74)
  • Linux下的系统编程——基础操作(一)

    前言: linux系统编程是基于Linux系统进行程序开发的一个过程,主要涉及到的是linux系统中的函数使用如下图所示: 最外层的是咱们的应用程序,这部分程序大多调用的是咱们标准库,或者说是C库,这部分库函数能满足大部分的应用程序的开发,但是这部分库函数访问硬件的

    2024年02月11日
    浏览(40)
  • linux学习(gbd进程)[5]

    冯诺依曼结构

    2024年02月15日
    浏览(32)
  • 【Linux操作系统】深入了解系统编程gdb调试工具

    在软件开发过程中,调试是一个非常重要的步骤。无论是在开发新的软件还是维护现有的代码,调试都是解决问题的关键。对于Linux开发者来说,GDB是一个非常有用的调试工具。在本文中,我们将探讨Linux中使用GDB进行调试的方法和技巧。 GDB是GNU调试器的缩写,是一个功能强

    2024年02月14日
    浏览(49)
  • 哈工大操作系统实验一--调试分析 Linux 0.00 引导程序

    1.1.1 bochs Bochs 是一个开源的 x86 模拟器和调试器,允许您在虚拟环境中模拟 x86 架构的计算机系统。Bochs 的主要用途之一是用于开发和调试操作系统内核、嵌入式系统以及其他与低级系统编程相关的任务。它提供了一种方式来模拟整个计算机系统,包括处理器、内存、设备和外

    2024年02月07日
    浏览(56)
  • Linux系统下的程序调试工具——GDB(GNU Debugger)

    GCC(GNU Compiler Collection)是GNU开发的编程语言编译器,它支持多种编程语言,如C、C++、Objective-C、Fortran、Ada和Go等。 以下是一些常用的操作: 启动GDB并加载程序 设置断点 在代码中的某一行设置断点,当程序运行到这一行时,GDB会暂停执行。 例如,如果你在 main.c 文件的第

    2024年04月13日
    浏览(51)
  • Apifox WebSocket 调试功能你会用了吗?

    在 2.2.32 及更高版本的 Apifox 中,支持对  WebSocket API  进行调试。 WebSocket  是一种在单个 TCP 连接上进行全双工通信的 API 技术。相比于传统的 HTTP 请求,WebSocket 具有更低的延迟和更高的效率。它适用于需要长时间保持连接并实时传输数据的场景,例如在线游戏、实时聊天等

    2024年02月08日
    浏览(49)
  • 汽车电子笔记之:AUTOSA架构下的多核OS操作系统

    目录 1、AUTOSAR多核操作系统 1.1、OS Application 1.2、多核OS的软件分区 1.3、任务调度 1.4、核间任务同步 1.5、计数器、报警器、调度表 1.6、自旋锁与共享资源 1.7、核间通信IOC 1.8、OS Object中元素交互 1.9、多核OS的启动与关闭 2、多核OS注意事项 2.1、最小部署单元 2.2、核间通信及影

    2024年02月11日
    浏览(44)
  • 【Linux系统】结合有趣的小故事让你学懂生产者消费者模型

    有一个小朋友叫小C,他住的地方没有超市,只有几家供货商,因为每家供货商类型单一,买东西还要跑来跑去的,而且供货商晚上还不开门,买东西特别不方便,不仅小C觉得麻烦,其他人也觉得麻烦。小C想:为什么不能把这几家供货商的东西先放在一个地方呢,再由几个人

    2024年02月17日
    浏览(38)
  • uni-app真机预览调试:关于ios系统真机调试的操作步骤

    介绍: 因手机差异较大,HBuilder并没有提供App的模拟器。不管uni-app或5+App/wap2app项目,都需要连接真实的手机或手机模拟器来运行测试,称之为“真机运行”。 iOS平台 HBuilder支持itunes协议,在HBuilder运行的电脑上,使用usb线连接iPhone或iPad;如果是mac电脑,则可以连接XCode自带

    2023年04月23日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包