#.net #multithreading #performance #garbage-collection #clr
#.net #многопоточность #Производительность #вывоз мусора #сброс
Вопрос:
У меня есть dll, которая выходит из строя с исключением нарушения доступа(0xC0000005), но каждый раз, когда я получаю аварийный дамп, это происходит во время GC.
Использование процессора составляет 81%, и несколько источников говорят, что это тот случай, когда выполняется GC. Затем в отчете DebugDiag отображается следующее предупреждение: следующие потоки ожидают завершения сборки мусора .net.Поток 274 запустил сборку мусора.Поток сборщика мусора не начнет выполнять свою работу до тех пор, пока не завершатся выполнение потоков, у которых отключен упреждающий сборщик мусора. В следующих потоках отключена упреждающая GC 274.
Также в DebugDiag есть это предупреждение для потока, который выдает нарушение доступа: Обнаружена возможная блокировка или утечка критического раздела в lt;адрес_хереgt;lt;адрес_хереgt; Я поискал здесь несколько похожих потоков, но пока не повезло. У кого-нибудь была проблема или есть идеи, как ее расследовать?
Мне интересно, вызвана ли проблема с нарушением доступа в моем коде c в результате зависания GC.
This is the stack trace for the thread that’s triggering GC: clr!StackFrameIterator::NextRaw 4 clr!GCToEEInterface::GcScanRoots 4e3 clr!WKS::gc_heap::mark_phase 197 clr!gc_heap::gc1 a3 clr!WKS::gc_heap::garbage_collect 54c clr!WKS::GCHeap::GarbageCollectGeneration 10d clr!WKS::gc_heap::trigger_gc_for_alloc 2d clr!JIT_New 4d6 [my user code here] This is the thread that’s causing the Access Violation error: ntdll!NtWaitForMultipleObjects 14 KERNELBASE!WaitForMultipleObjectsEx ef KERNELNASE!WaitForMultipleObjects e kernel32!WerpReportFaultInternal 4b0 kernel32!WerpReportFault 73 KERNELBASE!UnhandledExceptionFilter 23b ntdll!RtlUserThreadStart$filt$0 38 ntdll!_C_specific_handler 96 ntdll!RtlpExecuteHandlerForException d ntdll!RtlDispatchException 373
ntdll!KiUserExceptionDispatch 3a This is the stack trace for the GC thread according to DebugDiag: ntdll!NtWaitForSingleObject 14 KERNELBASE!WaitForSingleObjectEx 8f clr!CLREventWaitHelper2 3c clr!CLREventWaitHelper 1f clr!CLREventBase::WaitEx 7c clr!WKS::gc_heap::bgc_thread_function 9f clr!Thread::intermediateThreadProc 86 kernel32!BaseThreadInitThunk 14 ntdll!RtlUserThreadStart 21 And this is the finalizer thread: ntdll!NtWaitForSingleObject 14 KERNELBASE!WaitForSingleObjectEx 8f clr!CLREventWaitHelper2 3c clr!CLREventWaitHelper 1f clr!CLREventBase::WaitEx 7c clr!FinalizerThread::WaitForFinalizerEvent 44 clr!FinalizerThread::FinalizerThreadWorker 54 clr!ManagedThreadBase_DispatchInner 39 clr!ManagedThreadBase_DispatchMiddle 6c clr!ManagedThreadBaseDispatchOuter 75 clr!FinalizerThread::FinalizerThreadStart 10a clr!Thread::intermediateThreadProc 86 kernel32!BaseThreadInitThunk 14 ntdll!RtlUserThreadStart 21 Also a lot of threads are waiting for GC to finish and they have this in their call stack: ntdll!NtWaitForSingleObject 14 KERNELBASE!WaitForSingleObjectEx 8f clr!CLREventWaitHelper2 3c clr!CLREventWaitHelper 1f clr!CLREventBase::WaitEx 7c clr!WKS::GCHeap::WaitUntilGCComplete 2b clr!Thread::RareDisablePreemptiveGC 180```
Комментарии:
1. Что такое трассировка стека потока
247
? И какова трассировка стека потока, запускающего GC?2. Привет, Чарли Фейс, спасибо, что ответил. Я добавил некоторые трассировки стека, которые могут иметь отношение к делу. Любые советы, которые у вас могут возникнуть при расследовании этого дела, будут высоко оценены.
3. Вы выполняете какой-либо
unsafe
код или P/Invoke? Если да, пожалуйста, покажите. Какая из трассировок стека выше относится к потоку 247?4. Здравствуйте, спасибо, что перезвонили мне. Я использую C /CLI для доступа к C , и первый стек относится к потоку 274. Я добавил другие с информацией, потому что подумал, что это может помочь.
5. Мне интересно, что-то не так с потоком финализатора.