多线程调试之痛

调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程序中的其他线程才会继续运行。这个限制使得被调试的程序不能够像真实环境中那样运行--当某个线程断在一个断点上,让其他线程并行运行。

GDBv7.0引入的non-stop模式使得这个问题迎刃而解。在这个模式下,

  • 当某个或多个线程断在一个断点上,其他线程仍会并行运行
  • 你可以选择某个被断的线程,并让它继续运行

让我们想象一下,有了这个功能后

  • 当其他线程断在断点上时,程序里的定时器线程可以正常的运行了,从而避免不必要得超时
  • 当其他线程断在断点上时,程序里的watchdog线程可以正常的运行了,从而避免嵌入式硬件以为系统崩溃而重启
  • 可以控制多个线程运行的顺序,从而重现deadlock场景了。由于GDB可以用python脚本驱动调试,理论上可以对程序在不同的线程运行顺序下进行自动化测试。

因此,non-stop模式理所当然成为多线程调试“必杀技”。这2009年下半年之后发布的Linux版本里都带有GDBv7.0之后的版本。很好奇,不知道VS2010里是不是也支持类似的调试模式了。

1. 前提
  gdb -v 查看版本信息
  7.0以前不支持non-stop模式

2. 把一下3行添加到~/.gdbinit来打开non-stop模式

set target-async 1
set pagination off
set non-stop on

然后 attach 到正在运行的线程

gdb thrname thrID

3. 然后可以用一下方式中断某个线程,其他线程保持运行; 或只运行某些线程 其他线程中断

3. 1 下断点到某个线程

b file:line thrNum

thrNum 可以在gdb中  用 info thr 命令查看

当这个线程执行到断点时,这个线程就停止了,但是其他线程不停止,还在继续执行

3.2 切换到某个线程

thr xthrNum

thrNum 可以在gdb中  用 info thr 命令查看

然后 输入命令继续执行这个线程  c

或者 执行某几个线程

thr apply thrNum1 thrNum2 ... continue

thrNum1 thrNum2 ... 为线程序号(用 info thr 命令查看)

转载于:https://www.cnblogs.com/lzpong/p/5881380.html

GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断...相关推荐

  1. GDB多线程调试常用命令

    gdb调试命令 step和next的区别? 当前line有函数调用的时候,next会直接执行到下一句 ,step会进入函数. 查看内存 (gdb)p &a //打印变量地址 gdb)x 0xb ...

  2. GDB多线程调试(调试命令+调试演示)

    多线程调试 (一)多线程调试命令 shell的命令: (1)查看当前运行的进程:ps aux | grep book (2)查看当前运行的轻量级进程:ps -aL | grep book (3)查看主 ...

  3. linux gdb模式下无反应,Linux,GDB 嵌入式Linux的GDB远程调试的问题--断点没反应

    院士 2006-12-22 22:43:00    评分 2楼 问 我用的是BF531 uClinux Linux version 2.6.16.11-ADI-2006R1-hhbf (root@se ...

  4. C语言:---gdb多线程调试

    1)恢复程序运行和单步调试 当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来.也可以使用step或next命令单步跟踪程序. continue [ignore- ...

  5. Linux gdb多进程、多线程调试

    目录 常用命令 堆栈相关命令 更为详细的断点调试 gdb多进程调试 gdb多线程调试 前言 gdb 是 linux 平台下进行程序调试的最常用的工具.简单的程序调试就是加断点,然后一步一步让程序运行, ...

  6. C++11多线程第三篇:线程传参详解,detach()大坑,成员函数做线程参数

    文章目录 3.1 传递临时对象作为线程参数 3.1.1 要避免的陷阱(解释1) 3.1.2 要避免的陷阱(解释2) 3.1.3 总结 3.2 临时对象作为线程参数进一步详解 3.2.1 线程id概念 ...

  7. linux的gdb远程调试,嵌入式Linux的GDB远程调试如何实现呢?

    有道启新嵌入式研究院--远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接.使用GDB标准远程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能.调试s ...

  8. winform判断线程有没有完成_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...

    △ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...

  9. 项目使用线程池_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...

    △ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...

  10. 多线程调试(gdb命令行和使用集成开发qtcreator查看线程状态)

    我在qtcreator中用调用的gdb找不到如何显示线程号对应的线程名字,因此需要继续学习使用gdb进行多线程调试. 1.创建多线程工程 2.启动进程并查看运行进程对应的id 3.使用gdb连接进程, ...

最新文章

  1. SpringMVC上传文件解析request请求为空获取不到数据问题
  2. 前端开源项目周报0425
  3. python笔记本-如何用Python在笔记本电脑上分析100GB数据(下)
  4. 《Android的设计与实现:卷I》——第2章 框架基础JNI
  5. nice和taskset命令
  6. leetcode60. 第k个排列(回溯算法)
  7. Java—基于Fastjson的JSON串序列化和反序列化模板总结
  8. How to set a timeout with AFNetworking
  9. 0基础可以学Web前端吗?如何快速掌握前端开发技能?
  10. 根据控制点坐标对完成坐标转换
  11. java购物车 数据库_网上购物车数据库设计(转)
  12. 万能五笔输入法弹窗_万能五笔输入法广告怎么去掉
  13. 企业资源计划(ERP)原理与实践第一章
  14. 数据中心“容灾”和“备份”的区别
  15. 多个excel文件合并到一个文件中的多个sheet表中
  16. Android apk安装报错:应用未安装 软件包似乎已损坏
  17. 12306泄露数据分析(二)
  18. 【web-ctf】ctf_BUUCTF_web(2)
  19. 开源电子表格Luckysheet强势推出在线协作
  20. 我们的征途是星辰大海 蓝桥杯 Java组

热门文章

  1. Spark Dataset 入门详解
  2. scala数组入门到熟悉
  3. STM32单片机开发之让蜂鸣器发声
  4. Windows核心编程_PE文件格式详细介绍
  5. 【转】契约测试的必要性
  6. thinkphp5项目--企业单车网站(二)
  7. InstallShield Limited Edition Project 打包windows服务解析
  8. Jenkins配置ansible
  9. Open vSwitch实践——VLAN
  10. 内存降价-可以入手啦