我曾經問過很多人,你一般是怎麼除錯你的程式的?
f9, f5, f11, f……
有很多書和文章都是介紹怎麼使用visual studio編寫winform啦,、asp.net之類的程式;知道如何編寫固然重要,但是我覺得程式設計師可能只會花費30%的時間在編寫**上,剩下的大部分時間都是在除錯程式。在網上看到很多人介紹windbg的用法,但是沒有看到幾篇講解使用visual studio除錯的文章。windbg固然強大,但是問題是它的學習曲線太陡了,而且很多除錯並不需要使用windbg來除錯(當然啦,並不是指我不會windbg除錯啦—這是以後的除錯系列文章將要講的),為什麼不使用我們最熟悉的visual studio來進行除錯呢?
除錯嘛,無非就是要看看程式在執行時候,內部的狀態,例如一些變數的值是多少,看一看程式呼叫的路徑啦之類的。當然最直接的方式就是直接中斷程式的執行,用偵錯程式去檢查一下程式的情況嘛。於是f9, f5, f10, f11……
那麼我們就來說說什麼是斷點,斷點是什麼?不是f9 ,也不是那個小紅球,在intel系列的cpu(包括amd生產的cpu)裡面,它其實是乙個特殊的指令—int 3。cpu在執行程式的指令集的時候,只要碰到這個指令,就會中斷程式的執行(當然啦,cpu會通知作業系統,然後……然後……然後……,斷點的實現機制我會在以後的文章裡面講解,現在我們就只要知道那個int 3指令會中斷程式的執行好嗎?)。
當然啦,我們需要用事實來證明我上面的話,因此把下面的程式編譯並且執行一下,點「yes」,點「break」,對對對,程式中斷了,我相信你可以看見的:
#include
void
main()
printf("before breakpoint"n"); }
編譯方法:
1.在開始選單中開啟visual studio 2008[2005] command prompt(visual studio 2008[2005]命令列)。
2.進入儲存上面 c源**(int3.c)的資料夾的路徑。
3.執行編譯命令(因為我的機器是windows 7 rc + visual studio 2008 + x64 cpu,直接編譯有一點問題,如果你的機器不是我上面的配置,可以嘗試執行cl /zi int3.c)
cl /zi /c int3.c
4.執行鏈結命令(如果你直接執行了命令cl /zi int3.c的話就可以跳過這一步)。
link /libpath:"c:"program files"microsoft sdks"windows"v6.0a"lib" int3.obj
5.執行輸出的int3.exe。
這時你應該會看到visual studio彈出來,然後在源**行的int 3上面中斷,說明我們已經成功地讓cpu中斷int3.exe程式
的執行了。
提示:如果你執行int3.exe的時候,沒有發現visual studio視窗彈出來的話,那麼visual studio選單項裡面的「tools(工具)」—「options(選項)」,接著在「options(選項)」視窗中選擇
「debugging(除錯)」—「just-in-time(即時除錯)」,然後勾選「native(原生程式)」選項。如下圖所示:
「綜上所述,斷點是int 3
這個指令觸發的!(小時候的數學證明題)」。
由int 3這個指令(當然是在intel系列的cpu上面)引申出來有哪些函式呢:
語言/工具
名稱 描述
c++debugbreak 在
c++**中硬編碼乙個斷點。 c#
debugger.break 在
.net
**中硬編碼乙個斷點
visual studio 斷點
設定乙個斷點
未完待續……
visual studio之遠端除錯
遠端除錯需要以下幾個步驟 1 在遠端裝置上安裝remote debugger,啟動,選擇tools options,設定為no authenication,勾選allow any user to debug,並將maximum idle time設為0 即可以一直閒置而不會自動退出程序 2 本地裝置...
Visual Studio除錯之符號檔案
前面在不能設定斷點的檢查步驟和visual studio除錯之斷點高階篇提到了除錯符號檔案及其作用,這篇文章我將要介紹除錯符號檔案的一些用法,如果你已經很熟悉除錯檔案的話,盡可以跳過本文。1.設定斷點,因為偵錯程式需要符號檔案提供的對映關係,將源 行的行號轉換成對應的機器 的位址。2.檢視程式堆疊,...
Visual Studio除錯之斷點技巧篇補遺
講完 visual studio除錯之斷點技巧篇 以後,翻翻以前看得一些資料和自己寫的一些文章,發現還有幾個關於中斷程式的技巧在前面的文章裡面遺漏了,決定還是在這裡總結一下。當然啦,如果你知道這些技巧,忽略這篇文章好了,可能有人會對這個問題有一些爭議,因為大部分情況下我們只需要在偵錯程式 debug...