2010-01-19 99 views
27

我剛剛遇到了有史以來最令人難以想象的錯誤之一。 false == true您需要什麼信息來確認/調試此行爲?我從來沒有見過這樣的事情。C#How false false == true?見圖

enter image description here

  • VS2008 SP1中
  • 調試模式|任何CPU
  • IIS 7.5

編輯: 我做了一個潔淨>重建還是一樣。

這裏是程序集和寄存器。我不知道如何閱讀,但也許可以幫助別人。

+0

嘗試使用quickwatch評估結果== true - 我想如果您的調試器顯示結果的值爲false,它將計算爲false。在這一點上,在if語句被評估之後,可能有什麼東西正在改變結果的值?調試器還可以更改結果的值... – Mayo

+5

另外,爲什麼不只是擺脫「'== true」「?我更喜歡:'如果(結果)' – JMD

+0

相關:在VB.net中真實並且真實並非總是如此:http://msmvps.com/blogs/bill/archive/2004/06/23/8730.aspx – recursive

回答

42

我想你的PDB文件不在同一階段,你在真正執行的內容和Visual Studio看作是行號的地方有不同。嘗試重建。我們都知道,這是不可能有true = false,或世界,因爲我們知道這可能會改變:-)

+7

宇宙常數波動在他的wkstn ... –

+14

回到VB6我其實'真=在同一個調試會話期間,所有的錯誤處理都失敗了,執行通過每個if語句的每個可能的分支,當天使從天而降時,天空變黑了......當天必須重新安裝VB 3次;從來沒有弄清楚是什麼造成了它......啊,好日子...... – Rory

+2

«或我們知道它可能會改變的世界»→也許有人發現了這個問題?!:o – Pikrass

7

也許源不符合運行的版本或有在調試器中的錯誤。

4

你確定這是拋出的異常嗎?我的直覺是你的方法isContextSignatureValid實際上是拋出一個異常,但是Visual Studio調試器有時可以超前,並突出顯示實際上並沒有拋出異常的那一行。

11

它確實會拋出錯誤嗎?調試器通常可能會突出顯示錯誤的行,如果您給它提供了錯誤的pdb,那麼這可能是一個錯誤的提示。使用「立即」窗格在測試後更改值也很容易重現。

如果result是一個字段或捕獲的變量,它也可以由外部代碼(可能在另一個線程)設置。

如果result不是bool但自己的自定義類型,你可以只覆蓋==,或提供自定義true/false操作。

+0

你說的沒錯,它不會在下一行拋出異常,所以看起來調試器正在讀取不同的pdb。 –

6

問題的一部分是,你假設調試器是100%正確的。它實際上不是,並且會受到一些價值可能不正確或誤導性顯示的情況的制約。這種情況最常見的原因是...

  • 不匹配的PDB文件。這通常會導致調試器中至少有一個關於不匹配源文件的警告對話框,但並不總是如此。
  • 基礎表達式評估程序進行簡單的數據檢查或顯示錯誤。在這種情況下不可能,因爲它是簡單的本地和原始類型。
  • 優化導致數據顯示不正確。

但實際上它幾乎肯定不是假的。驗證這一點的最簡單方法是使用調用Debug.WriteLine將值輸出到輸出窗口。

2

我想補充一點建議:

如果你有機會從調試器混亂的結果,堅持一個Console.WriteLine()在那裏獲得代碼本身來告訴你是怎麼回事。這通常可以消除混淆。

(調試版本的代碼時,也可以得到這樣的效果,但你說這是一個調試版本,其消除了犯罪嫌疑人)

3

也許您將鼠標移到當前指令指針(黃色箭頭)不經意間而在休息模式......它發生在我身上一次,我翻了出來。 :-)

0

我以前見過這樣的事情。一位同事深信他在.Net Framework或CLR中發現了一個錯誤。最後它只是一箇舊的程序集或pdb同步問題。