GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断...
多线程调试之痛
调试器(如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 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断...相关推荐
- GDB多线程调试常用命令
gdb调试命令 step和next的区别? 当前line有函数调用的时候,next会直接执行到下一句 ,step会进入函数. 查看内存 (gdb)p &a //打印变量地址 gdb)x 0xb ...
- GDB多线程调试(调试命令+调试演示)
多线程调试 (一)多线程调试命令 shell的命令: (1)查看当前运行的进程:ps aux | grep book (2)查看当前运行的轻量级进程:ps -aL | grep book (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 ...
- C语言:---gdb多线程调试
1)恢复程序运行和单步调试 当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来.也可以使用step或next命令单步跟踪程序. continue [ignore- ...
- Linux gdb多进程、多线程调试
目录 常用命令 堆栈相关命令 更为详细的断点调试 gdb多进程调试 gdb多线程调试 前言 gdb 是 linux 平台下进行程序调试的最常用的工具.简单的程序调试就是加断点,然后一步一步让程序运行, ...
- C++11多线程第三篇:线程传参详解,detach()大坑,成员函数做线程参数
文章目录 3.1 传递临时对象作为线程参数 3.1.1 要避免的陷阱(解释1) 3.1.2 要避免的陷阱(解释2) 3.1.3 总结 3.2 临时对象作为线程参数进一步详解 3.2.1 线程id概念 ...
- linux的gdb远程调试,嵌入式Linux的GDB远程调试如何实现呢?
有道启新嵌入式研究院--远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接.使用GDB标准远程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能.调试s ...
- winform判断线程有没有完成_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...
△ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...
- 项目使用线程池_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...
△ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...
- 多线程调试(gdb命令行和使用集成开发qtcreator查看线程状态)
我在qtcreator中用调用的gdb找不到如何显示线程号对应的线程名字,因此需要继续学习使用gdb进行多线程调试. 1.创建多线程工程 2.启动进程并查看运行进程对应的id 3.使用gdb连接进程, ...
最新文章
- SpringMVC上传文件解析request请求为空获取不到数据问题
- 前端开源项目周报0425
- python笔记本-如何用Python在笔记本电脑上分析100GB数据(下)
- 《Android的设计与实现:卷I》——第2章 框架基础JNI
- nice和taskset命令
- leetcode60. 第k个排列(回溯算法)
- Java—基于Fastjson的JSON串序列化和反序列化模板总结
- How to set a timeout with AFNetworking
- 0基础可以学Web前端吗?如何快速掌握前端开发技能?
- 根据控制点坐标对完成坐标转换
- java购物车 数据库_网上购物车数据库设计(转)
- 万能五笔输入法弹窗_万能五笔输入法广告怎么去掉
- 企业资源计划(ERP)原理与实践第一章
- 数据中心“容灾”和“备份”的区别
- 多个excel文件合并到一个文件中的多个sheet表中
- Android apk安装报错:应用未安装 软件包似乎已损坏
- 12306泄露数据分析(二)
- 【web-ctf】ctf_BUUCTF_web(2)
- 开源电子表格Luckysheet强势推出在线协作
- 我们的征途是星辰大海 蓝桥杯 Java组