1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 4257字,需瀏覽 9分鐘

         ·

        2022-02-20 09:53



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

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

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

        1、運行到光標位置

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

        55e3a93c4d941bfb7d940e05935dba57.webpCtrl+F10運行到光標位置

        2、通過點擊鼠標,運行到當前位置

        在調(diào)試運行的程序時,通過鼠標懸停在當前行的代碼上時,出現(xiàn)綠色的符號,可以點擊此符號,直接讓斷點運行到此處。f9fcb6cd4bf53f0ee9411c4d439e2125.webp

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

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

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

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

        下面的動畫說明了這個功能,只有當obj2.Prop發(fā)生變化時,命中斷點,而obj1.Prop發(fā)生變化時沒有命中斷點。

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

        0455a329486bc8e96dd535ee5d9d7b2c.webp數(shù)據(jù)斷點:值更改時中斷

        5、條件斷點

        可以將條件附加到斷點中,以便盡在特定場景中觸發(fā)中斷。在下面的動圖中,我們在循環(huán)中定義條件i>6的斷點。然后點擊繼續(xù),可以看到一旦斷點停止,i的值實際上變成了7。

        a16401885939a8a5de5dfaae05a389b0.webp

        6、跟蹤斷點

        在遇到斷點時,停止程序執(zhí)行時最常見的操作。但是,你可以選擇在輸出窗口中不終止(或帶終止)打印一些跟蹤信息。下面的動圖說明了這種可能性。我們在輸出窗口中跟蹤i從0到9的值。注意:跟蹤斷點在編輯器的斷點顯示位置顯示為菱形形狀。

        注意,條件和跟蹤操作都可以在斷點上指定。a16401885939a8a5de5dfaae05a389b0.webp

        7、跟蹤超出作用域的對象

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

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

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

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

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

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

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

        41eb0f64eda7b439728400db4cfb4383.webp查看函數(shù)返回的值

        9、重新附加到進程

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

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

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

        10、在即時窗口和在觀察窗口的No-Side-Effect評估

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

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

        8d95d2f4a580ad74cef9e18862fc749a.webp在即時窗口和在觀察窗口的No-Side-Effect評估

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

        decb9848a1afa4c9a0bc4ad4f43d2acb.webp

        11、在源碼中顯示線程

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

        更多調(diào)試多線程應(yīng)用程序的技巧可以在這個微軟文檔中找到: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

        下面是這個演示的源代碼,如果你想演示它,可以進行參考:

        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)常依賴一些黑盒組件:我們沒有源代碼的組件。

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

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

        IL代碼反編譯為源代碼不可能是完美的,因為一些源代碼信息在編譯時丟失了。因此,這個特性有一些限制,在這個官方文檔的最后會解釋:Generate source code from .NET assemblies while debugging

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

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

        結(jié)尾

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







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


        9b766995b26f687dd8c7edfd3efe8b6f.webp

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


        367d79bfeb59994cd9558230379e9646.webp

        谷歌靈魂插件,98%的程序員都好評!


        瀏覽 174
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            午夜无码日日操天天干 | 在线免费观看黄片视频 | 免费毛片一区二区三区亚女同 | 黄色小说观看 | 久久99精品久久久久久园产越南 | 韩国一级婬片A片AA片口技 | 91啦丨九色丨国产人 | 成人无码A级毛片免费播放 | 亚洲高清无码免费观看 | 国产在aj精品 |