Как устранить неполадки заблокированного потока финализатора, ожидающего освобождения COM-объекта? - PullRequest
0 голосов
/ 27 февраля 2019

У меня ситуация утечки памяти в .NET (приложение Winforms), которая, я убежден, связана с заблокированным потоком финализатора, ожидающим освобождения COM-объекта.

Учитывая, что я могу произвести полный дамп памятиКакие будут шаги для устранения этой ситуации?Как получить доступ к потоку или ресурсу блокировщика?

Ниже приведен дамп стека потока финализатора:

   7  Id: 3848.1bdc Suspend: 0 Teb: 00000000`00735000 Unfrozen
 # Child-SP          RetAddr           Call Site
00 00000000`1c19de38 00007fff`6c847e6f ntdll!NtWaitForMultipleObjects+0x14
01 00000000`1c19de40 00007fff`6eba820f KERNELBASE!WaitForMultipleObjectsEx+0xef
02 00000000`1c19e140 00007fff`6eba7f9a combase!MTAThreadWaitForCall+0xdf [d:\rs1\onecore\com\combase\dcomrem\channelb.cxx @ 7330] 
03 00000000`1c19e1b0 00007fff`6eb438e8 combase!MTAThreadDispatchCrossApartmentCall+0xca [d:\rs1\onecore\com\combase\dcomrem\chancont.cxx @ 227] 
04 (Inline Function) --------`-------- combase!CSyncClientCall::SwitchAptAndDispatchCall+0x3b5 [d:\rs1\onecore\com\combase\dcomrem\channelb.cxx @ 6050] 
05 00000000`1c19e200 00007fff`6eb3fc37 combase!CSyncClientCall::SendReceive2+0x488 [d:\rs1\onecore\com\combase\dcomrem\channelb.cxx @ 5764] 
06 (Inline Function) --------`-------- combase!SyncClientCallRetryContext::SendReceiveWithRetry+0x2d [d:\rs1\onecore\com\combase\dcomrem\callctrl.cxx @ 1733] 
07 (Inline Function) --------`-------- combase!CSyncClientCall::SendReceiveInRetryContext+0x2d [d:\rs1\onecore\com\combase\dcomrem\callctrl.cxx @ 632] 
08 00000000`1c19e3f0 00007fff`6eb42c8d combase!DefaultSendReceive+0x77 [d:\rs1\onecore\com\combase\dcomrem\callctrl.cxx @ 590] 
09 00000000`1c19e460 00007fff`6eaf455c combase!CSyncClientCall::SendReceive+0x51d [d:\rs1\onecore\com\combase\dcomrem\ctxchnl.cxx @ 767] 
0a (Inline Function) --------`-------- combase!CClientChannel::SendReceive+0x8f [d:\rs1\onecore\com\combase\dcomrem\ctxchnl.cxx @ 702] 
0b 00000000`1c19e670 00007fff`6cfc7a8d combase!NdrExtpProxySendReceive+0xec [d:\rs1\onecore\com\combase\ndr\ndrole\proxy.cxx @ 1965] 
0c 00000000`1c19e6e0 00007fff`6eaf40b4 rpcrt4!NdrpClientCall3+0x46d
0d 00000000`1c19eaf0 00007fff`6ebfcbb2 combase!ObjectStublessClient+0x144 [d:\rs1\onecore\com\combase\ndr\ndrole\amd64\stblsclt.cxx @ 371] 
0e 00000000`1c19ee80 00007fff`6eb5fd1d combase!ObjectStubless+0x42 [d:\rs1\onecore\com\combase\ndr\ndrole\amd64\stubless.asm @ 176] 
0f 00000000`1c19eed0 00007fff`6eb5fedd combase!CObjectContext::InternalContextCallback+0x20d [d:\rs1\onecore\com\combase\dcomrem\context.cxx @ 4401] 
10 00000000`1c19eff0 00007fff`611fe037 combase!CObjectContext::ContextCallback+0xfd [d:\rs1\onecore\com\combase\dcomrem\context.cxx @ 4303] 
11 00000000`1c19f0a0 00007fff`61201cf6 clr!CtxEntry::EnterContext+0x287
12 00000000`1c19f280 00007fff`61203f27 clr!RCW::EnterContext+0x43
13 00000000`1c19f2d0 00007fff`610ffa80 clr!RCWCleanupList::ReleaseRCWListInCorrectCtx+0xd5
14 00000000`1c19f300 00007fff`60ebed7c clr!RCWCleanupList::CleanupAllWrappers+0x240cfc
15 00000000`1c19f360 00007fff`60ebf71e clr!SyncBlockCache::CleanupSyncBlocks+0xcf
16 00000000`1c19f3d0 00007fff`60ebf381 clr!Thread::DoExtraWorkForFinalizer+0x200
17 00000000`1c19f460 00007fff`60d27d01 clr!FinalizerThread::FinalizerThreadWorker+0x91
18 00000000`1c19f4a0 00007fff`60d27c70 clr!ManagedThreadBase_DispatchInner+0x39
19 00000000`1c19f4e0 00007fff`60d27bad clr!ManagedThreadBase_DispatchMiddle+0x6c
1a 00000000`1c19f5e0 00007fff`60db785a clr!ManagedThreadBase_DispatchOuter+0x75
1b 00000000`1c19f670 00007fff`60dd5abf clr!FinalizerThread::FinalizerThreadStart+0x126
1c 00000000`1c19f710 00007fff`4e6660fc clr!Thread::intermediateThreadProc+0x86

Пример дампа потока, ожидающего финализатор:

  19  Id: 3848.4a84 Suspend: 0 Teb: 00000000`00698000 Unfrozen
 # Child-SP          RetAddr           Call Site
