2010-04-30 34 views
0

當調試以下控制檯程序:在VS 2008中進行調試時,爲什麼調試器需要第二個return語句?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(DoIt(false)); 

     Console.WriteLine(DoIt(true)); 
    } 

    private static Boolean DoIt(Boolean abort) 
    { 
     try { 
      throw new InvalidOperationException(); 
     } catch(Exception ex) { 
      if (abort) { 
       return true; 
      } 

      Console.WriteLine("Got here"); 
      return false; 
     } 
    } 
} 

爲什麼在第二return語句IDE土地第二通話過程中DOIT()?執行結果是正確的,但調試經驗是誤導性的。

這是一個已知的問題?

是2010年同期VS行爲?

+1

我在VS2008跑這個錯誤,並通過預期路徑在這兩個版本加強和調試版本。也許.pdb文件已過期? – 2010-04-30 18:37:30

+0

我還應該提一下,我安裝了最新版本的Resharper,但其行爲與Resharper禁用相同。 – 2010-04-30 18:40:02

回答

0

它在JIT編譯器的64位版本的缺陷。看起來它不會生成完全正確的機器碼地址到語句調試映射數據。它只是有點準確,「return true」語句實際上在方法結尾處跳到了return語句。但它應該是最接近的大括號,而不是「返回虛假」聲明。

此錯誤是不存在的JIT編譯器的x86版本。您通常希望在調試過程中使用該抖動,它支持Edit + Continue。項目+屬性,生成選項卡,平臺目標= x86。這在VS2010中對於新項目是自動的。

您可以報告在connect.microsoft.com

0

它不會在VS2010中做到這一點。第一次打電話給DoIt打印Got在這裏,並擊中第二個返回聲明。第二次調用命中第一個返回語句。

+0

我們在VS 2010中對它進行了測試,它完全一樣。當abort爲true時,它會觸發'return true',然後返回false‖。正如我在第一篇文章中所述,執行結果是正確的,這是一種誤導性的調試體驗。 – 2010-04-30 18:38:48

+0

我做了一些步驟並允許它運行。儘管我在x86上。不知道有關x64的錯誤。 – 2010-05-03 12:34:52

0

如果你正在運行一個優化的建立,它是可能的優化決定擺脫的回報之一。這是一個相當普遍的優化(我不知道爲什麼,我通過觀察調試器學到了大多數優化器,但是他們所做的是魔術,只要我想知道:))當發生這種情況時,調試器(或更精確地產生調試器正在使用的元數據來確定你的代碼行)必須選擇其中的一個,在你的例子中,它有五十個錯誤的機會。

雖然這是一個誤導的經歷,它只是調試優化代碼的經驗的一部分。唯一的選擇是不優化代碼,這不會很好。

+0

我想也許我對行爲的解釋還不清楚。當'abort == true'時,調試器將一個接一個地登陸到兩個返回語句中,而不是第一個語句。在DEBUG構建中。 – 2010-04-30 18:42:06

+0

啊 - 我沒有意識到這是一個調試版本。這似乎很奇怪。在零售版本中,您可以看到優化器如何將您的代碼轉換爲if(!abort)WriteLine(...);返回中止;我認爲這將是一個完美的合法優化,可能是值得的。這將解釋調試器顯示的內容。 – Stewart 2010-04-30 18:56:51