windows下VS開發必須掌握的幾種調試技術

來源:互聯網
上載者:User

標籤:win32編程   代碼調試   vs調試   

       代碼調試是非常重要的,有時候開發的時間並不長,但是大部分時間都消耗在了調試代碼上, 而且我們尋找bug的時候,不懂得調試根本就是不可能的任務。下面介紹幾種最基本的調試方法,雖然基本,但是絕對可以涵蓋絕大部分的開發情況。再往進階的話,那可能就是windebug這樣專業的調試工具了。當然,寫這篇文章的原因,是我在之前尋找這方面資料的時候,很多人的文章都是copy,而且方法都是打斷點,這對工作中的開發簡直就是廢話。還有一種就是windebug。如果能介紹些實用的也就罷了。大篇幅的介紹windebug裡面的命令,也沒有什麼實戰的項目,沒有真正有用的東西,所以,我把自己目前掌握的一點“公開的秘密”寫出來,希望幫到大家。互連網的精神,就是共用啊!

**************************************************************************************

1>不用說,最常用的方法就是打斷點,然後單步調試檢查一下你的值是否正常,值正常說明前面運行是沒有問題的,那就繼續往下走,這樣你的範圍越來越小,能夠精確定位事故處。打斷點很方便,在代碼的最前面點一下就有一個,再一下就消失了。下面是一些快捷命令,前三個是我常用的,後面的目前都沒用過。

F5:調試狀態運行程式,程式執行到有斷點的地方會停下來

F10:逐步執行程式

F11和F10:的區別是,如果當前執行語句是函數調用,則會進入函數裡面

F9:在當前游標所在的行下斷點,如果當前行已經有斷點,則取消斷點

Ctrl+Shift+F9:取消所有斷點
CTRL+F10:運行到游標所在行
SHIFT+F11:跳出當前所在函數

到這裡可能很多人就奇怪了,將這個似乎沒啥用啊?這裡我想說的是一個小技巧。就是VS編譯器會對我們的代碼進行最佳化,當你寫好代碼後編譯後,調試的時候有時候會發現有些值不正常(理論上肯定是正常的),或者明明是走到這裡,結果斷點跑到了別的地方。這種情況是因為VS對代碼進行了最佳化,比如你int a = 1;但是之後a這個值可能之後都沒有使用,那麼你調試的時候可能就走不到這個地方或者a的值顯示異常。這對我們調試代碼很不方便。所以,我們用斷點調試的時候,如果發現不準確,就先關閉掉VS最佳化,等調試結束後,再恢複即可。關閉最佳化的地方在。右鍵工程屬性->C/C++->Optimization,這裡有兩處,一處是Optimization選擇Disabled,還有就是Favor Size Or Speed選擇Neither。這樣再去調試代碼就方便多了。

*********************************************************************************

2>考慮這樣一種情況。你打包好一個程式給測試,然後出問題了。這時候你也不清楚問題出在哪裡?如果讓你在編譯器裡調試原始碼,根本沒有思路,這時候最好的方式當然是調試打包好的程式啊。這個時候可以用VS的Attach to Process附到這個進程上,這有個前提,就是這個exe必須是你現在的代碼編譯出來而且沒有修改過的,這樣才能Attach成功,否則是無法捕獲到的,原因是pdb不同,這個自行查資料。這個例子可以舉的不是很好,因為我們完全可以再編譯器裡調試,例子有點牽強。好,現在看這樣一個例子。如果你的程式用到了很多dll(自己工程編譯出來的dll),然後你某個dll有問題,你只需要修改了這個dll,修改好以後,你想看下修改的是否正確。但是需要重新將整個程式打包出來,這個過程耗時而且繁瑣,如果修改不正確就得繼續來過。那有沒有辦法利用現在的程式調試呢?答案是有的,你可以將這個修改好的dll替換之前打包好的程式裡的dll,這樣運行這個程式,然後在該dll代碼裡的相應地方打上斷點,Attach就可以進行調試了。這樣省時省力。這個技術的啟動並執行關鍵是,調試的程式或者dll必須和你工程裡的是一致的,如果你在編譯後修改過原始碼,那就無法attch成功了。

*****************************************************************************************

3>現在在考慮上面的一種變異情況。如果你的某些操作很快,也就是等你利用VS的Attach to Process附到這個進程上時,也許你想調試的功能早就過去了,或者進程都已經結束了。那麼能不能在程式一啟動並執行時候就能立刻Attach上去呢?其實方法還是很多的。對於VS的話,可以通過設定一個註冊表鍵值,這個小技巧在《Windows核心編程》裡就講到過,在HKLM-software-microsoft-windows NT-currentversion-image file execution下建立一個項,項的名字就是你程式的名字,包含.exe,這個項裡面建立一個REG_SZ類型,名字為debugger,鍵值是vsjitdebugger,也就是VS just in time debugger的意思。這樣,程式一啟動並執行時候,就會彈出一個VS框提示你要附到哪個VS編譯器上面。然後就可以愉快的調試代碼了。剛才說有很多方式,當使用windebug調試的時候,也有類似的功能,原理都是差不多的。

*****************************************************************************************

4>當我們調試指令碼的時候,似乎沒什麼方法去調試,只能通過指令碼的資訊輸出來進行判斷,其實方法還是有的。比如我們想調試指令碼裡調用某個dll的時候,我們必須要調用之前就Attach上去,不然就沒辦法調試了。怎麼辦呢?我們可以在指令碼調用dll之前,寫個彈出對話方塊的語句進去,這樣執行到這裡,程式就會停下來,這時候我們Attach上去,然後關閉掉對話方塊,就能愉快的調試代碼了。

*****************************************************************************************

上面就是我目前掌握的一些調試技巧了,但是大部分代碼通過這幾步都是沒問題的。如果你要調試的是一個沒有原始碼的程式,那就得用windebug這樣強大的工具了,當然,我目前是不會的。以後有好的調試方式會繼續放上來的。


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

windows下VS開發必須掌握的幾種調試技術

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.