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

相關文章
相關標籤/搜索