gdb對(duì)于多線程程序的調(diào)試有如下的支持:
線程產(chǎn)生通知:在產(chǎn)生新的線程時(shí), gdb會(huì)給出提示信息
(gdb) r
Starting program: /root/thread
[New Thread 1073951360 (LWP 12900)]
[New Thread 1082342592 (LWP 12907)]---以下三個(gè)為新產(chǎn)生的線程
[New Thread 1090731072 (LWP 12908)]
[New Thread 1099119552 (LWP 12909)]
查看線程:使用info threads可以查看運(yùn)行的線程。
(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)
注意,行首的藍(lán)色文字為gdb分配的線程號(hào),對(duì)線程進(jìn)行切換時(shí),使用該該號(hào)碼,而不是上文標(biāo)出的綠色數(shù)字。
另外,行首的紅色星號(hào)標(biāo)識(shí)了當(dāng)前活動(dòng)的線程
切換線程:使用 thread THREADNUMBER 進(jìn)行切換,THREADNUMBER 為上文提到的線程號(hào)。下例顯示將活動(dòng)線程從 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)
以上即為使用gdb提供的對(duì)多線程進(jìn)行調(diào)試的一些基本命令。另外,gdb也提供對(duì)線程的斷點(diǎn)設(shè)置以及對(duì)指定或所有線程發(fā)布命令的命令。
初次接觸gdb下多線程的調(diào)試,往往會(huì)忽視gdb中活動(dòng)線程的概念。一般來(lái)講,在使用gdb調(diào)試的時(shí)候,只有一個(gè)線程為活動(dòng)線程,如果希望得到其他的線程的輸出結(jié)果,必須使用thread命令切換至指定的線程,才能對(duì)該線程進(jìn)行調(diào)試或觀察輸出結(jié)果。