簡體   English   中英

gdb如何附加到多線程進程?

[英]How does gdb attach to multi-threaded process?

我將嘗試盡可能具體,但到目前為止,我已經措辭這個問題,以至於谷歌未能返回任何有用的結果(因此我的問題在這里)。

我將gdb附加到多線程c ++服務器進程。 我可以說的是,在嘗試進行通常的set-breakpoint-break-investigation時,發生了奇怪的事情。

首先 ,在等待斷點被擊中時(在“繼續”模式下),我突然回復了(gdb)提示符並顯示以下消息:

Continuing.
[Thread 0x54d5b940 (LWP 28503) exited]
[New Thread 0x54d5b940 (LWP 28726)]
Cannot get thread event message: debugger service failed

第二 ,同樣在等待斷點被擊中時,我突然告訴程序已收到SIGSEGV並且 - 回到(gdb)提示符 - backtrace告訴我在pthread_cancel()中發生了段錯誤。 請注意,正在調查的過程通常不會發生段錯誤。

我顯然缺乏關於gdb如何工作甚至開始猜測發生了什么的足夠信息。 我做錯了嗎? 我每次采取的步驟都是相同的:

  1. gdb附加
  2. 打破'MyFunction()'
  3. 繼續

思考? 謝謝。

我和類似的gdb問題爭了一段時間。 我的情況是產生了許多執行少量功能然后退出的線程。

看起來如果一個線程退出太快並且有很多這種情況發生,有時gdb無法跟上,當它失敗時,它會失敗,因為崩潰中的樣式:)我認為它試圖附加到已根據錯誤完成的線程信息。

我認為這是gdb 6.5到7.6中的一個問題,並且仍在發生。 沒試過舊版本。

我的建議是尋找這個用例或類似用例。 一旦我改變了我的設計,讓一個線程服務於一個請求隊列,gdb就可以完美地運行。

設計方面更健康的是已經創建了消化動作的線程而不是總是產生新線程。

仍然相同的代碼調試Visual Studio沒有問題,所以我不得不說,對於我來說,對gdb有點失望。

我使用Eclipse並查看GDB跟蹤(通常默認啟用)將為您提供更好的GDB失敗位置的提示。 控制台上的一個按鈕顯示GDB跟蹤。

暫無
暫無

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

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