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爲其分配的ID,後面操作線程的時候會用到這個ID。 前面有*的是當前調試的線程。

thread ID 切換當前調試的線程爲指定ID的線程。

break thread_test.c:123 thread all 在所有線程中相應的行上設置斷點

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

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

set scheduler-locking off|on|step 估計是實際使用過多線程調試的人都可以發現,在使用step或者continue命令調試當前被調試線程的時候,其他線程也是同時執行的,怎麼只讓被調試程序執行呢?通過這個命令就可以實現這個需求。off 不鎖定任何線程,也就是所有線程都執行,這是默認值。 on 只有當前被調試程序會執行。 step 在單步的時候,除了next過一個函數的情況(熟悉情況的人可能知道,這其實是一個設置斷點然後continue的行爲)以外,只有當前線程會執行。

gdb對於多線程程序的調試有如下的支持:

  • 線程產生通知:在產生新的線程時, gdb會給出提示信息

(gdb) r
Starting program: /root/thread 
[New Thread 1073951360 (LWP 12900)] 
[New Thread 1082342592 (LWP 12907)]---以下三個爲新產生的線程
[New Thread 1090731072 (LWP 12908)]
[New Thread 1099119552 (LWP 12909)]

  • 查看線程:使用info threads可以查看運行的線程。

(gdb) info threads
  4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
  3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
  2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
* 1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21
(gdb)

注意,行首的藍色文字爲gdb分配的線程號,對線程進行切換時,使用該該號碼,而不是上文標出的綠色數字。

另外,行首的紅色星號標識了當前活動的線程

  • 切換線程:使用 thread THREADNUMBER 進行切換,THREADNUMBER 爲上文提到的線程號。下例顯示將活動線程從 1 切換至 4。

(gdb) info threads
   4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
   3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
   2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
* 1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21
(gdb) thread 4
[Switching to thread 4 (Thread 1099119552 (LWP 12940))]#0   0xffffe002 in ?? ()
(gdb) info threads
* 4 Thread 1099119552 (LWP 12940)   0xffffe002 in ?? ()
   3 Thread 1090731072 (LWP 12939)   0xffffe002 in ?? ()
   2 Thread 1082342592 (LWP 12938)   0xffffe002 in ?? ()
   1 Thread 1073951360 (LWP 12931)   main (argc=1, argv=0xbfffda04) at thread.c:21
(gdb)

後面就是直接在你的線程函數裏面設置斷點,然後continue到那個斷點,一般情況下多線程的時候,由於是同時運行的,最好設置 set scheduler-locking on

這樣的話,只調試當前線程 

發佈了10 篇原創文章 · 獲贊 21 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章