GDB 多线程调试:只中止断点的线程,其余线程任然执行; 或只运行某些线程 其余线程中断

多线程调试之痛

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

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

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

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

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

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

 

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

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

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

  而后 attach 到正在运行的线程线程

  gdb thrname thrID调试

  

 

3. 而后能够用一下方式中断某个线程,其余线程保持运行; 或只运行某些线程 其余线程中断code

  3. 1 下断点到某个线程blog

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

相关文章
相关标签/搜索