国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Visual Studio原生開發的10個調試技巧(一)

2019-11-17 03:05:37
字體:
來源:轉載
供稿:網友
Visual Studio原生開發的10個調試技巧(一)

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

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

  技巧1: 異常中斷

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

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

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

  更多閱讀:

  • 1.異常拋出時如何中斷
  • 2.如何添加新的異常

  技巧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改成了使用注冊表設置。想要跳過一些函數,你需要在注冊表里添加一些值(詳情如下):

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

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

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

  更多閱讀:

  • 使用Visual C++調試器怎樣避免進入函數
  • 使用AutoExp.dat調整調試器

  技巧6:從代碼啟動調試器Launch the debugger from code

  你可能很少需要將調試器附加

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 甘洛县| 久治县| 乐都县| 班戈县| 阿合奇县| 波密县| 德安县| 溆浦县| 揭西县| 芷江| 巴林右旗| 商丘市| 富平县| 奉化市| 林周县| 太白县| 昆明市| 巴青县| 望奎县| 星座| 南部县| 明水县| 鄄城县| 武清区| 修水县| 永嘉县| 辽阳县| 章丘市| 宁远县| 噶尔县| 松溪县| 瑞金市| 平泉县| 阿拉尔市| 龙泉市| 工布江达县| 延边| 乌鲁木齐市| 阿巴嘎旗| 富阳市| 蒙山县|