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

作者: masefee  來源: CSDN  發布時間: 2010-11-02 15:26  閱讀: 946 次  推薦: 3   原文鏈接   [收藏]  
摘要:探討的是VC自帶的強大調試器

  通過前面兩篇,相信大家已經基本了解了我們的研究思路。既然是研究,那么必須的研究工具就得熟練掌握了。這里我所指的研究工具就是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.可以根據出錯結果的現象或信息,針對性的下斷。技巧要總結。

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

3
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()