首页 > 其他分享 >GDB多线程调试-发现卡死的线程

GDB多线程调试-发现卡死的线程

时间:2023-03-14 20:11:49浏览次数:35  
标签:多线程 gdb GDB 线程 进程 main id 调试

背景

在开发项目的一个feature时,发现有一个线程hang住,一直无法向元数据管理模块发送心跳,导致线程所在的机器被drop掉,组里的一个同学使用gdb找到了hang住的原因,于是自己也决定学一下这种方法。

测试程序

启动两个线程,竞争互斥锁,其中一个线程拿到锁之后不释放,两个线程因为死锁必然会卡住,利用gdb找到每个线程hang住的位置。 image.png

步骤

  1. 为了生成调试信息,编译的时候加上-g选项。 image.png

  2. 后台启动main程序,查看main进程的进程id,779131。 image.png

  3. 查看进程内的所有线程。779131是main线程id(也是进程id),779132和779133是main线程启动的两个线程id,就是代码中的thread1和thread2。 image.png

  4. 用gdb attach main调试main进程。main线程启动的两个新线程id,如下图所示。 image.png

  5. 用info threads命令查看所有线程。最前面的*号表示当前线程。 image.png

  6. 用thread n命令切换线程,用bt命令检查每个线程的栈信息。可以看到线程一直阻塞在main.cpp的第10行,而第10行正是mu.lock()加锁的行,同样的方法可以找到另一个线程阻塞的位置。 image.png

总结

  • pstree -p ${pid}可以查看进程的所有线程关系。
  • gdb attach ${pid}可以调试已经启动的进程。
  • gdb中执行info threads可以查看所有的线程信息
  • gdb中执行thread n可以切换当前线程,通过bt命令查看当前线程的栈信息。

下一步

特意阅读了下《Debugging with GDB》,书中有关多线程调试的章节还是挺多的,但是都没有结合例子说明,阅读的难度对我来说还是挺大的,只能自己google+尝试实践。

标签:多线程,gdb,GDB,线程,进程,main,id,调试
From: https://www.cnblogs.com/lidabo/p/17216160.html

相关文章

  • 证明线程确实共享内存
    实践:++xHellofromthread2Hellofromthread7Hellofromthread3Hellofromthread4Hellofromthread5Hellofromthread6Hellofromthread8Hellofrom......
  • 为什么要使用线程池?创建线程池的参数有哪些?线程池的原理是什么?
    为什么要使用线程池?线程池有一下优点:线程在是非常宝贵的资源,使用线程池可以重复使用线程,避免频繁的创建和销毁线程所带来的系统损耗。可以根据系统的具体情况调整线程......
  • MFC-多线程
             ......
  • 多线程编程(二)(李慧芹)
    (37条消息)互斥锁(mutex)_清风徐来Groot的博客-CSDN博客Linux中提供一把互斥锁mutex(也称之为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁......
  • 【多线程】C++11多线程(简约但不简单) 原创
    【多线程】C++11多线程(简约但不简单) 目录​ ​一、简单使用​​​ ​1、线程参数​​​ ​2.类成员函数做为线程入口​​​ ​3.join:等待线程执......
  • Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量详解
    Hello、Hello大家好,我是ST,今天我们继续来聊一聊Linux中多线程编程中的重要知识点,详细谈谈多线程中同步和互斥机制。1、同步和互斥互斥:多线程中互斥是指多个线程访问同一资源......
  • 【线程同步工具】CyclicBarrier源码分析
    在指定状态点同步任务Java并发API提供了可以使多个线程在一个指定点同步的工具类CyclicBarrier,该类前文介绍的CountDownLatch有些类似,但是它的一些特殊性使得其更为......
  • Java线程池
    线程池的目的是通过对线程的管理,让多线程程序中的多线程便捷开发、高效运行。线程池的存在的意义让线程变得可重用,减小线程创建和销毁带来的消耗。线程池中保留的可用......
  • 线程池
    基本原理:    importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassExecutorsDemo{//创建线程池的两......
  • 自己动手从零写桌面操作系统GrapeOS系列教程——12.QEMU+GDB调试
    学习操作系统原理最好的方法是自己写一个简单的操作系统。写程序不免需要调试,写不同的程序调试方式也不同。如果做应用软件开发,相应的程序调试方式是建立在有操作系统......