我想在創建線程的程序中爲gdb中的linux設置一個斷點。我想在線程創建時設置一個斷點,但不幸的是pthread_create
是一個版本化的符號,我不能得到它的全名。pthread_create上的gdb斷點
如果鍵入:
catch thread_start
我得到
Catch of thread_start not yet implemented
如何捕捉線程的創建在gdb這種情況的最好方法?
我想在創建線程的程序中爲gdb中的linux設置一個斷點。我想在線程創建時設置一個斷點,但不幸的是pthread_create
是一個版本化的符號,我不能得到它的全名。pthread_create上的gdb斷點
如果鍵入:
catch thread_start
我得到
Catch of thread_start not yet implemented
如何捕捉線程的創建在gdb這種情況的最好方法?
試試這個:
(gdb) b __pthread_create_2_1
或建立自己的GDB
與this patch應用。
或者嘗試最新的預發佈GDB
here,它應該讓你做"catch syscall clone"
OK,我要發佈兩個答案,因爲我不知道如果我理解你的問題。
首先:pthread_create在共享庫中,gdb知道如何處理它。 如果你只是說「break pthread_create」,它應該「只是工作」。
你不應該需要知道這一點,但它應該工作的方式是GDB 會發現一個符號「@ pthread_create的PLT」,這是一個存根通向 動態加載程序,最終將被替換通過跳轉到 適當的共享庫函數。我們將在那裏設置一個斷點, 和gdb將自動處理動態加載器,直到最終 到達(並停止)正確的共享庫函數。
現在不解決它適合你,在我的第二個答案的情況下...
好了,萬一我真的不理解你,或者我的第一個答案是沒有幫助的,這樣做:
(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。