2012-04-05 45 views
1

我能夠打印在運行時捕獲到異常的線程的堆棧跟蹤。我還需要打印在同一個進程中運行的其他線程的跟蹤。我有興趣找到一種很好的方法,只要在一個線程中捕獲到異常,就立即凍結所有線程。當一個線程遇到異常時,是否可以凍結所有線程

現在,我所能做的就是查詢每個活動線程,然後對其執行SuspendThread()。但是,這將導致每個線程在捕獲到初始異常之後執行一次。有沒有辦法立即導致每個線程暫停?

謝謝。

+1

用崩潰報告殺死進程?您發送給另一個線程的任何信號都需要時間。我想真正的問題是爲了你的目的,什麼是瞬時的資格,以及如何在那裏得到一個快速的信號? – 2012-04-05 02:50:29

+2

我不認爲一般情況下,即使對於操作系統來說,「立即」也是不可能的......例如,在多核/多處理器機器上,當#1核心線程崩潰時,核心#2如何知道停止其線程?核心#1必須發送一個「可疑線程」消息到核心#2,屆時內核#2的線程已經執行了更多的指令。 – 2012-04-05 03:02:41

+0

根據應用程序的體系結構,您可能可以使用光纖而不是線程。 (當然,您不希望在發佈版本中這樣做,但調試可能是正確的。) – 2012-04-05 03:46:03

回答

2

您是否嘗試從被捕獲異常的工作線程使用PostMessage()到GUI線程?

簡要步驟的提議:
1)GUI線程產卵數的工作線程
2)工作線程PostMessage的()一次捕獲的異常
3)GUI線程接收消息
4)GUI線程請示剩餘工作線程暫停

注:定義自己的消息

通過這種方式,你仍然會看到已暫停你的工作線程前有延遲。

另一種方法是使用同步對象,如工作線程中的事件句柄。