2017-03-14 17 views
1

次のコードは、同じ出力を95%のマシンで生成しますが、いくつかの違いがあります。C#デバッグとリリースの違い

Changing from New to Fin 
OK 

が、リリースモードで:OK行が欠落している

Changing from New to Fin

デバッグモードでは出力があります。プロジェクトはVS2005でビルドされた.Net 4.0を対象としています。hereフルサンプルをダウンロードできます。

ソースコード

using System; 
namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Status current = Values.Status; 
      if (current != Next()) 
       Console.WriteLine("OK"); 
     } 

     static VO Values = new VO(); 
     private static Status Next() 
     { 
      Status res = Status.Fin; 
      if (Values.Status == Status.New && Values.Cond) 
       res = Status.Fin; 
      else if (Values.Status == Status.Fin) 
       res = Status.Fin; 

      Log("Changing from {0} to {1}", Values.Status, res); 
      Values.Status = res; 
      return res; 
     } 
     public static void Log(string format, params object[] args) 
     { 
      Console.WriteLine(format, args); 
     } 
    } 

    public class VO 
    { 
     public Status Status; 
     public bool Cond; 
    } 

    public enum Status { New, Fin } 
} 

これは私の意見では、エラーを再現する最小限のバージョンです。 Next()のいくつかの条件を削除した後、Logメソッドをインライン化し、Values.Condをfalseに置き換えると、アプリケーションは正しく動作します。

:ハードウェア関連ではありません。オペレーティングシステムがHyper-Vに抽出され、問題は解決しません。

+0

実行ファイルをIL逆アセンブラで実行し、 'Main'にどのような違いがあるのか​​を確認してください。 – Abion47

+1

私はデバッグとリリースで同じ出力を得ます – aquinas

+0

興味深いことに、LinqPadでは、最初の実行で2行、2番目(および他のすべての結果的な実行)は 'OK'なしの最初の行のみを生成します。私が推測しているのは、それを引き起こす「静的」なのです。 – rbm

答えて

0

Hans Passant'sコメントに基づいて、この問題はまだclrjit.dllバージョン4.6で再現可能でした。 4.7にアップグレードすると、それは消えます。

関連する問題