簡體   English   中英

gdb 在 linux 上調試多線程守護程序時如何中斷新線程

[英]gdb how to break in new thread when debugging multi threaded daemon program on linux

在問這個問題之前 - 我參考了gdb 多線程調試如何與 Linux 線程調度協調? 添加上下文

我有一個在 linux 上運行的 c++ 守護進程多線程程序。 它每次處理事務時都會啟動一個線程。 要調試的代碼是在新線程中調用的事務處理代碼的一部分。

這是我調試的過程。

我啟動gdb,關閉分頁,打開同步命令執行並設置不間斷模式。

然后我將 gdb 附加到正在運行的守護程序並在“所有”線程上設置斷點(見下圖)並發送一個新事務。

問題是 gdb 似乎清楚地告訴我斷點在線程 1 中。我沒有在新線程中的斷點處中斷。 當我發送一個新事務並退出而不在斷點處中斷時,會創建一個新線程。

請幫助我了解可能的原因是什么(我錯過了什么)

(gdb) set pagination off
(gdb) set target-async on
(gdb) set non-stop on
(gdb) attach 11067 # <daemon pid>  
(gdb) thread apply all b foo 
Thread 1 (Thread 0x7f94bb9f3740 (LWP 11067)): Breakpoint 1 at <filename> , 
line <line#>
(gdb) c
 Continuing.
 [New Thread 0x7f94b725e700 (LWP 15750)]
 [Thread 0x7f94b725e700 (LWP 15750) exited]

問題是 - 它沒有中斷函數“foo”(我的斷點)
我錯過了什么? 我如何指示 gdb 跟隨新的子線程。 “線程全部應用”不應該應用於“所有”線程嗎?

我沒有足夠的聲譽來發表評論,但是無論如何,由於大腦抽筋檢查您的gdb會話並沒有顯示您實際上在創建斷點。 從gdb中使用信息線程查看您期望看到的線程是否正在實際運行。 您可以從調試器開始而不是附加嗎? 通過開始然后附加,您可能會缺少有趣的部分。 嘗試在類似pthread_create()的對象上設置斷點,以查看是否正在創建線程。 有我的0.02美元

必須在這里做出響應...如果您可以訪問源,為了方便起見,我已在其他任何地方都未調用的偽函數上設置了斷點。 我認為可以檢查的其他事項是您是否使用符號進行了編譯。 它是靜態鏈接的嗎(靜態鏈接時,沒有符號就不能破壞libc的東西)。 有點用光了,也許其他人會有更好的主意?

我發現了一種可行的解決方法:-)

雖然我仍然無法讓gdb在我感興趣的斷點處中斷(發生在主線程產生的短暫線程中),但我找到了一種在該線程結束之前盡快顯式切換到該線程的方法。

問題是gdb需要您顯式切換到您感興趣的線程,以在斷點處停止。

因為我要調試的線程壽命很短,所以我不能足夠快地(在完成之前)切換到該線程。

除了我感興趣的功能的斷點外,我還在記錄器函數中放置了另一個斷點,該斷點經常在所有線程中發生,並一直持續(肯定很煩人),直到產生我感興趣的線程,然后在出現此情況時明確切換到該線程產生新線程並列出線程。

(gdb) info threads
(gdb) Thread <thread id>

我將其發布,因此如果您有類似的問題,可以嘗試此解決方法。

您的評論,更好的答案:-)歡迎更多回復

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM