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 命令查看)

时间: 2024-09-30 02:34:53

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

gdb 多线程调试

gdb 多线程调试 http://hi.baidu.com/hcq11/blog/item/9f5bfc6e696209d680cb4a25.html http://hi.baidu.com/litto/blog/item/759389dd198111375882dd1e.html http://blogold.chinaunix.net/u3/94700/showart_2389432.html   <推荐阅读> 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调

gdb多线程调试

死锁:一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被 其他线程占用并堵塞了的资源.例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象. gdb调试死锁的方法: gdb attach pid thread apply all bt 找到_lll_lock_wait 锁等待的地方. 然后查找该锁被哪个线程锁住了. 例如: 查看哪个线程拥有互斥体 (gdb) print AccountA_mutex $1 = {__

GDB多线程调试分析

0x00: 在Linux系统上Gdb提供了一组多线程调试命令,如表所示: 多线程调试的主要任务是准确及时地捕捉被调试程序线程状态的变化的事件,并且GDB针对根据捕捉到的事件做出相应的操作,其实最终的结果就是维护一根叫thread list的链表.上面的调试命令都是基于thread list链表来实现的,后面会有讲到. 0x01:Gdb在linux平台多线程调试实现主要依赖下面三个文件 thread.c:文件它的任务非常简单,就是多线程调试命令子集的实现,比如info threads.当用户在gd

[skill][gdb] gdb 多线程调试

中文快速入门: http://coolshell.cn/articles/3643.html 进阶: 多线程怎么调试: 分 all-stop 和 non-stop 两个模式. all-stop 模式下,一个断点.所以线程全部终止运行. 使用 set non-stop on命令可以进入non-stop模式.其他线程不会受到一个线程停止的影响. 例如:non-stop模式下设置了一个中断: 其他线程正常运行. (gdb) info thread Id Target Id Frame 5 Thread

gdbserver 移植与多线程调试

在嵌入式linux平台使用gdb调试进行远程调试需要安装gdbserver,gdbserver工作在目标板上,通过串口或者网线与主机上的gdb互联实现远程调试. Gdbserver需要根据不同的嵌入式平台来编译生成,首先到http://ftp.gnu.org/gnu/gdb/下载合适的版本.然后在本地进行编译.在Unbuntu下编译gdb需要安装ncurses 库,在redhat上通过yum install “Development tools” 安装依赖就可以了. 首先编译主机端gdb,编译过

GDB常用调试命令以及多进程多线程调试

转载自:http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令 1.list命令 list  linenum      显示程序第linenum行周围的程序 list  function      显示函数名为function的函数的源程序 list                      显示当前行后面的源程序 list -                    显示当前行前面的源程序 2.run(r) 运行命令. ru

Linux学习——Gdb基本调试方法&amp;&amp;多线程调试

1.Gdb的基本调试 示例代码 //e.c #include <stdio.h> void debug(char *str) { printf("debug info :%s\n",str ); } int main(int argc,char *argv[]){ int i,j; j=0; for(i=0;i<10;i++){ j+=5; printf("now a=%d\n", j); } } 1 2 3 4 5 6 7 8 9 10 11 1

多线程(四) 如何停止线程

在Thread类中提供了可以停止线程的方法(包括杀死和挂起): @Deprecated public final void stop(){} @Deprecated public final void suspend(){} stop 和 suspend 添加的有Deprecated注释,也即是该方法已经废弃使用.那么为什么会不建议使用这两种方法呢?还有没有其他停止线程的方法? 1.stop()会立即杀死线程,无法保证原子操作能够顺利完成,存在数据错误的风险.无论线程执行到哪里.是否加锁,sto

多线程---其他方法 停止线程、守护线程、join方法

第三方停止线程: 原来是stop(),因为该方法有些问题,所以被interrupt()方法取代,它的用途跟机制是 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到运行状态中来,这样就可以让操作标记来结束线程. Thread类提供了interrupt()方法. 守护线程: 线程对象.setDaemon():该方法表示,前台线程(主线程) 一结束,后台线程(后台运行线程)立即结束. Join方法: 等待该线程终止.就是说在主线程运行时候,读到了该线程的开始阶段,