我正在調查客戶端工作站上出現的問題,其中一個相當大的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
。
的siifslsp是與卸載應用程序相關聯的一個Winsock LSP。刪除WinSock LSP解決了問題。 – Iain 2013-03-14 15:00:42
@Iain很高興你解決了這個問題。我的答案是否幫助你,我不確定什麼是WinSock LSP,以及你是如何發現它與卸載的應用程序相關聯的。聽起來很深:) – 2013-03-14 15:15:46
這是一個很長的故事,但你的回答激勵我深入探究非託管代碼。從我的回答中的更新2開始,我使用命令'lmv m siifslsp'來識別siifslsp DLL,並且一些Google使用告訴我'GetLspGuid'方法是您在WinSock LSP上找到的東西。我得到了DLL並在記事本中打開它來搜索任何可能暗示它是源的字符串。我發現供應商並最終追蹤了它所屬的軟件,用戶認爲該軟件是他最近從他的機器上移除的,因爲這是他的問題。案件結案。 – Iain 2013-03-14 16:06:55