在第一篇中,我們?yōu)榇蠹医榻B了如何用VC6進(jìn)行斷點(diǎn)調(diào)試,可以實(shí)現(xiàn)程序的分步執(zhí)行。今天我們將繼續(xù)深入,進(jìn)行更多斷點(diǎn)調(diào)試的學(xué)習(xí)。
首先,寫(xiě)一個(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)行它,如圖:
注意看到,黑框里什么都沒(méi)有輸出,并且下方的變量監(jiān)視里i的值還是垃圾值,因?yàn)檫€未執(zhí)行這句話。
然后我們F10下一步執(zhí)行。但當(dāng)大家執(zhí)行到fun();函數(shù)調(diào)用這條語(yǔ)句時(shí),編譯器把它當(dāng)成一句話來(lái)執(zhí)行,并未進(jìn)入函數(shù)內(nèi)部,而是一步帶過(guò),如圖:
大家可自行上機(jī)實(shí)驗(yàn),可以發(fā)現(xiàn)F10單步執(zhí)行的單步是以一條C語(yǔ)言語(yǔ)句為單位的。鑒于這種情況,當(dāng)我們懷疑fun函數(shù)時(shí)如何調(diào)試呢?
除了可以在fun函數(shù)內(nèi)部設(shè)置斷點(diǎn)以外,我們還有一個(gè)辦法,就是不按F10,而按F11,F(xiàn)11的意思是單步執(zhí)行并介入,也就是說(shuō)遇到單出的一句話就和F10沒(méi)什么區(qū)別了,但如果是函數(shù)調(diào)用這種還能“進(jìn)入”的語(yǔ)句,它就會(huì)逐層深入進(jìn)去!大家能理解嗎?
那我們來(lái)試一試,重新開(kāi)始,回到程序一開(kāi)始的斷點(diǎn)處,在黃色箭頭指向到fun()時(shí),按F11,大家注意觀察!
黃色的箭頭會(huì)進(jìn)入fun函數(shù)內(nèi)部,如圖:
然后可以逐步跟蹤fun函數(shù)內(nèi)部的語(yǔ)句了! 怎么樣?試試吧
當(dāng)然,這里提示一下,對(duì)于我們想深入研究的函數(shù)我們可以F11介入一探究竟,但如果一直F11的話可能會(huì)一直深入程序底層可能按不出來(lái)哦!另外,對(duì)于printf這種庫(kù)函數(shù),如果還按F11的話,由于printf已經(jīng)編譯好,只能看到printf的匯編語(yǔ)句。所以大家還是根據(jù)情況按F10還是F11哦!
由于大家在實(shí)際的開(kāi)發(fā)工作當(dāng)中,程序往往比我們的例子程序復(fù)雜很多,比如多個(gè)函數(shù)、嵌套、庫(kù)函數(shù)調(diào)用等等,也有誤進(jìn)入函數(shù)內(nèi)部,或者已經(jīng)排查沒(méi)有問(wèn)題的,如果想盡早結(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)!
以上
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫(xiě)的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫(xiě)出一個(gè)爬蟲(chóng)的Python編程課程
只會(huì)語(yǔ)法寫(xiě)不出代碼?手把手帶你寫(xiě)100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門(mén)課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程