本文以Microsoft Visual Studio為例,簡述C/C++程序斷點調(diào)試的基本方法和過程。其它的IDE環(huán)境,大同小異。
目前創(chuàng)新互聯(lián)已為上千余家的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)站空間、網(wǎng)站托管維護、企業(yè)網(wǎng)站設計、永城網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。1. 簡介本文引用自作者編寫的下述圖書; 本文允許以個人學習、教學等目的引用、講授或轉(zhuǎn)載,但需要注明原作者"海洋餅干叔
叔";本文不允許以紙質(zhì)及電子出版為目的進行抄摘或改編。
1.《Python編程基礎及應用》,陳波,劉慧君,高等教育出版社。免費授課視頻 Python編程基礎及應用
2.《Python編程基礎及應用實驗教程》, 陳波,熊心志,張全和,劉慧君,趙恒軍,高等教育出版社Python編程基礎及應用實驗教程
3. 《簡明C及C++語言教程》,陳波,待出版書稿。免費授課視頻
在程序有BUG/缺陷,需要修復時,斷點調(diào)試是發(fā)現(xiàn)缺陷的重要方法。對于初學者而言,斷點調(diào)試還有另外一個用途:幫助理解程序背后的邏輯。
本文以Microsoft Visual Studio為例,簡述C/C++程序斷點調(diào)試的基本方法和過程。其它的IDE環(huán)境,大同小異。
在進行后續(xù)調(diào)試試驗前,需要先對Microsoft Visual Studio的C/C++編譯開發(fā)環(huán)境進行安裝和配置。詳細過程請參見下述鏈接:http://codelearn.club/2022/11/vs/
2. 程序代碼在Microsoft Visual Studio中創(chuàng)建一個Windows控制臺應用項目,項目名稱為DebugExample,然后將DebugExample.cpp中代碼修改如下(復制粘接):
//Project - DebugExample
#include#includebool isPrime(int n) { //函數(shù)的定義
if (n<=1)
return false;
for (int i=2;iprintf("Try to find all prime number(<=10):\n");
int iFound = 0; //發(fā)現(xiàn)的質(zhì)數(shù)個數(shù)
for (int i=2;
i<=10;
i++)
{if (!isPrime(i))
continue;
iFound++;
printf("%d, ",i);
}
printf("\n%d prime numbers been found.",iFound);
return 0;
}
上述程序的用途在于找出2 ~ 10之間的全部質(zhì)數(shù)并打印出來。請讀者注意第19 ~ 21行,for循環(huán)的初始化語句,測試表達式,更新表達式故意分作了三行,以便于觀察。
在第18行代碼的行號左邊單擊鼠標,便會出現(xiàn)如圖所示的紅色斷點(break point),在相同位置再次單擊,斷點便會消失??梢越o同一段程序添加多個斷點。
在打好斷點后,選擇菜單調(diào)試-開始調(diào)試。
與正常的程序運行不動,程序并沒有“一口氣”從頭執(zhí)行到尾,而是暫停在了第18行的斷點處。圖中的黃色箭頭表明程序的當前執(zhí)行點,準確地說,箭頭所指的行是接下來準備執(zhí)行的代碼行。
在窗口的左下角,自動窗口中可以看到程序在當前執(zhí)行階段的局部變量的名稱及當前值??梢钥吹?,此時有iFound變量存在,其值為0。
注意:此時iFound的0值是不確定的,事實上,0到iFound的賦值尚未執(zhí)行。
在調(diào)試菜單中,可以看到諸多調(diào)試選項,其中常用的有:逐語句,逐過程,跳出。在調(diào)試過程中,讀者既可以使用菜單項,也可以使用快捷鍵,或者工具條中的工具按鈕來發(fā)出調(diào)試命令。
點擊逐語句(F11),可以看到第18行被執(zhí)行,黃色箭頭指向第19行。此時,for循環(huán)內(nèi)的局部變量i出現(xiàn)在下方列表中。請讀者注意此時i的當前值為690,而不是2,因為for循環(huán)的初始化語句尚未執(zhí)行。
注意:在變量沒有被初始化前,其值是不確定的,所以讀者真實調(diào)試時,得到的值很可能不是690。
再次點擊逐語句(F11),第19行被執(zhí)行,可見變量列表中的i值變成了2。黃色箭頭來到了第20行,這是for循環(huán)的條件判斷表達式。
繼續(xù)按下F11,for循環(huán)在進行了條件判斷后,準備執(zhí)行循環(huán)體,黃色箭頭來到第23行。
第23行涉及一次函數(shù)調(diào)用,如果操作者希望觀察isPrime( )函數(shù)內(nèi)部的執(zhí)行過程,應按F11。如果操作者不關(guān)心isPrime( )內(nèi)部的執(zhí)行過程,只關(guān)心23行的總體執(zhí)行結(jié)果,則按逐過程(F10)。本次,我們按逐語句(F11)。
連按兩次F11后,我們進入到了isPrime( )函數(shù)內(nèi)部,黃色箭頭指向第6行。對于isPrime( )函數(shù)而言,當前其局部變量僅有1個,即函數(shù)的形式參數(shù)n。該參數(shù)的值應由調(diào)用者傳遞進來。在下方的列表中,我們看到該值為2。
一直按F11,直到isPrime()返回,由于2是質(zhì)數(shù),所以isPrime()函數(shù)返回真(見下方列表)。
再次按下F11, 由于第23行不是質(zhì)數(shù)的條件不成立,第24行不會被執(zhí)行,黃色箭頭略過了第24行,指向了第25行。
再次按下F11,黃色箭頭來到第26行,可見由于第25的執(zhí)行,iFound由0變1。
一直按**逐過程(F10)**進行循環(huán),直到i = 4且黃色箭頭指向第23行。
本次我們選擇不進入isPrime()函數(shù),再次按下逐過程(F10)。由于i=4不是質(zhì)數(shù),因此第23行的條件成立,黃色箭頭跳轉(zhuǎn)到第24行的continue語句。
根據(jù)continue的語義,其將略過本輪循環(huán)的剩余語句(第25 ~ 26行),直接嘗試下一輪循環(huán)。
按下逐語句(F11),可以看到,continue直接略過了第25 ~ 26行的剩余循環(huán)代碼,直接跳到了for循環(huán)的更新表達式,如圖中紅色箭頭所示。
再次按下F11,可見for循環(huán)在更新表達式執(zhí)行后再次來到了循環(huán)測試表達式(第20行),如果測試通過,將執(zhí)行循環(huán)體,否則循環(huán)結(jié)束。
在程序調(diào)試過程中,可以隨時通過Alt+Tab組合鍵或者點擊Windows任務欄圖標切換至TERMINAL(終端),該終端中展示了程序當前執(zhí)行階段的全部輸出。如果程序在執(zhí)行過程中需要讀取輸入,也應在其中錄入。
可以看到,2,3兩個質(zhì)數(shù)已被找出,4是合數(shù)被略過,正準備考察整數(shù)5。
6. 去除斷點如果調(diào)試的目的已達成,準備放棄調(diào)試,可以再次單擊紅色斷點將其取消,如下圖(第18行左側(cè)紅框處):
此時,可以選擇調(diào)試-繼續(xù)(F5),在沒有斷點的情況下將程序執(zhí)行完;也可以選停止調(diào)試,強行中止程序的執(zhí)行。
取消斷點后,我們選擇了繼續(xù)執(zhí)行。程序執(zhí)行完成后,IDE中與調(diào)試相關(guān)的箭頭,局部變量列表等均消失不見,恢復至常規(guī)編輯界面。
在終端里,我們看到程序的全部執(zhí)行結(jié)果。
為了幫助更多的年輕朋友們學好編程,作者在B站上開了兩門免費的網(wǎng)課,一門零基礎講Python,一門零基礎C和C++一起學,拿走不謝!
簡潔的C及C++
Python編程基礎及應用
如果你覺得紙質(zhì)書看起來更順手,目前Python有兩本,C和C++在出版過程中。
Python編程基礎及應用
Python編程基礎及應用實驗教程
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