幾招教會您VS調試困惑
在VS調試代碼中,我們經常會遇到這樣的問題,有時我們引用了一些其他工具包或者類庫(如Microsoft提供的Enterprise Library),而在VS調試時,我們其實是不需要跟蹤VS調試這些代碼的,因為它們都已經證明是正確的。在Visual Studio 2003中,處理這類問題我們的方法一般是使用F10跳過它們,但一旦工程龐大的話,這樣做十分麻煩。
JMC功能由兩方面來實現。首先,如果一個工程是以release方式進行編譯構建的話(就是工程中,沒有pdb文件),VS調試器會將其認為是非用戶代碼,那么在VS調試運行時,就根本不會進入該工程中進行VS調試。其次,可以使用System.Diagnostics命名空間里的 DebuggerNonUserCodeAttribute屬性,將其應用在希望不進行VS調試的代碼段中。
下面舉一個例子來說明。下面的代碼段中,有兩個靜態方法UserCode()和NonUserCode(),其中,在NonUserCode()中,是應用了 DebuggerNonUserCode的屬性,這表明這段代碼將在VS調試運行時,VS調試器不會進入其中。將斷點設置在其中的第9行,運行程序,程序會在第一個UserCode()里中斷,現在試著用F11繼續單步跟蹤,會發現系統在進入usercode()方法中運行后,并沒有進入到NonUserCode ()里運行。
- using System;
- using System.Diagnostics;
- class Program
- {
- static void Main(string[] args)
- {
- // Step into F11 from here
- UserCode();// Place break point on this line
- NonUserCode();
- UserCode();
- }
- static void UserCode()
- {
- Console.WriteLine("This is a call from user Code");
- }
- // Attribute to indicate the Debugger to jump
- // over this method
- [DebuggerNonUserCode]
- static void NonUserCode()
- {
- Console.WriteLine("This is a call fron Non User Code");
- }
- }
在Visual Studio 2005中,新引入了"Object Identity While Debugging"的概念,也就是說,系統給在VS調試階段的每個對象,都可以賦予一個別名,在VS調試時,直接引用該別名就可以了。
假設在VS調試的時候,需要跟蹤比如dataset或者hashtable等對象,這些對象中包含了很多其他的子對象,如果想對這些數量眾多的子對象進行跟蹤的話,將十分麻煩。在Visual Studio 2005中,可以使用object identity(對象標識)的方法去標記每一個對象。#t#
比如,在一個windows應用程序中,創建了一個dataset,并將其綁定到datagridview中去。如將sql server 的northwind數據庫中的orders和orderdetail表中的數據讀出填充到dataset里去,則在VS調試時,設置一個斷點放在 dataset里填充了數據之后的那行,這時,在監視窗口中,鼠標展開this.northwindData這個dataset,如下圖所示,找到 orders這個table,然后鼠標右鍵,會彈出一個菜單,選擇其中的" Make Object ID"。