2009-09-17 82 views
14

我想在創建線程的程序中爲gdb中的linux設置一個斷點。我想在線程創建時設置一個斷點,但不幸的是pthread_create是一個版本化的符號,我不能得到它的全名。pthread_create上的gdb斷點

如果鍵入:

catch thread_start 

我得到

Catch of thread_start not yet implemented 

如何捕捉線程的創建在gdb這種情況​​的最好方法?

回答

15

試試這個:

(gdb) b __pthread_create_2_1 

或建立自己的GDBthis patch應用。

或者嘗試最新的預發佈GDBhere,它應該讓你做"catch syscall clone"

2

OK,我要發佈兩個答案,因爲我不知道如果我理解你的問題。

首先:pthread_create在共享庫中,gdb知道如何處理它。 如果你只是說「break pthread_create」,它應該「只是工作」。

你不應該需要知道這一點,但它應該工作的方式是GDB 會發現一個符號「@ pthread_create的PLT」,這是一個存根通向 動態加載程序,最終將被替換通過跳轉到 適當的共享庫函數。我們將在那裏設置一個斷點, 和gdb將自動處理動態加載器,直到最終 到達(並停止)正確的共享庫函數。

現在不解決它適合你,在我的第二個答案的情況下...

15

好了,萬一我真的不理解你,或者我的第一個答案是沒有幫助的,這樣做:

(gdb) info func pthread_create 
All functions matching regular expression "pthread_create": 

Non-debugging symbols: 
0x080485e0 pthread_create 
0x080485e0 [email protected] 
0x00786590 __pthread_create_2_1 
0x00786590 [email protected]@GLIBC_2.1 
0x00786ee0 __pthread_create_2_0 
0x00786ee0 [email protected]_2.0 

現在選擇符號,你認爲是正確的,並在那裏設置一個斷點。 不要選擇那些在其中有「@」的人,而是其中一個具有數字 和下劃線的人,如1__pthread_create_2_1。