Mam od dawna działającą aplikację .NET 4.5, która ulega awarii losowo, pozostawiając komunikat wymieniony w tytule pytania w dzienniku zdarzeń . Problem jest odtwarzany na 3 różnych maszynach i 2 różnych systemach (2008 R2 i 2012). Aplikacja nie używa żadnych niebezpiecznych/niezarządzanych komponentów, jest czysto zarządzanym .NET, a jedyną niezarządzaną rzeczą jest sam CLR..NET 4.5: błąd wewnętrzny w środowisku wykonawczym .NET (80131506)/wyłączanie współbieżnego GC
Oto ślad stosu miejscu katastrofy, że mam pochodzących z wysypiska:
clr.dll!MethodTable::GetCanonicalMethodTable()
clr.dll!SVR::CFinalize::ScanForFinalization() - 0x1a31b bytes
clr.dll!SVR::gc_heap::mark_phase() + 0x328 bytes
clr.dll!SVR::gc_heap::gc1() + 0x95 bytes
clr.dll!SVR::gc_heap::garbage_collect() + 0x16e bytes
clr.dll!SVR::gc_heap::gc_thread_function() + 0x3e bytes
clr.dll!SVR::gc_heap::gc_thread_stub() + 0x77 bytes
kernel32.dll!BaseThreadInitThunk() + 0x1a bytes
ntdll.dll!RtlUserThreadStart() + 0x21 bytes
Kwestia ta bardzo przypomina ten, który został omówiony here, więc próbowałem rozwiązania zaproponowane w tym temacie, ale żaden z nich nie pomógł:
próbowałem instalacji this poprawkę, ale nie można zainstalować na żadnym z moich maszyn (KB2640103 nie stosuje się, czy jest zablokowany przez inny stanie na komputerze), które faktycznie ma sens, być ponieważ używam 4.5, a nie 4.0.
Próbowałem wyłączyć wyłączanie współbieżnego GC i/lub włączanie GC serwera. Teraz odpowiednia część mojego app.config wygląda następująco:
<?xml version="1.0"?> <configuration> <runtime> <gcConcurrent enabled="false"/> <gcServer enabled="true" /> </runtime> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup></configuration>
Chociaż dziwne jest to, że jeszcze znaleźć wiele wątków związanych z GC-w wysypisko procesowego. Poza jednym katastrofa ma miejsce w, istnieje 7 nici z poniższego śladu stosu:
ntdll.dll!NtWaitForSingleObject() + 0xa bytes
KERNELBASE.dll!WaitForSingleObjectEx() + 0x9a bytes
clr.dll!CLREventBase::WaitEx() + 0x13f bytes
clr.dll!CLREventBase::WaitEx() + 0xf7 bytes
clr.dll!CLREventBase::WaitEx() + 0x78 bytes
clr.dll!SVR::t_join::join() + 0xd8 bytes
clr.dll!SVR::gc_heap::scan_dependent_handles() + 0x65 bytes
clr.dll!SVR::gc_heap::mark_phase() + 0x347 bytes
clr.dll!SVR::gc_heap::gc1() + 0x95 bytes
clr.dll!SVR::gc_heap::garbage_collect() + 0x16e bytes
clr.dll!SVR::gc_heap::gc_thread_function() + 0x3e bytes
clr.dll!SVR::gc_heap::gc_thread_stub() + 0x77 bytes
kernel32.dll!BaseThreadInitThunk() + 0x1a bytes
ntdll.dll!RtlUserThreadStart() + 0x21 bytes
Który sprawia, że zastanawiam się, czy mogę jakoś zepsuć wyłączenie współbieżne GC (to co ja faktycznie wymienione config za).
Myślę, że podsumowuje to, co udało mi się znaleźć do tej pory. Naprawdę mógłbym skorzystać z pomocy, jak postępować w rozwiązywaniu tego problemu.
Nagłówek obiektu zarządzanego obiektu na stercie GC został uszkodzony, nie może już znaleźć tablicy metod danego typu. Zawsze najpierw szukasz niezarządzanego kodu, z którym współdziałasz, aby wyglądać Z jakiegoś powodu, majsterkowanie z konfiguracją gc nie rozwiązuje problemu –
Może problem w finalizatorze? Możesz spróbować ustawić punkty przerwania w finalizerach lub komentować je. – DSway
'scan_dependent_handles': zależne uchwyty zostały ostatnio dodane do CLR (4.0?) Może jest to prawdziwy błąd w CLR. – usr