【C/C++語言入門篇】-- 調試基礎

通過前面兩篇,相信大家已經基本瞭解了我們的研究思路。既然是研究,那麼必須的研究工具就得熟練掌握了。這裏我所指的研究工具就是VC,我所使用的VC版本是2005。本文也將根據VC2005進行探討。可能很多朋友或者初學者還是使用的VC6.0。在這裏本人不推薦使用VC6.0。原因很簡單,VC6.0已經過時了,後面的版本比VC6.0更強大方便。可能也是因爲衆多經典的程序設計書籍使用的都是VC6.0。有的朋友可能不是很清楚VC6.0和VS系列到底有什麼關係,那麼簡單的說,VS系列就是集成VC功能等諸多比如C# 、VB、 .NET等語言爲一體的強大IDE環境。我們當然毫不猶豫的選擇強大。好了,切入正題!

 

今天我們探討的是VC自帶的強大調試器,在衆多調試器中,VC的調試器也是相當成熟的調試器之一了。我們程序員絕對離不開他。在我們初寫程序的時候,好不容易寫完了並編譯通過了上百行代碼的一個程序,激動難以言表只是按下F5運行,結果得不到我們的想要的結果。激動欣喜頓時變成沮喪苦惱。我該怎麼辦?怎麼才能排查我哪裏錯了呢?一行一行看代碼?這時就需要用到調試器了。下面我們先列舉幾條,方便理清思路也方便大家總結歸納。

1. 簡單斷點。

2. 單步調試(步入,步過)。

3. 監視窗口。

4. 內存窗口。

5. 堆棧窗口。

6. 斷點窗口。

7. 局部變量窗口。

 

暫時列舉上面幾條,更多比如數據斷點,寄存器窗口等其它調試方法及窗口再後面有時間我們再一一介紹。那下面我們就一一介紹上面的7點。

 

簡單斷點  通俗的講斷點(這裏只是簡單的F9斷點及雙擊某行下斷)就是能夠讓程序運行到斷點位置時能夠停下來,至於爲什麼能夠停下來這個我們就先別管了。只需要知道斷點就是爲了程序運行到斷點的時候停下來,這時方便我們觀察一些數據。檢查正確性。打斷點可以將光標定位到某行,然後按下F9便設置了斷點。同樣可以在某行的最前面邊框上雙擊打下斷點。斷點打下後,在此行最前面會有一個紅色的圓點。如圖:

 

單步調試 這條是比較基本的,所謂單步,就是一步一步的走,一步執行一條語句。當然如果你把多條語句寫到一行或者用宏定義。那麼這樣將對你單步調試帶來困擾。這樣你非得要看具體過程可以試試反彙編跟蹤。啓動單步調試可以是F10。如果用F10你可以不下斷點,程序會自動在main函數入口處斷下來。斷下來後,我們就有兩種選擇了。一、繼續F10就是一次一條語句。如果碰到函數調用,並不會單步進入函數中斷。直接執行完整個函數後斷在函數調用的下一條語句。因此稱爲步過。二、F11進行單步調試,此種方式與F10不同在於碰到函數調用會進入函數中斷。此方法適合步步跟蹤。因此稱爲步入。這裏需要說明的是,這兩種方式一般是結合着使用。提示:我們在單步的同時,比如要觀察某個變量的值,可以將鼠標指向此變量。編譯器會自動顯示當前變量的值。同時在單步的過程中執行到某行時,前面會有個黃色的箭頭。很清晰明瞭。如圖:

這裏的count很清晰的可以看到值。只需要指向它。這裏顯示的10進制,我們也可以顯示16進制。可以點擊:

 

 

就會顯示0x?????字樣了。

 

監視窗口 這是一個非常重要的窗口,所謂監視就是偷窺某個變量的值、函數返回值、計算一些表達式等。監視窗口也有4個,一般我們初學者只需用1個,啓動監視1可以用ALT + 3快捷鍵。

問題一:其它監視窗口的快捷鍵是什麼?

同樣是上面圖中的程序,我們要監視count變量的值。如圖:

 

這裏的名稱可以直接輸入,也可以直接選中count變量,然後左鍵拖動到監視窗口裏。就可以顯示變量的當前值了。要顯示十六進制也可以在點擊前面說的“十六進制”按鈕。也可以右鍵監視窗口選擇十六進制顯示。是不是很直觀呢。同樣也可以看count變量的地址喲。這裏的地址也就是在內存裏面存放的地址,如圖:

 

unsigned int* pCount = &count; pCount指針的值也就是這個地址。從上面的監視窗口裏,大家應該可以感受到VS的強大了吧。提示:雙擊監視窗口裏面的各個“名稱”或“值”可以改變這些值的喲。這裏再提一個問題:

