2013-03-12 47 views
1

我正在調查客戶端工作站上出現的問題,其中一個相當大的WinForms .NET 3.5應用程序偶爾會停止執行任何類型的網絡操作,並且最終會由於主要執行的網絡操作而凍結線。.NET應用程序爲什麼會停止執行任何網絡I/O?

通過網絡操作,我的意思是任何需要新的網絡連接。該應用程序連接到多個Oracle數據庫和SOAP Web服務。

檢查該應用程序的存儲器轉儲示出了各種阻塞的呼叫到在不同的線程非託管代碼:

DNS查找卡住(System.Net.UnsafeNclNativeMethods+SafeNetHandlesXPOrLater.getaddrinfo

Open套接字卡住卡住(System.Net.UnsafeNclNativeMethods+OSSOCK.WSAConnect

關閉套接字( System.Net.UnsafeNclNativeMethods+SafeNetHandles.closesocket

打開ODBC卡(System.Data.Common.UnsafeNativeMethods.SQLDriverConnectW

上述所有看起來像這樣的非託管堆的頂部:

0a90df4c 77858cd8 ntdll!ZwWaitForSingleObject+0x15 
0a90df74 73c5716f ntdll!RtlIntegerToUnicodeString+0x20b 
0a90dfbc 76f45db1 siifslsp!WSPStartup+0x483f 

重新啓動應用程序後,恢復正常。這向我暗示了某種類型的資源泄漏,但是我怎樣才能追蹤到這一點?

我檢查打開的網絡連接的情況下,可以看到下面的罪狀:

  • System.Net.HttpWebRequest 5個實例
  • System.Net.Sockets.Socket 11實例
  • System.Data.Odbc.OdbcConnectionHandle 4個實例

這些不對我來說看起來異常高。

更新1 - !FinalizeQueue

輸出的!FinalizeQueue的輸出被截斷並不顯示任何異常情況給我。我已經限制它與任何IO相關。

0:024> !FinalizeQueue 
SyncBlocks to be cleaned up: 0 
MTA Interfaces to be released: 0 
STA Interfaces to be released: 0 
---------------------------------- 
generation 0 has 359 finalizable objects (41f35654->41f35bf0) 
generation 1 has 0 finalizable objects (41f35654->41f35654) 
generation 2 has 10697 finalizable objects (41f2af30->41f35654) 
Ready for finalization 0 objects (41f35bf0->41f35bf0) 
Statistics: 
     MT Count TotalSize Class Name 
6e612a38  1   20 System.Net.SafeLocalFree 
6ea7e550  1   24 System.Net.Sockets.TcpClient 
6a606c54  1   24 System.Data.Odbc.OdbcEnvironmentHandle 
6e60f7f4  2   40 System.Net.SafeFreeAddrInfo 
05da845c  2   40 System.Net.SafeCloseSocket+InnerSafeCloseSocket 
0642c010  2   56 System.Net.SafeCloseSocketAndEvent 
6e6106bc  4   96 System.Net.SafeRegistryHandle 
6e6105d0  4   112 System.Net.SafeCloseSocketAndEvent 
6a6069bc  4   112 System.Data.Odbc.OdbcConnectionHandle 
6a6060c8  4   256 System.Data.Odbc.OdbcConnection 
6e60f764  11   264 System.Net.SafeCloseSocket 
6e6115cc  7   336 System.Net.Sockets.NetworkStream 
66e60eeec  11   836 System.Net.Sockets.Socket 

Total 11056 objects 

更新2 - 使用!locks!critsec看看那裏的塊

!critsec輸出是:

0:002> !critsec 73c7147c 

CritSec siifslsp!GetLspGuid+1a0fc at 73c7147c 
WaiterWoken  No 
LockCount   8 
RecursionCount  1 
OwningThread  5f24 
EntryCount   0 
ContentionCount 8 
*** Locked 

不知道5f24指的是什麼。 !Threads的輸出沒有顯示任何線程,其的5f24

回答

1

我承認我沒有明確的答案,但這裏有一些建議。

首先,嘗試通過在WinDbg中使用!waitlist命令來解決線程阻塞的問題,如this blog post中所述。這可能會引發一些線索,這可以解釋爲什麼不同的線程被阻塞。

Here's another handy blog post它解釋瞭如何深入挖掘什麼阻塞線程。

好信息的另一個來源可能是Event Viewer,特別是the Windows Logs -> System部分。你可以在這裏掃描條目,並尋找任何ErrorWarnings,看看他們說什麼。可能有網絡相關的消息張貼在那裏,你永遠不知道。

我會不斷更新這個答案,因爲我發現了其他可能對您有用的信息。

+0

的siifslsp是與卸載應用程序相關聯的一個Winsock LSP。刪除WinSock LSP解決了問題。 – Iain 2013-03-14 15:00:42

+0

@Iain很高興你解決了這個問題。我的答案是否幫助你,我不確定什麼是WinSock LSP,以及你是如何發現它與卸載的應用程序相關聯的。聽起來很深:) – 2013-03-14 15:15:46

+0

這是一個很長的故事,但你的回答激勵我深入探究非託管代碼。從我的回答中的更新2開始,我使用命令'lmv m siifslsp'來識別siifslsp DLL,並且一些Google使用告訴我'GetLspGuid'方法是您在WinSock LSP上找到的東西。我得到了DLL並在記事本中打開它來搜索任何可能暗示它是源的字符串。我發現供應商並最終追蹤了它所屬的軟件,用戶認爲該軟件是他最近從他的機器上移除的,因爲這是他的問題。案件結案。 – Iain 2013-03-14 16:06:55

相關問題