1. 程式人生 > >windows下VS開發必須掌握的幾種除錯技術

windows下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這樣強大的工具了,當然,我目前是不會的。以後有好的除錯方式會繼續放上來的。