У меня есть давно работающее приложение .NET 4.5, которое случайно падает, оставляя сообщение, указанное в заголовке вопроса в журнале событий. Проблема воспроизводится на трех разных машинах и в двух разных системах (2008 R2 и 2012). Приложение не использует какие-либо небезопасные/неуправляемые компоненты, это чистая управляемая .NET, при этом единственной неуправляемой вещью является сама среда CLR.
Здесь трассировка стека сайта сбоя, который я извлек из дампа:
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
Этот вопрос очень похож на тот, который обсуждался здесь , поэтому я пробовал решения, предложенные в этой теме, но ни один из них не помог:
-
Я попытался установить это исправление, но оно не будет установлено ни на одной из моих машин (KB2640103 не применяется, или заблокирован другим условием на вашем компьютере), что на самом деле имеет смысл, потому что я использую 4.5, а не 4.0.
-
Я попытался отключить параллельный GC и/или разрешить GC сервера. Прямо сейчас соответствующая часть моего app.config выглядит так:
<?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>
Хотя странная вещь, я все еще нахожу несколько связанных с GC потоков в свалке процесса. Помимо того, что произошел сбой, существует 7 потоков со следующей трассировкой стека:
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
Что заставляет меня задаться вопросом, могу ли я каким-то образом отключить отключение параллельного GC (это то, на что я фактически перечислил конфигурацию).
Я думаю, что это завершает то, что мне удалось найти до сих пор. Я действительно мог бы использовать некоторую помощь в том, как приступить к решению этой проблемы.