GDB 多線程調試
線程有自己的寄存器,運行時堆棧或許還會有私有內存。
gdb提供了以下供調試多線程的進程的功能:
* 自動通告新線程。
* \ "thread THREADNO\ ",一個用來在線程之間切換的命令。
* \ "info threads\ ",一個用來查詢現存線程的命令。
* \ "thread apply [THREADNO] [ALL] ARGS\ ",一個用來向線程提供命令的命令。
* 線程有關的斷點設置。
注意:這些特性不是在所有gdb版本都能使用,歸根結底要看操作系統是否支持。
如果你的gdb不支持這些命令,會顯示出錯信息:
(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的線程級調試功能允許你觀察你程序運行中所有的線程,但無論什么時候
gdb控制,總有一個“當前”線程。調試命令對“當前”進程起作用。
一旦gdb發現了你程序中的一個新的線程,它會自動顯示有關此線程的系統信
息。比如:
[New process 35 thread 27]
不過格式和操作系統有關。
為了調試的目的,gdb自己設置線程號。
`info threads\ "
顯示進程中所有的線程的概要信息。gdb按順序顯示:
1.線程號(gdb設置)
2.目標系統的線程標識。
3.此線程的當前堆棧。
一前面打\ "*\ "的線程表示是當前線程。
例如:
(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\ "
把線程號為THREADNO的線程設為當前線程。命令行參數THREADNO是gdb內定的
線程號。你可以用\ "info threads\ "命令來查看gdb內設置的線程號。gdb顯示該線程
的系統定義的標識號和線程對應的堆棧。比如:
(gdb) thread 2
[Switching to process 35 thread 23]
0x34e5 in sigpause ()
\ "Switching后的內容取決于你的操作系統對線程標識的定義。
`thread apply [THREADNO] [ALL] ARGS\ "
此命令讓你對一個以上的線程發出相同的命令\ "ARGS\ ",[THREADNO]的含義同上。
如果你要向你進程中的所有的線程發出命令使用[ALL]選項。
無論gdb何時中斷了你的程序(因為一個斷點或是一個信號),它自動選擇信號或
斷點發生的線程為當前線程。gdb將用一個格式為\ "[Switching to SYSTAG]\ "的消息
來向你報告。
對于多線程程序,你可以定義你的斷點是否在所有的線程上,或是在某個特定的線程。GDB很容易幫你完成這一工作。
break <linespec> thread <threadno>
break <linespec> thread <threadno> if ...
linespec指定了斷點設置在的源程序的行號。threadno指定了線程的ID,注意,這個ID是GDB分配的,你可以通過“info threads”命令來查看正在運行程序中的線程信息。如果你不指定thread <threadno>則表示你的斷點設在所有線程上面。你還可以為某線程指定斷點條件。如:
(gdb) break frik.c:13 thread 28 if bartab > lim
當你的程序被GDB停住時,所有的運行線程都會被停住。這方便你你查看運行程序的總體情況。而在你恢復程序運行時,所有的線程也會被恢復運行。那怕是主進程在被單步調試時。