2013-10-03 101 views
21

我有一個長期運行的.NET 4.5應用程序隨機崩潰,留下了我在問題標題中提到的消息。這個問題在3個不同的機器和2個不同的系統(2008 R2和2012)上覆制。應用程序不使用任何不安全/非託管組件,它是純粹的託管.NET,唯一不受管理的東西是CLR本身。.NET 4.5:.NET運行時的內部錯誤(80131506)/禁用併發的GC

下面是我從轉儲中提取的墜機現場的堆棧跟蹤:

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  

這個問題非常類似於討論here的人,所以我想這個話題在建議的解決方案,但他們沒有幫助:

  • 我已經嘗試安裝this修補程序,但它不會對我的任何機器上安裝(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(這是我真正所列出的配置爲)。

我認爲這包括了我迄今爲止設法找到的東西。我真的可以用一些幫助來解決這個問題。

+4

GC堆上的託管對象的對象頭已損壞,無法再找到該類型的方法表。您總是先查找與之互操作的非託管代碼以查看原因:修改gc config並不能解決問題 –

+0

也許在終結器中存在問題?你可以​​嘗試在終結器中設置斷點或將它們註釋掉 – DSway

+0

'scan_dependent_handles':依賴句柄最近被添加到CLR 4.0?)。也許這是CLR的一個真正的bug。 – usr

回答

3

我從我過去的經驗中吸取了應用的經驗。如果一個異常不能處理直到終結器級別,並且如果它發生了,那麼這可能會導致應用程序崩潰。

GC上的配置做任何事情之前..

一個快速檢查...... 是否使用任務並行庫如果是,請確保您正確處理異常。如果來自不同線程的異常未處理,它將一直持續到Finalizer,然後崩潰應用程序。有幾種方法可以很好地處理它們。處理「聚合」異常是一種方式(我們曾經解決!)。

http://msdn.microsoft.com/en-us/library/dd537614.aspx

我沒有50分加註釋,所以將其作爲一個答案...

+0

這個問題的確在我啓用了一個使用TPL的組件之後纔開始發生,但我認爲這裏沒有出現未處理的異常。原因是:1.對任務執行的所有回調函數都包含在try-catch塊中; 2.我訂閱了AppDomain.Current.UnhandledException,並在此任務異常+終結器案例中觸發了AFAIR; 3.我不明白它是如何破壞託管堆的,這似乎是在這裏發生的。 – HellBrick

+0

1)你是否說AppDomain.Current.UnhandledException被觸發?這意味着一些未處理的事情,記錄並獲取更多數據。 2)終結者的例外是致命的。 3)在你的dump分析'!threads'中檢查Finalizer線程和!pe你應該看到異常。如果是這樣的話:) ..讓我知道.. – SridharVenkat

+0

我的意思是我有一個AppDomain.Current.UnhandledException處理程序,但它不會在我的應用程序中觸發,即使它應該是如果它是一個簡單的終結器異常(我我剛剛通過以下測試應用程序對此進行了雙重檢查:[http://pastebin.com/9EgzBZQA](http://pastebin.com/9EgzBZQA))。還是未處理的任務異常以其他方式傳播,但不包括將它們從終結器中拋出?關於轉儲探索的建議:稍後我會嘗試它們,首先我需要研究它們對於他們來說意味着什麼=)(這整個轉儲對我來說是新的) – HellBrick

0

解決方案,幫助我:卸載.NET 4.5.1,安裝4.0 ,安裝提到的修補程序,安裝4.5.1回來。

0

我剛剛與微軟完成了一次對話,因爲我已經能夠重現一個類似的問題。

在我的情況下,它是.NET運行時的一個錯誤,它與混合動態類型和非動態代碼有關。我不確定在您的情況下是否也存在這種情況,但您可能想嘗試以下某種方法:

  • 在Windows 8.1(最新更新)上運行代碼。顯然,Windows 8.1比其他版本的Windows有更新的.NET版本。
  • 如果您使用AssemblyBuilder(與我一樣),請嘗試將其更改爲Run模式,而不是RunAndCollect
  • 將運行時更改爲x86或x64,然後重試;你也可以像你已經嘗試過的那樣使用併發GC設置。
  • 我們的問題正在解決,因爲我們說話,這基本上意味着會有一個窗口更新照顧它。也許這也是一個簡單的等待的選擇;我不期望花太長時間,因爲這對很多程序來說都非常重要。
0

我意識到這是一個老帖子,但我遇到了相同的問題的任擇議定書。點atlaste取得:

將運行時更改爲x86或x64,然後再試一次;你也可以像你已經嘗試過的那樣使用併發GC設置。

對我來說是關鍵。我的所有項目都被設置爲任何CPU除了一個(巧合地是作爲控制檯應用程序項目的應用程序的入口點)。該項目已設置爲x86。一旦我將其更改爲任何CPU應用程序都正確運行。

0

我們在我們的.NET 4.5桌面應用程序 - 網頁刮板中遇到了同樣的問題。它在重負荷下隨機墜毀。所以我們一直在尋找方法來找出幾個月的原因:我們已經嘗試了一切!禁用併發GC,將其設置爲服務器模式以及許多其他解決方法,直到我們意識到因模塊發生崩潰而發生崩潰。它使用了一些非託管資源,並且之後沒有清除它們:(所以我們爲PhantomJS集成創建了一個獨立的控制檯應用程序,現在我們從網絡刮板執行這個控制檯應用程序,然後殺死它,這需要更多時間但不會再發生崩潰!

相關問題