我們在生產中有一個C#控制檯應用程序,它具有間歇性線程死鎖。我試圖通過將VS 2017連接到正在運行的進程來發現死鎖,但我找不到任何方法輕易找到死鎖的原因。似乎沒有任何窗口標識哪些線程擁有哪些鎖。 (我嘗試使用內存窗口,但根本不起作用)。有沒有一種簡單的方法來進行線程轉儲以查找線程死鎖的原因?
我也嘗試過使用轉儲文件,但發現它很難理解它顯示的內容。 (但是,這是之前我知道我正在尋找一個死鎖。)
我習慣於在Java中使用JStack,一個命令行實用程序運行反對運行Java應用程序,它打印一個線程轉儲,並識別死鎖,和在每個StackTrace中顯示線程已鎖定顯示器的點。
是否有一些等效的.NET工具?
,因爲它代表的問題是題外話的網站,因爲它是請求場外資源/工具。但是,如果您可以將代碼最小化爲[MCVE]併發布,我相信問題應該沒問題。通過這樣做,你也有可能找到它鎖定自己的原因。注意,log4net等日誌工具在配置正確時會打印線程標識,這可以幫助您在有足夠日誌記錄的情況下找到它所鎖定的原因。 – TheLethalCoder
在.NET中你有沒有完全相同的信息?每個線程的調用棧...(如果你不想/不能附加VS,有庫,GUI和CL應用程序來執行它) –
如果你附加到Visual Studio 2015的正在運行的進程,那麼你應該能夠'暫停'並打開一個名爲'Parallel Stacks'的東西(從主菜單中選擇Debug/Windows/Parallel Stacks) 我不知道在VS2017中可用,但我已經使用過這個功能幾次,這對我幫助很大。 – recineshto