<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        分享Visual Studio原生開發的10個調試技巧

        來源:懂視網 責編:小采 時間:2020-11-27 22:40:44
        文檔

        分享Visual Studio原生開發的10個調試技巧

        分享Visual Studio原生開發的10個調試技巧:最近碰巧讀了Ivan Shcherbakov寫的一篇文章,《11個強大的Visual Studio調試小技巧》。這篇文章只介紹了一些有關Visual Studio的基本調試技巧,但是還有其他一些同樣有用的技巧。我整理了一些Visual Studio(至少在VS 2008下)原生開發的調試技巧
        推薦度:
        導讀分享Visual Studio原生開發的10個調試技巧:最近碰巧讀了Ivan Shcherbakov寫的一篇文章,《11個強大的Visual Studio調試小技巧》。這篇文章只介紹了一些有關Visual Studio的基本調試技巧,但是還有其他一些同樣有用的技巧。我整理了一些Visual Studio(至少在VS 2008下)原生開發的調試技巧

        最近碰巧讀了Ivan Shcherbakov寫的一篇文章,《11個強大的Visual Studio調試小技巧》。這篇文章只介紹了一些有關Visual Studio的基本調試技巧,但是還有其他一些同樣有用的技巧。我整理了一些Visual Studio(至少在VS 2008下)原生開發的調試技巧。(如果你是工作在托管代碼下,調試器會有更多的特性,在CodeProject中有介紹它們的文章),下面是我的整理的一些技巧:

        異常中斷 | Break on Exception
        Watch窗口中的偽變量 | Pseudo-variables in Watch Windows
        符號越界后查看堆對象 |
        查看數組的值
        避免進入不必要的函數
        從代碼啟動調試器 | Launch the debugger from code
        在Output窗口打印
        隔離內存泄漏
        調試發行版 | Debug the Release Build
        遠程調試


        技巧1: 異常中斷

        在處理被調用之前,異常發生時可以 啟動調試器進行中斷,可以讓你在異常發生后立即調試程序。操作調用棧便于你去查找異常發生的根本原因。

        Vistual Studio允許你去指定想要中斷的異常類型或者特殊異常。選擇菜單Debug>Exceptions彈出對話框,你可以指定原生的(或者托管的)異常,除了調試器自帶的一些默認異常,你還可以添加自己的自定義異常。

        下面是一個std::exception 異常拋出時調試器中斷的例子。

        更多閱讀:

      1. 1.  異常拋出時如何中斷
      2. 2.  如何添加新的異常
      3. 技巧2:Watch窗口中的偽變量

        Watch窗口或QuickWatch對話框提供一些特定的(調試器可識別的)變量,被稱為偽變量。文檔包含以下:

        $tid—–當前線程的線程ID
        $pid——進程ID
        $cmdline———-啟動程序的命令行字符串
        $user———-正在運行程序的賬戶信息
        $registername—–顯示寄存器registername 的內容
        不管怎么樣,關于最后一個錯誤的偽變量是非常有用的:

        $err——–顯示最后一個錯誤的錯誤碼
        $err,hr—顯示最后一個錯誤的錯誤信息

        更多閱讀:偽變量

        技巧3:符合越界后查看堆對象

        有時候,在調試符號越界后,你還想查看對象的值,這個時候,watch窗口中的變量是被禁用的,不能再查看(也不能更新),盡管對象仍然存在。你如果知道對象的地址,可以繼續充分地觀察它。你可以將地址轉換為該對象類型的指針,放在watch窗中。

        下面的例子中,當單步跳出do_foo()之后,_foo不能再被訪問。但是,將它的地址轉換為foo*后,就可以繼續觀察這個對象。

        技巧4:查看數組的值

        如果你在操作一個很大的數組(我們假設至少有幾百個元素吧,但是可能更少),在Watch窗口中展開數組,查找一些特定范圍內的元素很麻煩,因為你要不停地滾動.如果數組是分配在堆上的話,你甚至不能在watch窗口中展開數組元素.對此,有一個解決辦法。你可以使用(array+ <offset>),<count> 去查看從<offset>位置開始的特定范圍的<count>元素(當然,這兒的數組是你的實際對象)。如果想查看整個數組,可以簡單使用array,<count>.

        如果你的數組是在堆上,你可以在watch窗口中將它展開,但是要查看某個特定范圍的值,用法稍有不同:((T*) array + <offset>),<count>(注意這種用法對于堆上的多維數組也有效)。但是這種情況下,T是指數組元素的類型。

        如果你在用MFC,并使用其中的'array'容器,像 CArray, CDWordArray,CStringArray等等。你當然可以使用同樣的過濾方法。除此之外,你必須查看array的m_pData成員,它是保存數據的真實緩存。

        技巧5:避免進入不必要的函數

        很多時候,你在調試代碼時可能會進入到你想跳過的函數,像構造函數,賦值操作或者其他的。其中最困擾我的是CString構造函數。下面是一個例子,當你準備單步執行take_a_string()函數時,首先進入到CString的構造函數。

        void take_a_string(CString const &text){}void test_string(){ take_a_string(_T("sample"));}

        幸運的是可以告訴調試器去跳過哪些方法,類或者整個命名空間。實現它的方法也已經改變了,回到使用VS6的日子,通常是通過autoexp.dat文件來指定的。Vistual Studio 2002改成了使用注冊表設置。想要跳過一些函數,你需要在注冊表里添加一些值(詳情如下):

          實際位置取決于你使用的Vistual Studio版本和操作系統平臺(x86或x64,因為注冊表只能在64位的Windows下瀏覽)值的名字是數字,代表規則的優先級;數字越大,優先級越高。值數據是一個正則表達式的REG_SZ值,用于指定怎樣過濾和執行。

        為了避免進入任何CString方法,我添加了下面的規則:

        有了這個,即使你強制進入上例中的take_a_string(),調試器也會跳過CString的構造函數。

        更多閱讀:

      4.  使用Visual C++調試器怎樣避免進入函數
      5. 使用AutoExp.dat調整調試器
      6. 技巧6:從代碼啟動調試器 Launch the debugger from code

        你可能很少需要將調試器附加到程序中,但你不能在Attach窗口這樣做(可能因為中斷發生太快而沒有捕獲到),你也不能一開始就在調試器中啟動程序。你可以在程序中產生中斷給調試器一個機會通過調用內部的_degbugbreak()來附加。

        代碼如下:
        void break_for_debugging() {
        __debugbreak();
        }

        實際上還有其他的方法來完成,例如觸發中斷3,但這僅僅適用于x86平臺(C++64位不再支持ASM)。另外還有DebugBreak()函數,但它的使用不怎么簡便,所以這里推薦使用內部方法。

        代碼如下:

        __asm int 3; 

           程序運行內部方法時會停止運行,這時你就有機會將調試器附加到該進程。

        更多閱讀:

      7.  內部方法_debugbreak
      8. 任何時候都離不開設置斷點和斷言
      9. Visual Studio 20005/2008的調試,第四部分:為調試器設置代碼
      10. 技巧7:在output窗口打印

        通過調用DebugOutputString可以在調試器的output窗口顯示一段特定的文本。如果沒有附加的調試器,該函數什么也不做。

        更多閱讀:

      11. 函數OutputDebugString
      12. 函數OutputDebugString的調用機制
      13. 技巧8:隔離內存泄漏

        內存泄漏是在原生開發中的一個很重要的問題,要檢測內存泄漏是一個很嚴峻的挑戰,尤其是在大型項目中。Vistual Studio可以提供檢測內存泄漏的報告,還有其他的一些應用程序(免費的或商業的)也可以幫助你檢測內存泄漏.有些情況下,在一些內存分配最終會導致泄漏時,可以使用調試器去中斷。但是你必須找到可再現的分配編號(盡管沒那么容易)。如果能做到這一點,執行程序時調試器才會中斷。

        我們來看下面的代碼,分配了8個字節,卻一直沒釋放分配的內存。Visual Studio提供了造成內存泄漏的對象的報告,多運行幾次,會發現一直是同一個分配編號(341)。

        代碼如下:


        void leak_some_memory()
        {
        char* buffer = new char[8];
        }
        Dumping objects ->
        d:\marius\vc++\debuggingdemos\debuggingdemos.cpp(103) : {341} normal block at 0x00F71F38, 8 bytes long.
        Data: < > CD CD CD CD CD CD CD CD

        在一個特定的(可復現的)位置中斷的步驟如下:

        確定你有足夠的關于內存泄漏的報告模式(參考 使用CRT庫檢測內存泄漏)
        多次運行程序直到你能在程序運行結束后的內存泄漏報告里找到一個可復現的分配編號,例如上個例子中的(341)
        在程序一開始的地方設置一個斷點以便你能夠盡早地進行中斷。
        當最初的中斷發生時,watch窗口的Name欄里會顯示:{,,msvcr90d.dll}_crtBreakAlloc,在Value欄里寫入你想要查找的位置編號
        繼續調試(F5)
        程序執行到指定位置會停止,你可以使用調用棧被指引找到被該位置觸發的那段代碼。
        遵循這些步驟, 在上個例子中,使用分配的編號(341)就可以識別內存泄漏的起因。

        技巧9:調試發行版

        調試和發布是兩個不同的目的。調試配置是用于開發的,而發布配置,顧名思義,是用來作為程序的最終版本,因為它必須嚴格遵循發布的質量要求,該配置包含優化部分和調試版本的中斷調試的設置。而且,有時候,要像調試調試版本一樣去調試發行版。要做到這一點,你需要在配置里做一些改變。但是這種情況下,你就不再是在調試發行版,而是調試和發行的混合版。

        你還應該做一些事兒,以下是必須要做的:

        配置C/C++ >General>Debug Information Format 應該為 “Program Database(/Zi)”
        配置C/C++ >Optimization>Optimization 應該為”Disabld(/Od)”
        配置Linker>Debugging>Generate Debug Info 應該為”Yes/(DEBUG)”
        如圖所示:

        更多閱讀:怎樣調試發行版

        技巧10:遠程調試

        另一個重要的調試就是遠程調試,這是一個更大的話題,多次被提到,這里我只做一下簡單的概括:

        你需要在遠程機器上安裝遠程調試監控
        遠程調試監控必須以管理員身份運行,并且用戶必須屬于管理員組
        在你運行監控時,會開啟一個新的服務,該服務的名字必須用Visual Studio的Attach to Progress窗口的Qualifier組合框的值。

        1. 遠程和本地機器上的防火墻必須允許Visual Studio和遠程調試監控之間能夠通信
        2. 想要調試,PDB文件是關鍵;為了能夠讓VisualStudio自動加載它們,必須滿足以下條件:

        1)本地的PDB文件必須可用(在遠程機器的相同路徑下放置一個對應的模塊)。

         2) 遠程機器上的托管PDB文化必須可用。

        遠程調試監控下載:

      14.  Visual Studio 2008 Service Pack 1 Remote Debugger
      15. Microsoft Visual Studio 2010 Remote Debugger
      16. 更多閱讀:

      17. 設置遠程調試
      18. 怎么運行遠程調試監控
      19. 遠程調試時加載調試符號:本地對托管
      20. PDB文件:開發者須知
      21. Visual Studio遠程調試和PDB文件
      22. 怎樣指定符號位置和加載行為
      23. 結束語

        Ivan Shcherbakov那篇文章和我這篇文章提到的調試技巧,在大多數的調試問題中都是必不可少的。想要知道更多的關于調試技巧的知識,建議閱讀文章中提供的額外閱讀。

        原文鏈接: Marius Bancila   翻譯: 伯樂在線 - 伯樂在線讀者
        譯文鏈接: http://blog.jobbole.com/45249/

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        分享Visual Studio原生開發的10個調試技巧

        分享Visual Studio原生開發的10個調試技巧:最近碰巧讀了Ivan Shcherbakov寫的一篇文章,《11個強大的Visual Studio調試小技巧》。這篇文章只介紹了一些有關Visual Studio的基本調試技巧,但是還有其他一些同樣有用的技巧。我整理了一些Visual Studio(至少在VS 2008下)原生開發的調試技巧
        推薦度:
        標簽: 分享 studio visual
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲午夜av影院| 国产成人精品久久亚洲高清不卡 | 亚洲日韩中文字幕在线播放| 老司机免费午夜精品视频| 韩国18福利视频免费观看| 亚洲色最新高清av网站| 成人免费无码大片a毛片软件| 亚洲精品亚洲人成在线播放| 一个人免费观看在线视频www| 亚洲六月丁香婷婷综合| 日韩免费视频在线观看| 男女交性无遮挡免费视频| 亚洲色婷婷综合开心网| 国产在线国偷精品免费看| 亚洲av无码国产精品夜色午夜| 久久国产精品免费专区| 亚洲a视频在线观看| 国产又长又粗又爽免费视频| 51午夜精品免费视频| 亚洲日韩区在线电影| 最近中文字幕mv免费高清视频7| 亚洲AV无码一区二区乱子仑 | 精品久久久久久久免费人妻| 日韩色日韩视频亚洲网站 | 俄罗斯极品美女毛片免费播放| 又粗又长又爽又长黄免费视频 | 亚洲麻豆精品果冻传媒| 最近中文字幕mv免费高清视频7| 国产精品亚洲精品日韩动图 | 国产男女猛烈无遮挡免费网站| eeuss免费天堂影院| 亚洲欧洲精品久久| 国产成人免费网站在线观看| 中文字幕免费在线视频| 91亚洲国产成人久久精品| 人人狠狠综合久久亚洲高清| 久久99热精品免费观看动漫| 亚洲精品无AMM毛片| 亚洲国产另类久久久精品黑人| 美女裸身网站免费看免费网站| 美女免费视频一区二区|