クライアント ワークステーションで見られる問題を調査しています。この問題では、かなり大きな WinForms .NET 3.5 アプリケーションが、あらゆる種類のネットワーク操作を実行できなくなり、メイン スレッドで実行されているネットワーク操作が原因で最終的にフリーズします。
ネットワーク操作とは、新しいネットワーク接続を必要とするものすべてを意味します。アプリケーションは、複数の Oracle データベースと SOAP Web サービスに接続します。
アプリケーションのメモリ ダンプを調べると、さまざまなスレッドでアンマネージ コードへのさまざまなブロックされた呼び出しが示されます。
DNS ルックアップが停止しました ( System.Net.UnsafeNclNativeMethods+SafeNetHandlesXPOrLater.getaddrinfo
)
開いているソケットが動かない ( System.Net.UnsafeNclNativeMethods+OSSOCK.WSAConnect
)
閉じる ソケットが詰まっている ( System.Net.UnsafeNclNativeMethods+SafeNetHandles.closesocket
)
Open 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
付いたスレッドは表示されません。OSID
5f24