2015-12-23 173 views
5

NullReferenceException的堆棧跟蹤非常無用,它們只包含方法名稱和調用堆棧。方法中的任何變量都可以爲null,並且在開發機器上無法重現錯誤時很難進行調試。獲取NullReferenceException的變量名稱

你知道一種獲得關於該錯誤的更多信息的方法,可能是獲取變量名嗎?或者你有更好的方法來調試它嗎?

+1

你不能得到變量名。您可以確定發生異常的行。 – Alex

+0

@Alex是的,但在生產中需要分發.pdb文件。這也阻止了混淆器的使用。 – Elmo

+4

@Elmo祝你好運。如果你使用混淆器,堆棧跟蹤將變成垃圾。 –

回答

9

保持跟蹤該名稱並不總是可能的(它可能是一個表達式)。
在可能的情況下會產生不可接受的開銷。考慮運行時將不得不跟蹤幾乎所有的參考變量,這將是昂貴的,並禁止各種優化。

另請參閱Inspect the managed stack上的我的回答以及它提到的博客文章。

簡單的解決方案是建立在更加一致空在自己的代碼檢查:

void Foo(Bar b) 
{ 
    if (b == null) throw new ArgumentNullException(nameof(b)); 

    ... 
} 
+0

如果您在隨後調試時包含'Debug.AssertNonNull'(或其他任何應該包含的內容),則只需進行理智檢查就特別有用。 –

+0

調試狀態的開銷是多少? –