gdb多線程調試

info b     會顯示所有線程的斷點,并不是隻顯示目前線程的。

info threads:顯示目前可調試的所有線程,每個線程會有一個GDB為其配置設定的ID。

  136 Thread 7886  0x0000003f5220e4ed in ?? ()

  135 Thread 22414  0x0000003f5220e054 in ?? () -------------- 第一列為ID。

* 3 Thread 7884  0x0000003f51ae14f3 in ?? ()--------- 星号表示這是“目前調試的線程”。

   2 Thread 5261  0x0000003f51aacb8d in ?? ()

   1 Thread 22216  0x0000003f51a328a5 in ?? ()

thread ID: 切換目前調試的線程為指定ID的線程。

如指令thread 2,表示切換到線程2。

thread apply all command: 讓所有被調試線程執行GDB指令command。

             如指令thread apply all b main,表示所有線程都設定斷點。

執行info b得到如:
145     breakpoint     keep y   0x0000003f51aacb8d
146     breakpoint     keep y   0x0000003f51aacb8d
147     breakpoint     keep y   0x0000003f51aacb8d
148     breakpoint     keep y   0x0000003f51aacb8d
149     breakpoint     keep y   0x0000003f51aacb8d

command thread all:在所有線程中相應的行上設定斷點

             如指令b main thread all。          

執行info b得到如:
154     breakpoint     keep y   <PENDING>         main thread all ---------- 為啥和thread apply all command指令執行結果不同?

thread apply ID1 ID2 command: 讓一個或者多個線程執行GDB指令command。

set scheduler-locking off|on|step:在使用step或者continue指令調試目前被調試線程的時候,其他線程也是同時執行的,怎麼隻讓被調試程式執行呢?通過這個指令就可以實作這個需求。

  • off 不鎖定任何線程,也就是所有線程都執行,這是預設值。
  • on 隻有目前被調試程式會執行。
  • step 在單步的時候,除了next過一個函數的情況(熟悉情況的人可能知道,這其實是一個設定斷點然後continue的行為)以外,隻有目前線程會執行。

GDBv7.0引入的non-stop模式,目前線程斷住,其他線程可以繼續執行。