2009-11-17 50 views
7

定期地,我們在生產環境中關閉Windows服務的過程中,我們無法複製。它可能會在幾個月後再次發生。從ProcessThread獲取到託管線程

我正在進行一些診斷以嘗試並幫助解決該問題,我正在研究的一件事是在我們啓動關閉應用程序後,將事件添加到系統線程池60秒。我們的應用程序應該在10秒內完全關閉。

在此事件中,我想將進程的剩餘運行線程追蹤到事件日誌。

我可以使用System.Diagnostics.Process.GetCurrentProcess.Threads獲取正在運行的線程。這些線程對象具有本機Win32線程ID等

我想知道是否有任何方式從這些線程ID回到他們代表當前進程中的任何託管線程。 我試圖這樣做的原因是因爲我們產生的線程池和其他線程會給出表示它們的目的的名稱,這將真正幫助將它們還原。

+0

有沒有人想出如何,3年後做到這一點? – 2012-10-14 04:47:57

+0

嗨布魯諾,這基本上是不可能的。 – Bigtoe 2012-10-31 13:26:08

+1

你是如何爲線程池中的線程分配名稱的?恕我直言,這是不可能的。 – 2016-06-25 08:43:14

回答

11

由於以下原因,這是不可能的。 Quote from MSDN

的操作系統的ThreadId具有到管理 線程沒有 固定關係,因爲非託管主機可以 控制 管理和非管理線程之間的關係。 具體而言,複雜的主機可以使用CLR主機API針對相同的 操作系統線程安排 多個託管線程,或在不同的 操作系統線程之間移動 託管線程。

因此,託管線程和操作系統線程之間沒有一對一映射。

所以,現在的問題是,如何獲得當前在當前進程中運行的所有託管線程的列表?不幸的是我不知道答案。

+0

感謝達林。我從網上閱讀中得出了自己的結論。希望在那裏有人可能已經知道了一些魔法來拋出這個可能已經做到的伎倆。我目前正在追蹤所有我能得到的非託管線程信息。在創建時我會查看所有託管線程的類似信息,我可以訪問該功能。希望我會得到他們之間的一些關聯。 – Bigtoe 2009-11-17 16:44:19

+1

「如何獲得當前在當前進程中運行的所有託管線程的列表」 - 可以使用調試器,例如, WinDbg + SOS('!threads') – 2016-06-25 08:45:46

+0

[一個類似的問題和答案,顯示如何列出託管線程並搜索其堆棧跟蹤](http://stackoverflow.com/a/35558240/717732) – quetzalcoatl 2016-06-25 21:20:01

0

看起來這不是可能的。
幸運的是,我們有我們自己的線程庫來封裝.NET庫,並且我能夠放入功能來保留我們可以用於這些診斷的活動線程列表。
這工作得很好,但當然有一點點的努力和測試,但希望我們能得到它的底部。