在第一篇中,我們?yōu)榇蠹医榻B了如何用VC6進(jìn)行斷點(diǎn)調(diào)試,可以實(shí)現(xiàn)程序的分步執(zhí)行。今天我們將繼續(xù)深入,進(jìn)行更多斷點(diǎn)調(diào)試的學(xué)習(xí)。
首先,寫一個(gè)例子程序:
#include int fun() { printf("Welcome to C language Reserch Center\n"); return 0; } int main() { int i=0; int sum=0; fun(); while(i++<100) { sum+=i; } printf("1+2+3+...+99+100 = %d\n",sum); return 0; }
大家可以先行閱讀以下程序,比較簡(jiǎn)單,調(diào)用一個(gè)自定義函數(shù)輸出一句話,其二,計(jì)算1+2一直加到100的和并輸出。
然后,我們做練習(xí),運(yùn)用上節(jié)課的斷點(diǎn)調(diào)試逐步跟我們這個(gè)程序。
首先,我們?cè)诘谝恍衖nt i=0;這里設(shè)置一個(gè)斷點(diǎn),運(yùn)行它,如圖:
注意看到,黑框里什么都沒有輸出,并且下方的變量監(jiān)視里i的值還是垃圾值,因?yàn)檫€未執(zhí)行這句話。
然后我們F10下一步執(zhí)行。但當(dāng)大家執(zhí)行到fun();函數(shù)調(diào)用這條語句時(shí),編譯器把它當(dāng)成一句話來執(zhí)行,并未進(jìn)入函數(shù)內(nèi)部,而是一步帶過,如圖:
大家可自行上機(jī)實(shí)驗(yàn),可以發(fā)現(xiàn)F10單步執(zhí)行的單步是以一條C語言語句為單位的。鑒于這種情況,當(dāng)我們懷疑fun函數(shù)時(shí)如何調(diào)試呢?
除了可以在fun函數(shù)內(nèi)部設(shè)置斷點(diǎn)以外,我們還有一個(gè)辦法,就是不按F10,而按F11,F(xiàn)11的意思是單步執(zhí)行并介入,也就是說遇到單出的一句話就和F10沒什么區(qū)別了,但如果是函數(shù)調(diào)用這種還能“進(jìn)入”的語句,它就會(huì)逐層深入進(jìn)去!大家能理解嗎?
那我們來試一試,重新開始,回到程序一開始的斷點(diǎn)處,在黃色箭頭指向到fun()時(shí),按F11,大家注意觀察!
黃色的箭頭會(huì)進(jìn)入fun函數(shù)內(nèi)部,如圖:
然后可以逐步跟蹤fun函數(shù)內(nèi)部的語句了! 怎么樣?試試吧
當(dāng)然,這里提示一下,對(duì)于我們想深入研究的函數(shù)我們可以F11介入一探究竟,但如果一直F11的話可能會(huì)一直深入程序底層可能按不出來哦!另外,對(duì)于printf這種庫函數(shù),如果還按F11的話,由于printf已經(jīng)編譯好,只能看到printf的匯編語句。所以大家還是根據(jù)情況按F10還是F11哦!
由于大家在實(shí)際的開發(fā)工作當(dāng)中,程序往往比我們的例子程序復(fù)雜很多,比如多個(gè)函數(shù)、嵌套、庫函數(shù)調(diào)用等等,也有誤進(jìn)入函數(shù)內(nèi)部,或者已經(jīng)排查沒有問題的,如果想盡早結(jié)束此函數(shù)退出回到上一層調(diào)用處,如何實(shí)現(xiàn)呢?答案是:按shift+F11,既可以跳出函數(shù),返回到當(dāng)前斷點(diǎn)函數(shù)調(diào)用的下一步。
好的,講到這里,大家請(qǐng)自行實(shí)驗(yàn),熟練掌握F10和F11以及shift+F11的混合使用!
請(qǐng)大家親自上機(jī)實(shí)驗(yàn)!
以上