gdb 調(diào)試多線程
Linux 2010-03-21 21:06:15 閱讀59 評(píng)論 字號(hào):大中小 訂閱
線程有自己的寄存器,運(yùn)行時(shí)堆棧或許還會(huì)有私有內(nèi)存。
gdb提供了以下供調(diào)試多線程的進(jìn)程的功能:
* 自動(dòng)通告新線程。
* \ "thread THREADNO\ ",一個(gè)用來(lái)在線程之間切換的命令。
* \ "info threads\ ",一個(gè)用來(lái)查詢現(xiàn)存線程的命令。
* \ "thread apply [THREADNO] [ALL] ARGS\ ",一個(gè)用來(lái)向線程提供命令的命令。
* 線程有關(guān)的斷點(diǎn)設(shè)置。
注意:這些特性不是在所有g(shù)db版本都能使用,歸根結(jié)底要看操作系統(tǒng)是否支持。
如果你的gdb不支持這些命令,會(huì)顯示出錯(cuò)信息:
(gdb) info threads
(gdb) thread 1
Thread ID 1 not known. Use the \ "info threads\ " command to
see the IDs of currently known threads.
gdb的線程級(jí)調(diào)試功能允許你觀察你程序運(yùn)行中所有的線程,但無(wú)論什么時(shí)候
gdb控制,總有一個(gè)“當(dāng)前”線程。調(diào)試命令對(duì)“當(dāng)前”進(jìn)程起作用。
一旦gdb發(fā)現(xiàn)了你程序中的一個(gè)新的線程,它會(huì)自動(dòng)顯示有關(guān)此線程的系統(tǒng)信
息。比如:
[New process 35 thread 27]
不過(guò)格式和操作系統(tǒng)有關(guān)。
為了調(diào)試的目的,gdb自己設(shè)置線程號(hào)。
`info threads\ "
顯示進(jìn)程中所有的線程的概要信息。gdb按順序顯示:
1.線程號(hào)(gdb設(shè)置)
2.目標(biāo)系統(tǒng)的線程標(biāo)識(shí)。
3.此線程的當(dāng)前堆棧。
一前面打\ "*\ "的線程表示是當(dāng)前線程。
例如:
(gdb) info threads
3 process 35 thread 27 0x34e5 in sigpause ()
2 process 35 thread 23 0x34e5 in sigpause ()
* 1 process 35 thread 13 main (argc=1, argv=0x7ffffff8)
at threadtest.c:68
`thread THREADNO\ "
把線程號(hào)為T(mén)HREADNO的線程設(shè)為當(dāng)前線程。命令行參數(shù)THREADNO是gdb內(nèi)定的
線程號(hào)。你可以用\ "info threads\ "命令來(lái)查看gdb內(nèi)設(shè)置的線程號(hào)。gdb顯示該線程
的系統(tǒng)定義的標(biāo)識(shí)號(hào)和線程對(duì)應(yīng)的堆棧。比如:
(gdb) thread 2
[Switching to process 35 thread 23]
0x34e5 in sigpause ()
\ "Switching后的內(nèi)容取決于你的操作系統(tǒng)對(duì)線程標(biāo)識(shí)的定義。
`thread apply [THREADNO] [ALL] ARGS\ "
此命令讓你對(duì)一個(gè)以上的線程發(fā)出相同的命令\ "ARGS\ ",[THREADNO]的含義同上。
如果你要向你進(jìn)程中的所有的線程發(fā)出命令使用[ALL]選項(xiàng)。
無(wú)論gdb何時(shí)中斷了你的程序(因?yàn)橐粋€(gè)斷點(diǎn)或是一個(gè)信號(hào)),它自動(dòng)選擇信號(hào)或
斷點(diǎn)發(fā)生的線程為當(dāng)前線程。gdb將用一個(gè)格式為\ "[Switching to SYSTAG]\ "的消息
來(lái)向你報(bào)告。