問題二:怎麼只觀察name變量的某一個元素的值?儘量寫出多種方式。

 

內存窗口 這是一個比較重要的窗口,我們以前很疑惑某個數據或者字符串在內存中是怎麼存儲的,今天我們就可以通過內存窗口進行觀察。內存窗口就是顯示的數據在進程內存中具體的存儲位置及方式。啓動內存窗口在斷點斷下來後可以用快捷鍵:CTRL+ALT+M+(1,2,3,4)因爲一共有4個內存窗口,方便我們多用。也可以在調試斷點斷下來的時候點擊菜單欄的調試--->窗口---->內存---->內存1,2,3,4來啓動。內存窗口經常結合者監視窗口一起用。爲什麼,先如圖:

上面我在地址後面的編輯框裏面輸入的是count的地址。看監視窗口的&count或者pCount後面的值就是0x0012ff5c。所以這裏也說明這兩個是等同的。我們驚喜的發現選中的地方跟0x80000000很像那呢?內存窗口裏面可以右鍵選擇1字節整數,2字節整數,4字節整數等。我這裏選擇的是1字節整數。就是一個字節一個字節的顯示。這裏如果是四字節整數的話就是:

 

哈哈,是不是神奇的發現4字節結合在一起就是0x80000000。那

問題三:爲什麼上面的內存窗口的00在前面而80在後面呢?(提示,0x80000000爲8個字符寬式因爲00表示一個字節,總共4字節)

這裏假如要在內存窗口裏面查看pCount所指向的內存的值,就可以直接選中pCount指針變量,然後左鍵拖入內存窗口的地址編輯框(注意,這裏不能直接把count變量給拖下來,這樣拖下來的話編輯框裏就是count的值0x80000000,看的就是這個地址下面的值了,至於拖pCount能行,很明顯是因爲他是指針,它的值就是count變量的地址)。也就能查看count變量所存儲的位置及值了。其他更巧妙的用法大家自己摸索,熟悉了就能總結出用法了。提示:光標定位到某個地址的內存,可以修改這個內存的值喲。只讀或保護內存除外。

 

堆棧窗口 此窗口就是方便我們看函數調用的。可以使用 ALT+7啓動顯示出來。當然也是在調試斷下來後可以使用。當我們的函數調用一層又一層比如遞歸等,或者有虛函數時等堆棧窗口可以直接看整個調用流程,排錯起來就方便多了。如圖:

 

 代碼依然斷在監視窗口的那段代碼截圖那裏,上面的堆棧窗口能夠清晰的看到調用層次。當前是在main函數裏面,通過箭頭可以看出來。這裏也可以看出來main函數之前還有函數調用main函數。是不是有清晰了一大步?我們可以雙擊某一行查看調用的地方的代碼。我點擊> TestC.exe!__tmainCRTStartup()  行597 + 0x19 字節 這行後如圖:

 

嘿嘿,很清晰的看到在這裏調用的吧~~。好累,喝口水。繼續。

 

斷點窗口 此窗口用於顯示當前你打下的所有斷點,我們可以雙擊某一行定位到斷點的位置。我們想要不刪除這個斷點而只需要暫時不起作用就可以去掉前面選擇框裏面的勾。啓動此窗口可以使用ALT + F9快捷鍵。如圖:

 

局部變量窗口 此窗口用於顯示當前斷下來後函數內所有局部變量的值,跟監視窗口類似。不過固定爲局部變量的值。不能編輯。啓動此窗口可以使用ALT + 4快捷鍵。

 

到這裏就基本介紹完了,還有更多高級調試不便在本文講述,以後我們在探討。在這裏我們需要記得幾點:

1. 這些窗口在調試過程中都是結合者使用的。

2. 調試的時候需要有耐心,多思考什麼地方最容易出錯,針對性的檢查排除。有時候需要寫一些測試代碼方便跟蹤調試。

3. 可以根據出錯結果的現象或信息,針對性的下斷。技巧要總結。

 

好了。終於大功告成了。有什麼地方有錯誤還望大家提出來,希望本文對一些朋友有幫助。大牛略過!

 

【C/C++入門篇系列】

【C/C++語言入門篇】-- 序言

【C/C++語言入門篇】-- HelloWorld思考

【C/C++語言入門篇】-- 基本數據類型

【C/C++語言入門篇】-- 調試基礎

【C/C++語言入門篇】-- 深入指針

【C/C++語言入門篇】-- 數組與指針

【C/C++語言入門篇】-- 結構體

【C/C++語言入門篇】-- 深入函數

【C/C++語言入門篇】-- 位運算

【C/C++語言入門篇】-- 剖析浮點數

【C/C++語言入門篇】-- 文件操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章