日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

继续分享 5 个实用的 vs 调试技巧

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 继续分享 5 个实用的 vs 调试技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

我在上一篇文章????《5 個非常實用的 vs 調試技巧》 中分享了 5 個我認為非常值得了解的 vs 調試技巧,本周繼續分享 5 個很基礎但同樣實用的調試技巧。

1. 條件斷點

作用簡介:

顧名思義,帶條件的斷點。滿足條件才中斷。條件斷點非常非常有用,使用得當,可以極大縮短我們調試問題的時間。比如,有一個大循環,只在第 1024 次循環的時候有問題,我們如果單步(在 vs 中可以按 F10),恐怕手得按殘了。又比如,我們想在特定條件下中斷。這時候條件斷點就是我們的救星。

2. 內存斷點

作用簡介:

顧名思義,針對內存設置的斷點。對于調試邏輯復(hun)雜(luan)的程序,非常非常有用。比如,有一個全局變量的值,在代碼中有 N 個地方會改動它,在調試程序的時候,不知道這個全局變量在哪里被改變了,如果能在改動的那一刻中斷下來該有多好啊!這可是內存斷點的專長!

打開方式:

調試的時候,通過 調試 -> 窗口 -> 斷點 即可打開斷點窗口。在 vs2013 中對應的快捷鍵是 ctrl + alt + b 。打開后可以 通過 新建 -> 新建數據訪問斷點(D)... 創建一個數據訪問斷點。

注意:

  • 只有在程序中斷到調試器的時候才允許新建數據訪問斷點。

  • 輸入的是內存地址,可以直接輸入地址值,也可以通過 & 獲取地址。

  • vs 好像只支持指定的內存范圍的值發生變化時才中斷。windbg 中的 ba 命令更強大,感興趣的小伙伴兒可以查看 windbg 的幫助文檔。

  • 3. 異常開關

    作用簡介:

    異常最多分發兩輪,每輪都會優先分發給調試器。如果調試器沒處理,會繼續分發給異常處理函數。具體的分發過程可以參考《軟件調試》。

    比如,在下面的示例代碼中。我在 ExceptionDemo() 中加上了 try {} catch {} ?來捕獲一些異常。在 FunctionE() 中的某一行設置好斷點,如果一切正常是可以斷下來的。但是在 FunctionD() 中有可能拋出異常,如果根據設置,vs 不處理這個異常,該異常會被 ExceptionDemo() 處理,還沒運行到設置斷點的地方就被異常改變了執行流程。

    #include?"stdafx.h" #include?<exception>bool?application_quit?=?false; int?g_runningLoop?=?0;void?FunctionA(); void?FunctionB(); void?FunctionC(); void?FunctionD(); void?FunctionE();void?ExceptionDemo() {try{while?(!application_quit){FunctionA();}}catch?(std::exception){} }void?FunctionA()?{?FunctionB();?} void?FunctionB()?{?FunctionC();?} void?FunctionC()?{?FunctionD();?} void?FunctionD() {if?(++g_runningLoop?>?6){throw?std::exception("too?many?loops!");}FunctionE(); }void?FunctionE() {if?(g_runningLoop?>?10){application_quit?=?true;} }

    p.s.?雖然在代碼中增加?try {} catch {}?有助于提高程序的健壯性,但有時候可能不利于我們發現問題,有些問題可能就被“默默”吞掉了。

    打開方式:

    調試的時候,通過 調試 -> 異常(X)... 即可打開異常設置對話框。在 vs2013 中對應的快捷鍵是 Ctrl + Alt + E。

    注意:只有在調試的時候才能設置,不調試的時候是看不到異常設置菜單的。

    4. 調試時修改值

    作用簡介:

    假設我們正在調試如下代碼,跟蹤到了 if (bRich) 這一行,期待的 bRich 的值是 true,而實際值是 false。我們可以手動修改 bRich 的值為 true 來強行進入 if 分支,而不是 else 分支。(BTW,改完就真的有錢了么?)

    #include?"stdafx.h" #include?<iostream>bool?HaveIMakeEnoughMoney() {return?false; }void?ManualModifyValueDemo() {auto?bRich?=?HaveIMakeEnoughMoney();if?(bRich){std::cout?<<?"Finally,?I'm?rich!"?<<?std::endl;}else{std::cout?<<?"Oops,?I'm?still?poor!"?<<?std::endl;}}

    小貼士:不僅可以通過懸浮窗口改變變量的值,我們還可以通過監視窗口,內存窗口等其它方式改變變量的值。

    5. 拖動到指定位置執行

    作用簡介:

    相信,大家都有過手滑的情況,本來想的是單步步入(在 vs 中按 F11)特定函數,沒想到卻按成了 F10,華麗麗的錯過了想調試的函數,這時候我們可以拖回來。又或者如上面的代碼,當執行到第24行的時候,發現 totalMoney 的值不是我們想要的,我們想重新回到前面跟蹤一下totalMoney 的值是怎么來的,而我們又不想重新走一遍整個流程(因為可能很慢)。這時候我們可以手動拖動黃色小箭頭到第 22 行。

    注意:

    拖動功能是通過設置 eip(rip) 的值來實現的,拖動需謹慎,有些情況下可能導致程序崩潰!

    測試工程下載地址

    百度云盤?鏈接: https://pan.baidu.com/s/1MSjUNPF-JHoY1t3l1xXFeg 提取碼: jew2

    CSDN:https://download.csdn.net/download/xiaoyanilw/12640122

    總結

    本次介紹的 5 個調試技巧雖然都很基礎,但是卻非常實用,而且使用頻率比較高。不知道你是否有所收獲呢?

    參考資料

    《軟件調試》

    歡迎留言交流!

    感謝你的贊和在看

    總結

    以上是生活随笔為你收集整理的继续分享 5 个实用的 vs 调试技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。