2011-03-14 35 views
3

我有一個運行在.Net框架4上的應用程序,我的應用程序運行託管和非託管代碼。在非託管代碼中,使用UDP套接字。當應用程序從Visual Studio運行時,一切正常,但當它自己運行時,它通常會凍結。我看到了Windows XP SP3和Windows 7 SP1上的行爲。當我將調試器附加到應用程序並暫停時,我可以看到很多很多線程都停留在ntdll.dll中的相同內存地址處。反彙編時,執行的netdll.dll命令是「ret」。如何解決ntdll.dll中的凍結(或死鎖)?

這是否爲任何人敲響了鐘聲?

似乎有以前過類似的問題,比如這裏報告,並將其與UDP: http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/1b54b2f2-6e7c-405b-bdda-62197ac8a287 沒有答案都曾經給。

我還發現一箇舊的修補程序的一個類似的問題,但根據微軟只適用於Windows NT 4

任何幫助,將不勝感激。

+0

阻塞或非阻塞模式?以前的錯誤代碼? – 2011-03-14 15:07:05

回答

3

這不是導致死鎖的操作系統。是的,您的堆棧跟蹤會在ntdll.dll中的KiFastSystemCallRet()上顯示它阻塞。在SYSENTER之後堆棧跟蹤指向RET指令。但它只是在做你要求它做的事情。

使用Debug + Windows + Threads窗口來查看你的線程正在做什麼。傳統的死鎖場景是其中一個線程已經獲取了同步對象並被阻塞。另一個線程試圖獲取的同步對象。這是最常見的線程頭痛之一。

+1

我同意漢斯 - 它在調試器中運行良好可能會表明某些任務的序列化方式不同(例如,通過執行調試輸出)以避免會造成死鎖。 – stephbu 2011-03-14 15:56:31

+0

感謝您的幫助! – Ssebu 2011-03-14 17:31:59

+1

我遇到的問題是當我查看堆棧跟蹤時,我看到的所有內容都是Microsoft DLL中的調用(使用root和ntdll.dll中的提示),這顯然很難找出它來自哪裏我的代碼。另外,當附加到正在運行的進程時,我必須使用Native選項附加,因爲調用堆棧不在託管代碼中。 – Ssebu 2011-03-14 17:33:43

相關問題