在這篇文章中,咱們假定讀者瞭解VS
基本的調試知識,如:git
許多開發人員使用這個功能強大的工具包來處理調試會話。然而,Visual Studio
調試工具提供了更多的功能。下面是一系列Visual Studio調試效率技巧。注意,這些提示和快捷方式已經在的Visual studio 2019 16.6 EN-US版本中進行了驗證,驗證時Visual studio
沒有安裝擴展。github
使用快捷鍵Ctrl+F10
,您可讓調試器運行到光標所在行位置。多線程
在調試運行的程序時,經過鼠標懸停在當前行的代碼上時,出現綠色的符號,能夠點擊此符號,直接讓斷點運行到此處。
app
在調試運行的程序時,經過鼠標懸停在當前行的代碼上時,經過按住Ctrl
鍵轉換爲將此處做爲下一條要執行的語句。它與經過綠色箭頭符號運行到這裏不一樣,此功能將會跳過中間的語句,直接將斷點跳轉到此處。所以,在下面的動圖中,咱們能夠在監視窗口中引用obj仍然爲null,中間的MyClass
構造函數並無被執行。
編輯器
當你設置一個非靜態的設置器爲斷點時,當全部對象的屬性的值發生更改時觸發斷點。經過局部窗口(監視器窗口)右鍵點擊:值更改時中斷
菜單,單個對象也能夠得到相同的行爲。ide
下面的動畫說明了這個功能,只有當obj2.Prop
發生變化時,命中斷點,而obj1.Prop
發生變化時沒有命中斷點。函數
注意:數據斷點綁定到活動對象時,旨在調試期間起做用。所以,一旦調試過程中止,設置的斷點就會丟失,在之後的調試過程當中不能重用它。工具
能夠將條件附加到斷點中,以便盡在特定場景中觸發中斷。在下面的動圖中,咱們在循環中定義條件i>6
的斷點。而後點擊繼續
,能夠看到一旦斷點中止,i
的值實際上變成了7
。oop
在遇到斷點時,中止程序執行時最多見的操做。可是,你能夠選擇在輸出窗口中不終止(或帶終止)打印一些跟蹤信息。下面的動圖說明了這種可能性。咱們在輸出窗口中跟蹤i從0到9的值。注意:跟蹤斷點在編輯器的斷點顯示位置顯示爲菱形形狀。動畫
注意,條件和跟蹤操做均可以在斷點上指定。
在監視窗口中,經過當前執行範文內引用的名稱來跟蹤對象。可是,當這樣的跟蹤引用超出做用域時,即便在引用對象仍處於活動狀態時,它在監視窗口的上下文也不安的毫無心義而且被禁用。
在許多狀況下,咱們想繼續跟蹤做用域外對象的狀態。爲此,請在監視窗口中右鍵單擊此類引用,單擊菜單[Make Object ID] 建立對象ID(M)
,並要在監視器中添加$1(或者$2,$3,...,取決於你已經建立了多個對象ID)。
下面的動圖演示瞭如何跟蹤做用域外對象的屬性獲取器的狀態,該屬性獲取器以字符串的形式返回實際的日期時間。它很好地顯示了當引用obj
在Fct()
上下文中超出做用域時,要觀看的obj
項將被禁用,而$1
仍然會得到更新。
函數返回的值有時在源代碼中被忽略,或者有時這個值在調試時沒法被顯示的訪問。
這樣的返回值能夠顯示在調試->窗口->自動窗口
中。僞變量$ReturnValue
也能夠在即時窗口和監視窗口中使用,以方便查看最後一個函數調用的返回值。
注意,菜單調試->窗口->自動窗口
僅在Visual Studio
調試器附加到進程而且程序被調試器暫停時可用。
從Visual Studio 2017
開始,從新附加到進程Shift+Alt+P
工具被提出,而且很是方便。將調試器附加到某個進程後,Visual Studio
會記住它,並建議將調試器從新附加到同一進程。斜體也同樣,由於這裏有一個關於進程標識的啓發式方法:
Visual Studio
將嘗試查找和前一個進程名具備相同名稱的單進程,並將調試器從新附加到該進程。從新附加到進程也適用於涉及多個進程的調試會話。在這種狀況下,Visual Studio
會嘗試使用上述相同的啓發式方法來查找它附加到的全部進程。
No-Side-Effect
評估有時,在即時窗口或監視窗口中評估表達式時,某些狀態會更改。這種行爲一般時不但願發生的。你不想僅僅由於須要評估表達式的值而破壞調試程序的狀態。這種狀況被稱爲Heisenbug
,該術語時物理學家Werner Heisenberg
的雙關語,它首先斷言了量子力學的觀察者效應,該現象指出,觀察系統的行爲不可避免的會改變器狀態。
爲了不更改任何狀態,你能夠在表達式後面加上nse
(No-Side-Effect)。下面的動圖說明了這種可能性(在監視窗口中監視State
的值是否有變化)。
下面這種動圖是nse
在監視窗口的使用。因爲SideEffectFct()
所觀察的項中有Refresh
評估按鈕,因此此示例比前一個示例更簡單。
調試多線程應用程序是有名的複雜。但願在源碼中顯示線程
按鈕能提供很大的幫助。它在編輯器的左側邊欄引入標記圖標,以跟蹤其餘線程被暫停的位置。這個標記能夠用來顯示線程ID
,並最終切換到另外一個線程。注意:若是至少兩個線程在同一位置暫停,則會顯示不一樣的標記符號。
更多調試多線程應用程序的技巧能夠在這個微軟文檔中找到:Get started debugging multithreaded applications (C#, Visual Basic, C++)
下面是這個演示的源代碼,若是你想演示它,能夠進行參考:
using System; using System.Threading; class Program { static void Main() { for (int i=0; i< 5; i++) { // Avoid capturing a loop variable in the lambda below int j = i; // So 2 thread are blocked on '0' case if (j == 1) { j = 0; } ThreadPool.QueueUserWorkItem(delegate { Method(j); }); } Thread.Sleep(60000); } static void Method(int id) { switch(id) { case 0: Thread.Sleep(60000); break; case 1: Thread.Sleep(60000); break; case 2: Thread.Sleep(60000); break; case 3: Thread.Sleep(60000); break; case 4: Thread.Sleep(60000); break; } } }
咱們常常依賴一些黑盒組件:咱們沒有源代碼的組件。
可是,在調試複雜行爲時,觀察甚至調試引用的黑盒組件引用的邏輯。這就是爲何從16.5版本開始,Visual Studio 2019
能夠從編譯好的程序中生成一些源代碼。這樣的源代碼是能夠調試的。這個特性是基於開源軟件(OSS)工程:ILSpy(https://github.com/icsharpcode/ILSpy)。
反編譯菜單能夠在模塊窗口的組件右鍵菜單(以下面的動圖所示)和Source Not Found
或No Symbols Loaded
對話框中給出。
將IL
代碼反編譯爲源代碼不多是完美的,由於一些源代碼信息在編譯時丟失了。所以,這個特性有一些限制,在這個官方文檔的最後會解釋:Generate source code from .NET assemblies while debugging
https://docs.microsoft.com/en-us/visualstudio/debugger/decompilation?view=vs-2019
Visual Studio很是出色,在調試方面尤爲出色。 在這裏,我試圖選擇一些既隱藏又常常有用的技巧,但願它們能幫助您提升生產率。
若是你感受有用,請關注一下個人公衆號