.net - Visual Studio調試器提示和技巧




visual-studio debugging (10)

.load sos在即時窗口中.load sos :)

我一直在VS的調試工作多年,但我偶爾偶爾會遇到一個我從未註意過的特性,並且認為“該死!我怎麼可能錯過了它?它非常有用!”

[免責聲明:這些技巧在VS 2005中工作在C#項目上,對於VS或其他語言的舊版本沒有保證]

跟踪對象實例

處理給定類的多個實例? 你怎麼能把他們分開? 在預先垃圾回收編程的日子裡,很容易跟踪引用 - 只需查看內存地址即可。 使用.NET,你不能這樣做 - 對象可以移動。 幸運的是,手錶視圖可讓您右鍵單擊手錶並選擇“製作對象ID”。

手錶視圖http://img403.imageshack.us/img403/461/52518188cq3.jpg

這會在實例的值後附加{1#},{2#}等,有效地為實例提供唯一的標籤。 它看起來像這樣:

編號實例http://img383.imageshack.us/img383/7351/11732685bl8.jpg

該標籤在該對象的整個生命週期內都會持續存在。

觀察變量的有意義的值

默認情況下,監視變量的值是它的類型。 如果你想看到它的領域,你必須擴展它,如果有很多領域或者他們做了一些複雜的事情,這可能需要很長時間(甚至超時!)。

但是,某些預定義類型顯示更有意義的信息:

  • 字符串顯示其實際內容
  • 列表和字典顯示其元素數量等

有意義的信息http://img205.imageshack.us/img205/4808/37220487md1.jpg

對於我自己的類型來說不是很好嗎?

嗯...

...使用.NET Reflector的一些高質量時間顯示了使用我的自定義類型的DebuggerDisplay屬性可以輕鬆實現這一點:

[System.Diagnostics.DebuggerDisplay("Employee: '{Name}'")]
public class Employee {
    public string Name { get { ... } }
    ...
}

...重新運行,並...

達達! http://img60.imageshack.us/img60/926/79816018ha1.jpg

有關此主題的更多信息: MSDN

打破所有例外

......即使是在代碼中處理的那些! 我知道,自從我出生以來,我一直都不知道這件事,但無論如何它都會發生 - 也許這有助於某個人某一天:

每次拋出異常時,都可以強制調試進程進入調試模式。 有沒有花過幾個小時才找到這樣的代碼?

try {
    runStrangeContraption();
} catch(Exception ex) {
    /* TODO: Will handle this error later */
}

捕獲所有異常在這些情況下非常方便。 這可以從調試>例外...(Ctrl-Alt-E)啟用。 在“投擲”列中勾選您需要的每種類型的異常。

那些對我來說是一些額頭拍拍的時刻。 你願意分享你的嗎?


兩個代碼中的技巧:

我非常喜歡System.Diagnostics.DebuggerStepThrough屬性; 你可以將它附加到一個類,方法或屬性,以使VS在調試時默認不輸入代碼。 我更喜歡DebuggerHidden屬性,因為如果你真的需要調試它,它仍然允許你在被忽略的代碼中放置斷點。

另一個(有時)有用的調用是System.Diagnostics.Debugger.Launch() ; 當執行命中它時,你將看到“選擇一個調試器”對話框,一個調試器將啟動。 有點粗魯,但特別討厭附加到進程,比如被另一個進程產生的進程,並立即執行你的代碼。


創建宏以附加到進程並分配給未使用的鍵盤快捷鍵。 比去往快得多:調試 - >附加到進程 - >在進程列表中搜索進程 - > ...


在非託管代碼中,您可以設置“數據斷點”。 他們使用CPU的調試寄存器來發出INT3,並且調試器在運行時沒有任何開銷的情況下停止該指令(在舊版本中,調試器通過程序檢查內存.....慢!)

如果你在knwon地址有一些腐敗(堆棧/堆可變的被破壞),這是很有用的。

也可以定制ide \ packages \ debugger中的AutoExp.dat以顯示您的數據結構。

指針,mb在監視窗口中顯示十六進制轉儲http://msdn.microsoft.com/en-us/magazine/dd252945.aspx

百勝!


如果您的代碼重複了很多次,但只在特定條件下(例如循環中的代碼,從循環調用的方法或從多個線程調用的方法)失敗,則條件中斷非常有用。 將break語句放在關注的位置,並設置其條件以匹配錯誤情況。 (這裡有個簡單的例子。)


少數來自我

  • 在工具 - >選項 - >調試中取消選中“啟用我的代碼”選項。
  • 有條件的斷點 - 他們幾乎每天都在拯救我的生命
  • 如果事情變得糟糕, 請使用.NET框架源代碼

我發現模塊窗口很有用。 它告訴調試器是否加載了所需的dll以及加載了哪個版本的dll。 它也可以讓你手動加載或卸載一個DLL。


我總是確保在我創建的新線程上設置“名稱”屬性。 這樣,當我調試時,我可以更容易地識別不同的線程。


這是我學到的另一個巧妙的技巧:

System.Diagnostics.Debugger.Break()

以編程方式導致調試器中斷下一條指令。 真正好的部分是,這也適用於在發布模式下編譯的程序,無需調試信息。


try {
    // do something big
}
catch {
    // breakpoint set here:
    throw CantHappenException("something horrible happened that should never happen.");
}

你如何看到最初拋出的異常? 在監視窗口中,輸入$ exception





hidden-features