00 00000000`247bd958 00007fff`6c847e6f ntdll!NtWaitForMultipleObjects+0x14
01 00000000`247bd960 00007fff`6f39e25b KERNELBASE!WaitForMultipleObjectsEx+0xef
02 00000000`247bdc60 00007fff`4e670bf5 user32!MsgWaitForMultipleObjectsEx+0x15b
03 00000000`247bdd40 00000000`00000002 cnetlib64+0x30bf5
04 00000000`247bdd48 00000000`04a4dc34 0x2
05 00000000`247bdd50 00000000`00000001 0x4a4dc34
06 00000000`247bdd58 00007fff`6eb41885 0x1
07 00000000`247bdd60 00007fff`6eb4114d combase!CCliModalLoop::PeekRPCAndDDEMessage+0x49 [d:\rs1\onecore\com\combase\dcomrem\callctrl.cxx @ 2786] 
08 00000000`247bddd0 00007fff`6ebb5bbf combase!CCliModalLoop::BlockFn+0x12d [d:\rs1\onecore\com\combase\dcomrem\callctrl.cxx @ 2344] 
09 00000000`247bde20 00007fff`6eb33413 combase!ClassicSTAThreadWaitForHandles+0x9f [d:\rs1\onecore\com\combase\dcomrem\classicsta.cpp @ 53] 
0a 00000000`247bdf30 00007fff`60d9f35a combase!CoWaitForMultipleHandles+0xb3 [d:\rs1\onecore\com\combase\dcomrem\sync.cxx @ 123] 
0b 00000000`247bdf70 00007fff`60d9f2c4 clr!MsgWaitHelper+0x8e
0c 00000000`247bdfe0 00007fff`60d4cfed clr!Thread::DoAppropriateWaitWorker+0x2cd
0d 00000000`247be0e0 00007fff`60d4e0c0 clr!Thread::DoAppropriateWait+0x7d
0e 00000000`247be160 00007fff`60dcf070 clr!CLREventBase::WaitEx+0xc4
0f 00000000`247be1f0 00007fff`610d6357 clr!FinalizerThread::FinalizerThreadWait+0xd8
10 00000000`247be260 00007fff`611b302c clr!ReleaseRCWsInCaches+0x1eab57
11 00000000`247be550 00007fff`6112fdea clr!ReleaseRCWsInCachesNoThrow+0x3d
12 00000000`247be5e0 00007fff`60ee17ba clr!Thread::CleanupCOMState+0x2f
13 00000000`247be630 00007fff`60ee1745 clr!Thread::OnThreadTerminate+0x68
14 00000000`247be700 00007fff`60dd1651 clr!DestroyThread+0xd2
15 00000000`247be740 00007fff`60dd5abf clr!ThreadNative::KickOffThread+0x24b1
16 00000000`247be810 00007fff`4e6660fc clr!Thread::intermediateThreadProc+0x86
17 00000000`247bf7d0 00000000`00000000 cnetlib64+0x260fc

