2017-04-20 118 views
5

將Windows 10更新爲使用.net 4.7創建者更新後,我在啓動非常簡單的代碼時遇到了一個嚴重問題。Windows 10 Creators更新.net 4.7 System.AccessViolationException問題

描述:由於未處理的異常而終止進程。 異常信息:System.AccessViolationException

class Program 
{ 
     private int? m_bool; 
     private bool prop {get{ return false;}} 
     void test() 
     { 
      //nothing 
     } 
     private object Test() 
     { 
      if (prop) 
      {      
       try 
       { 
        test(); 
       } 
       catch (Exception) {} 

       m_bool = 1;      
      } 
      return null; 
     } 

     static void Main(string[] args) 
     { 
      new Program().Test(); 
     } 
} 

看來,類似的問題是https://github.com/dotnet/coreclr/issues/10826

任何人知道如何避免這種情況?

+0

請注意 - 這可以在visual studio下運行,並且不在應用程序中運行。 – Andrew

回答

4

該問題是由於在不可達的基本塊上運行優化而引起的。 在你的情況下,編譯器內聯get_prop方法(它無條件地返回false)。這導致JIT編譯器將該區域視爲無法訪問。通常情況下,JIT編譯器會在運行優化之前刪除無法訪問的代碼,但添加try/catch區域會導致JIT不刪除這些基本塊。

如果你想阻止你可以禁用優化問題,禁用GET_PROP的內聯或改變GET_PROP方法的實現是:

static bool s_alwaysFalse = false; 
    private bool prop {get{ return s_alwaysFalse;}} 

我們有一對夫婦的這一問題的報告,我們確實已經準備好了一個修復程序,它將在即將到來的更新中提供給用戶。

+0

任何意見,如何我們可以防止像這樣下載到我們的機器可怕的錯誤,讚賞。並且考慮到這是如何不可知的。 –

+0

感謝Brian澄清!我們有大的解決方案,只有一個地方失敗。最初該屬性有一些條件編譯,並在某些情況下返回false。 – Andrew

+0

@Brian,當這個問題將被修復,以及補丁將如何提供給我們? – Graviton