Debugging with GDB
html
http://www.delorie.com/gnu/docs/gdb/gdb_25.html
web
GDB調試多線程程序總結
多線程
一直對GDB多線程調試接觸很少,最近由於工做有了一些接觸,簡單做點記錄吧。 先介紹一下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的行爲)之外,只有當前線程會執行。app
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)]spa
(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分配的線程號,對線程進行切換時,使用該該號碼,而不是上文標出的綠色數字。調試
另外,行首的紅色星號標識了當前活動的線程orm
(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)htm
以上即爲使用gdb提供的對多線程進行調試的一些基本命令。另外,gdb也提供對線程的斷點設置以及對指定或全部線程發佈命令的命令。
初次接觸gdb下多線程的調試,每每會忽視gdb中活動線程的概念。通常來說,在使用gdb調試的時候,只有一個線程爲活動線程,若是但願獲得其餘的線程的輸出結果,必須使用thread命令切換至指定的線程,才能對該線程進行調試或觀察輸出結果。