Так же, как дополнительная информация, я подозреваю, что эта тема может быть блокировщиком?Связанный код читает поток ввода с консоли, но он оборачивается в свой собственный поток (через длительное выполнение Задачи).К сожалению, учитывая, что это происходит в производственной среде, я немного связан с экспериментами (изменение этого подхода займет некоторое время, и я не хотел бы пробовать что-то в неправильном направлении) .

  16  Id: 3848.283c Suspend: 0 Teb: 00000000`0067a000 Unfrozen
 # Child-SP          RetAddr           Call Site
00 00000000`236fda18 00007fff`6c824154 ntdll!NtReadFile+0x14
01 00000000`236fda20 00007fff`5dedc0c6 KERNELBASE!ReadFile+0x74
02 00000000`236fdaa0 00007fff`5e70a46a mscorlib_ni!DomainNeutralILStubClass.IL_STUB_PInvoke(System.Runtime.CompilerServices.StackCrawlMarkHandle, System.Runtime.CompilerServices.ObjectHandleOnStack)$##6000000+0x246
03 00000000`236fdb80 00007fff`5e70a374 mscorlib_ni!System.IO.__ConsoleStream.ReadFileNative(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte[], Int32, Int32, Boolean, Boolean, Int32 ByRef)$##6001678+0xba
04 00000000`236fdc10 00007fff`5de78914 mscorlib_ni!System.IO.__ConsoleStream.Read(Byte[], Int32, Int32)$##6001675+0x64
05 00000000`236fdc70 00007fff`5de78eae mscorlib_ni!System.IO.StreamReader.ReadBuffer()$##60019B6+0x44
06 00000000`236fdcc0 00007fff`5e8bff5c mscorlib_ni!System.IO.StreamReader.ReadLine()$##60019B8+0x15e
07 00000000`236fdd20 00007fff`44579183 mscorlib_ni!System.IO.TextReader+SyncTextReader.ReadLine()$##60069AC+0x3c
08 00000000`236fdd80 00007fff`5de9dfdc Prosyst_Base_ni+0xa89183
09 00000000`236fde40 00007fff`5de9d116 mscorlib_ni!System.Threading.Tasks.Task`1[System.__Canon].InnerInvoke()$##6003E69+0x4c
0a 00000000`236fde90 00007fff`5de53a63 mscorlib_ni!System.Threading.Tasks.Task.Execute()$##6003F89+0x46
0b 00000000`236fded0 00007fff`5de538f4 mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)$##6003AD3+0x163
0c 00000000`236fdfa0 00007fff`5de9d3b5 mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)$##6003AD2+0x14
0d 00000000`236fdfd0 00007fff`5de9cae3 mscorlib_ni!System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)$##6003F96+0x215
0e 00000000`236fe080 00007fff`5de53a63 mscorlib_ni!System.Threading.Tasks.Task.ExecuteEntry(Boolean)$##6003F95+0x73
0f 00000000`236fe0c0 00007fff`5de538f4 mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)$##6003AD3+0x163
10 00000000`236fe190 00007fff`5de538c2 mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)$##6003AD2+0x14
11 00000000`236fe1c0 00007fff`5e801afc mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)$##6003AD1+0x52
12 00000000`236fe210 00007fff`60d26d93 mscorlib_ni!System.Threading.ThreadHelper.ThreadStart(System.Object)$##6003BE2+0x5c
13 00000000`236fe250 00007fff`60d26c48 clr!CallDescrWorkerInternal+0x83
14 00000000`236fe290 00007fff`60d2753d clr!CallDescrWorkerWithHandler+0x4e
15 00000000`236fe2d0 00007fff`60dcf399 clr!MethodDescCallSite::CallTargetWorker+0xf8
16 00000000`236fe3d0 00007fff`60d27d01 clr!ThreadNative::KickOffThread_Worker+0x109
17 00000000`236fe630 00007fff`60d27c70 clr!ManagedThreadBase_DispatchInner+0x39
18 00000000`236fe670 00007fff`60d27bad clr!ManagedThreadBase_DispatchMiddle+0x6c
19 00000000`236fe770 00007fff`60d2ac34 clr!ManagedThreadBase_DispatchOuter+0x75
1a 00000000`236fe800 00007fff`60d2ad2e clr!ManagedThreadBase_DispatchInCorrectAD+0x15
1b 00000000`236fe830 00007fff`60d2ac83 clr!Thread::DoADCallBack+0x278
1c 00000000`236fe9f0 00007fff`60d27c70 clr!ManagedThreadBase_DispatchInner+0x2fc3
1d 00000000`236fea30 00007fff`60d27bad clr!ManagedThreadBase_DispatchMiddle+0x6c
1e 00000000`236feb30 00007fff`60d27d3f clr!ManagedThreadBase_DispatchOuter+0x75
1f 00000000`236febc0 00007fff`60dcf27b clr!ManagedThreadBase_FullTransitionWithAD+0x2f
20 00000000`236fec20 00007fff`60dd5abf clr!ThreadNative::KickOffThread+0xdb
21 00000000`236fecf0 00007fff`4e6660fc clr!Thread::intermediateThreadProc+0x86
22 00000000`236ffa30 00000000`00000000 cnetlib64+0x260fc
...