<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          12個(gè)必知的Visual Studio調(diào)試效率技巧!

          共 4382字,需瀏覽 9分鐘

           ·

          2021-08-10 23:05



          在這篇文章中,我們假定讀者了解VS基本的調(diào)試知識(shí),如:

          • F5 開(kāi)始使用調(diào)試器運(yùn)行程序
          • F9 在當(dāng)前行設(shè)置斷點(diǎn)
          • F10 運(yùn)行到下一個(gè)斷點(diǎn)處
          • F5 從被調(diào)試的已停止程序恢復(fù)執(zhí)行
          • F11 步進(jìn)到函數(shù)內(nèi)(如果當(dāng)前程序指針指向一個(gè)函數(shù))
          • F10 步過(guò)函數(shù)(如果當(dāng)前程序指針指向一個(gè)函數(shù))
          • Shift+F11 步出執(zhí)行的函數(shù)
          • 暫停執(zhí)行
          • 附加到進(jìn)程
          • 鼠標(biāo)懸停時(shí)快速查看源代碼中的元素
          • 調(diào)試窗口:局部變量、監(jiān)視、即時(shí)窗口、模塊、調(diào)用堆棧、異常設(shè)置

          許多開(kāi)發(fā)人員使用這個(gè)功能強(qiáng)大的工具包來(lái)處理調(diào)試會(huì)話。然而,Visual Studio調(diào)試工具提供了更多的功能。下面是一系列Visual Studio調(diào)試效率技巧。注意,這些提示和快捷方式已經(jīng)在的Visual studio 2019 16.6 EN-US版本中進(jìn)行了驗(yàn)證,驗(yàn)證時(shí)Visual studio沒(méi)有安裝擴(kuò)展。

          1、運(yùn)行到光標(biāo)位置

          使用快捷鍵**Ctrl+F10**,您可以讓調(diào)試器運(yùn)行到光標(biāo)所在行位置。

          Ctrl+F10運(yùn)行到光標(biāo)位置

          2、通過(guò)點(diǎn)擊鼠標(biāo),運(yùn)行到當(dāng)前位置

          在調(diào)試運(yùn)行的程序時(shí),通過(guò)鼠標(biāo)懸停在當(dāng)前行的代碼上時(shí),出現(xiàn)綠色的符號(hào),可以點(diǎn)擊此符號(hào),直接讓斷點(diǎn)運(yùn)行到此處。

          3、在此處作為下一條要執(zhí)行的語(yǔ)句

          在調(diào)試運(yùn)行的程序時(shí),通過(guò)鼠標(biāo)懸停在當(dāng)前行的代碼上時(shí),通過(guò)按住Ctrl鍵轉(zhuǎn)換為將此處作為下一條要執(zhí)行的語(yǔ)句。它與通過(guò)綠色箭頭符號(hào)運(yùn)行到這里不同,此功能將會(huì)跳過(guò)中間的語(yǔ)句,直接將斷點(diǎn)跳轉(zhuǎn)到此處。因此,在下面的動(dòng)圖中,我們可以在監(jiān)視窗口中引用obj仍然為null,中間的MyClass構(gòu)造函數(shù)并沒(méi)有被執(zhí)行。

          4、數(shù)據(jù)斷點(diǎn):當(dāng)值發(fā)生變化時(shí),觸發(fā)中斷(值更改時(shí)中斷)

          當(dāng)你設(shè)置一個(gè)非靜態(tài)的設(shè)置器為斷點(diǎn)時(shí),當(dāng)所有對(duì)象的屬性的值發(fā)生更改時(shí)觸發(fā)斷點(diǎn)。通過(guò)局部窗口(監(jiān)視器窗口)右鍵點(diǎn)擊:值更改時(shí)中斷菜單,單個(gè)對(duì)象也可以獲得相同的行為。

          下面的動(dòng)畫(huà)說(shuō)明了這個(gè)功能,只有當(dāng)obj2.Prop發(fā)生變化時(shí),命中斷點(diǎn),而obj1.Prop發(fā)生變化時(shí)沒(méi)有命中斷點(diǎn)。

          注意:數(shù)據(jù)斷點(diǎn)綁定到活動(dòng)對(duì)象時(shí),旨在調(diào)試期間起作用。因此,一旦調(diào)試過(guò)程停止,設(shè)置的斷點(diǎn)就會(huì)丟失,在以后的調(diào)試過(guò)程中不能重用它。

          數(shù)據(jù)斷點(diǎn):值更改時(shí)中斷

          5、條件斷點(diǎn)

          可以將條件附加到斷點(diǎn)中,以便盡在特定場(chǎng)景中觸發(fā)中斷。在下面的動(dòng)圖中,我們?cè)谘h(huán)中定義條件i>6的斷點(diǎn)。然后點(diǎn)擊繼續(xù),可以看到一旦斷點(diǎn)停止,i的值實(shí)際上變成了7

          6、跟蹤斷點(diǎn)

          在遇到斷點(diǎn)時(shí),停止程序執(zhí)行時(shí)最常見(jiàn)的操作。但是,你可以選擇在輸出窗口中不終止(或帶終止)打印一些跟蹤信息。下面的動(dòng)圖說(shuō)明了這種可能性。我們?cè)谳敵龃翱谥懈檌從0到9的值。注意:跟蹤斷點(diǎn)在編輯器的斷點(diǎn)顯示位置顯示為菱形形狀。

          注意,條件和跟蹤操作都可以在斷點(diǎn)上指定。

          7、跟蹤超出作用域的對(duì)象

          在監(jiān)視窗口中,通過(guò)當(dāng)前執(zhí)行范文內(nèi)引用的名稱來(lái)跟蹤對(duì)象。但是,當(dāng)這樣的跟蹤引用超出作用域時(shí),即使在引用對(duì)象仍處于活動(dòng)狀態(tài)時(shí),它在監(jiān)視窗口的上下文也不安的毫無(wú)意義并且被禁用。

          在許多情況下,我們想繼續(xù)跟蹤作用域外對(duì)象的狀態(tài)。為此,請(qǐng)?jiān)诒O(jiān)視窗口中右鍵單擊此類引用,單擊菜單[Make Object ID] 創(chuàng)建對(duì)象ID(M),并要在監(jiān)視器中添加2,$3,...,取決于你已經(jīng)創(chuàng)建了多個(gè)對(duì)象ID)。

          下面的動(dòng)圖演示了如何跟蹤作用域外對(duì)象的屬性獲取器的狀態(tài),該屬性獲取器以字符串的形式返回實(shí)際的日期時(shí)間。它很好地顯示了當(dāng)引用objFct()上下文中超出作用域時(shí),要觀看的obj項(xiàng)將被禁用,而$1仍然會(huì)獲得更新。

          8、查看函數(shù)返回的值

          函數(shù)返回的值有時(shí)在源代碼中被忽略,或者有時(shí)這個(gè)值在調(diào)試時(shí)無(wú)法被顯示的訪問(wèn)。

          這樣的返回值可以顯示在調(diào)試->窗口->自動(dòng)窗口中。偽變量$ReturnValue也可以在即時(shí)窗口和監(jiān)視窗口中使用,以方便查看最后一個(gè)函數(shù)調(diào)用的返回值。

          注意,菜單調(diào)試->窗口->自動(dòng)窗口僅在Visual Studio調(diào)試器附加到進(jìn)程并且程序被調(diào)試器暫停時(shí)可用。

          查看函數(shù)返回的值

          9、重新附加到進(jìn)程

          Visual Studio 2017開(kāi)始,重新附加到進(jìn)程Shift+Alt+P工具被提出,并且非常方便。將調(diào)試器附加到某個(gè)進(jìn)程后,Visual Studio會(huì)記住它,并建議將調(diào)試器重新附加到同一進(jìn)程。斜體也一樣,因?yàn)檫@里有一個(gè)關(guān)于進(jìn)程標(biāo)識(shí)的啟發(fā)式方法:

          • 如果已附加的進(jìn)程仍然運(yùn)行著,重新附加到進(jìn)程,重新附加到它。
          • 否則,Visual Studio將嘗試查找和前一個(gè)進(jìn)程名具有相同名稱的單進(jìn)程,并將調(diào)試器重新附加到該進(jìn)程。
          • 如果找到幾個(gè)使用此名稱的進(jìn)程,則打開(kāi)“附加到進(jìn)程”對(duì)話框,只顯示名稱相同的進(jìn)程
          • 如果找不到具有此名稱的進(jìn)程,則顯示“附加到進(jìn)程”對(duì)話框
          重新附加到進(jìn)程

          重新附加到進(jìn)程也適用于涉及多個(gè)進(jìn)程的調(diào)試會(huì)話。在這種情況下,Visual Studio會(huì)嘗試使用上述相同的啟發(fā)式方法來(lái)查找它附加到的所有進(jìn)程。

          10、在即時(shí)窗口和在觀察窗口的No-Side-Effect評(píng)估

          有時(shí),在即時(shí)窗口或監(jiān)視窗口中評(píng)估表達(dá)式時(shí),某些狀態(tài)會(huì)更改。這種行為通常時(shí)不希望發(fā)生的。你不想僅僅因?yàn)樾枰u(píng)估表達(dá)式的值而破壞調(diào)試程序的狀態(tài)。這種情況被稱為Heisenbug,該術(shù)語(yǔ)時(shí)物理學(xué)家Werner Heisenberg的雙關(guān)語(yǔ),它首先斷言了量子力學(xué)的觀察者效應(yīng),該現(xiàn)象指出,觀察系統(tǒng)的行為不可避免的會(huì)改變器狀態(tài)。

          為了避免更改任何狀態(tài),你可以在表達(dá)式后面加上nse(No-Side-Effect)。下面的動(dòng)圖說(shuō)明了這種可能性(在監(jiān)視窗口中監(jiān)視State的值是否有變化)。

          在即時(shí)窗口和在觀察窗口的No-Side-Effect評(píng)估

          下面這種動(dòng)圖是nse在監(jiān)視窗口的使用。由于SideEffectFct()所觀察的項(xiàng)中有Refresh評(píng)估按鈕,所以此示例比前一個(gè)示例更簡(jiǎn)單。

          11、在源碼中顯示線程

          調(diào)試多線程應(yīng)用程序是有名的復(fù)雜。希望在源碼中顯示線程按鈕能提供很大的幫助。它在編輯器的左側(cè)邊欄引入標(biāo)記圖標(biāo),以跟蹤其他線程被暫停的位置。這個(gè)標(biāo)記可以用來(lái)顯示線程ID,并最終切換到另一個(gè)線程。注意:如果至少兩個(gè)線程在同一位置暫停,則會(huì)顯示不同的標(biāo)記符號(hào)。

          更多調(diào)試多線程應(yīng)用程序的技巧可以在這個(gè)微軟文檔中找到:Get started debugging multithreaded applications (C#, Visual Basic, C++)

          https://docs.microsoft.com/en-us/visualstudio/debugger/get-started-debugging-multithreaded-apps?view=vs-2019

          下面是這個(gè)演示的源代碼,如果你想演示它,可以進(jìn)行參考:

          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;
          }
          }
          }

          12、從反編譯的IL代碼中調(diào)試源代碼

          我們經(jīng)常依賴一些黑盒組件:我們沒(méi)有源代碼的組件。

          但是,在調(diào)試復(fù)雜行為時(shí),觀察甚至調(diào)試引用的黑盒組件引用的邏輯。這就是為什么從16.5版本開(kāi)始,Visual Studio 2019可以從編譯好的程序中生成一些源代碼。這樣的源代碼是可以調(diào)試的。這個(gè)特性是基于開(kāi)源軟件(OSS)工程:ILSpy(https://github.com/icsharpcode/ILSpy)。

          反編譯菜單可以在模塊窗口的組件右鍵菜單(如下面的動(dòng)圖所示)和Source Not FoundNo Symbols Loaded對(duì)話框中給出。

          IL代碼反編譯為源代碼不可能是完美的,因?yàn)橐恍┰创a信息在編譯時(shí)丟失了。因此,這個(gè)特性有一些限制,在這個(gè)官方文檔的最后會(huì)解釋:Generate source code from .NET assemblies while debugging

          https://docs.microsoft.com/en-us/visualstudio/debugger/decompilation?view=vs-2019

          從反編譯的IL代碼中調(diào)試源代碼

          結(jié)尾

          Visual Studio非常出色,在調(diào)試方面尤其出色。在這里,我試圖選擇一些既隱藏又經(jīng)常有用的技巧,希望它們能幫助您提高生產(chǎn)率。







          回復(fù) 【關(guān)閉】學(xué)關(guān)
          回復(fù) 【實(shí)戰(zhàn)】獲取20套實(shí)戰(zhàn)源碼
          回復(fù) 【被刪】學(xué)個(gè)
          回復(fù) 【訪客】學(xué)
          回復(fù) 【小程序】學(xué)獲取15套【入門(mén)+實(shí)戰(zhàn)+賺錢】小程序源碼
          回復(fù) 【python】學(xué)微獲取全套0基礎(chǔ)Python知識(shí)手冊(cè)
          回復(fù) 【2019】獲取2019 .NET 開(kāi)發(fā)者峰會(huì)資料PPT
          回復(fù) 【加群】加入dotnet微信交流群


          Vip電影在線無(wú)限制觀看,這種網(wǎng)站99%的人不知道!


          谷歌靈魂插件,98%的程序員都好評(píng)!


          瀏覽 219
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人草人人摸人人干 | 日日夜夜久久视频久久视频 | 亚洲大几吧色色91视频 | 好看的印度三色电费 | 一区二区红桃视频 日本 |