欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用VC6.0對(duì)C語言程序進(jìn)行調(diào)試的基本手段分享

 更新時(shí)間:2013年07月20日 23:13:25   作者:  
這篇文章主要介紹了用VC6.0開發(fā)c語言程序的時(shí)候調(diào)試代碼的一些小技巧,需要的朋友可以參考下

(1)設(shè)置固定斷點(diǎn)或臨時(shí)斷點(diǎn)

所謂斷點(diǎn),是指定程序中的某一行,讓程序運(yùn)行至該行后暫停運(yùn)行,使得程序員可以觀察分析程序的運(yùn)行過程中的情況。這些情況一般包括:

①在變量窗口(Varibles)中觀察程序中變量的當(dāng)前值。程序員觀察這些值的目的是與預(yù)期值對(duì)比,若與預(yù)期值不一致,則此斷點(diǎn)前運(yùn)行的程序肯定在某個(gè)地方有問題,以此可縮小故障范圍。例如以下程序是計(jì)算cos(x)并顯示,運(yùn)行時(shí)發(fā)現(xiàn)無論x輸入為多少,結(jié)果都是0.046414。

復(fù)制代碼 代碼如下:

#include <stdio.h>
#include <math.h>

void main()
{
int  x;

printf("Please input x:");
scanf("% d", &x);
printf("cos(x)=%f\n", cos(x));
}

在該程序中,若你沒有看到問題——程序較長(zhǎng)、較復(fù)雜時(shí)很難看出問題所在,則應(yīng)該使用調(diào)試手段定位故障位置。

②在監(jiān)控窗口(Watch)中觀察指定變量或表達(dá)式的值。當(dāng)變量較多時(shí),使用Varibles窗口可能不太方便,使用Watch窗口則可以有目的、有計(jì)劃地觀察關(guān)鍵變量的變化。

③在輸出窗口中觀察程序當(dāng)前的輸出與預(yù)期是否一致。同樣地,若不一致,則此斷點(diǎn)前運(yùn)行的程序肯定在某個(gè)地方有問題。

④在內(nèi)存窗口(Memory)中觀察內(nèi)存中數(shù)據(jù)的變化。在該窗口中能直接查詢和修改任意地址的數(shù)據(jù)。對(duì)初學(xué)者來說,通過它能更深刻地理解各種變量、數(shù)組和結(jié)構(gòu)等是如何占用內(nèi)存的,以及數(shù)組越界的過程。

⑤在調(diào)用堆棧窗口(Call Stack)中觀察函數(shù)調(diào)用的嵌套情況。此窗口在函數(shù)調(diào)用關(guān)系比較復(fù)雜或遞歸調(diào)用的情況下,對(duì)分析故障很有幫助。

(2)單步執(zhí)行程序

讓程序被一步一步(行)地執(zhí)行,觀察分析執(zhí)行過程是否符合預(yù)要求。例如,以下程序預(yù)期的功能是從鍵盤上讀入兩個(gè)數(shù)(x和y),判斷x和y是否相等,相等則在屏幕上顯示x=y,不相等則顯示x<>y。這是要求實(shí)現(xiàn)的功能,但程序?qū)嶋H的運(yùn)行狀況卻是:無論輸入什么,都會(huì)在屏幕上顯示x=y和x<>y,程序肯定有問題,但表面上看卻可能找不到問題所在,使用單步執(zhí)行,則能定位故障點(diǎn),縮小看的范圍。例如,在單步執(zhí)行的過程中,若輸入“2,3”,發(fā)現(xiàn)x和y的值的確變成了2和3,此時(shí)按道理不應(yīng)執(zhí)行“printf("x=y\n");”,但單步跟蹤卻發(fā)現(xiàn)被執(zhí)行了,因此多半問題出在“if (x = y)”。

復(fù)制代碼 代碼如下:

#include <stdio.h>
void main()
{
int  x, y;

printf("Please input x, y:");
scanf("%d,%d", &x, &y);
if (x = y)
{
  printf("x=y\n");
}
else;
{
  printf("x<>y\n");
}
}

在單步執(zhí)行的過程中,應(yīng)靈活應(yīng)用Step Over、Step Into、Step Out、Run to Cursor等方法,提高調(diào)試效率。建議在程序調(diào)試過程中,記住并使用“Step Over、Step Into、Step Out、Run to Cursor”等菜單項(xiàng)的快捷鍵,開始時(shí)可能較生疏、操作較慢,但堅(jiān)持一段時(shí)間就能生巧、效率提高。

(3)使用斷言

斷言是對(duì)某種假設(shè)條件進(jìn)行檢查(可理解為若條件成立則無動(dòng)作,否則應(yīng)報(bào)告),它可以快速發(fā)現(xiàn)并定位軟件問題,同時(shí)對(duì)系統(tǒng)錯(cuò)誤進(jìn)行自動(dòng)報(bào)警。斷言可以對(duì)在系統(tǒng)中隱藏很深,用其它手段極難發(fā)現(xiàn)的問題進(jìn)行定位,從而縮短軟件問題定位時(shí)間,提高系統(tǒng)的可測(cè)性。實(shí)際應(yīng)用時(shí),可根據(jù)具體情況靈活地設(shè)計(jì)斷言。
使用斷言時(shí),必須在程序的開頭加上:

#include <assert.h>

①可用斷言來確認(rèn)函數(shù)的參數(shù)。示例:假設(shè)某函數(shù)參數(shù)中有一個(gè)指針,那么使用指針前可對(duì)它檢查,以防止其他人調(diào)用本函數(shù)時(shí)使用空指針作參數(shù)。代碼如下:

復(fù)制代碼 代碼如下:

int exam_fun( unsigned char *str )
{
    assert(str != NULL);  // 斷言“指針不為空”,若“空”(斷言不成立)則報(bào)錯(cuò)
    ... //other program code
}

②可用斷言來確認(rèn)是否發(fā)生了不該發(fā)生的情況。示例:以下程序段運(yùn)行結(jié)果有錯(cuò),檢查起來很困難而且搞了很久都不知是什么地方有問題。因此,建議分析程序的正常運(yùn)行情況應(yīng)該是什么,運(yùn)行過程中是否出了異常,針對(duì)所有(或關(guān)鍵狀態(tài))應(yīng)當(dāng)正常的情況,使用斷言,就很有可能發(fā)現(xiàn)異常原因,且調(diào)試效率很高。針對(duì)該程序段,我們斷言(斷定)變量i的取值應(yīng)該為“i>=0 && i<SIZE”且較關(guān)鍵,但在運(yùn)行過程中是否有可能被無意修改(例如其它變量越界)而超出范圍呢,就可使用斷言檢查是否發(fā)生了這樣的情況。

復(fù)制代碼 代碼如下:

for (i=0; i<SIZE; i++)
{
    ... //other program code
assert(i>=0 && i<SIZE);  // 斷言“i的正常取值范圍”,若斷言不成立則報(bào)錯(cuò)
array[i] = i;
    ... //other program code
}

斷言不成立時(shí)(一出現(xiàn)異常),系統(tǒng)將立即報(bào)錯(cuò),此時(shí)可進(jìn)入程序調(diào)試狀態(tài),檢查程序的運(yùn)行情況。

(4)與調(diào)試相關(guān)的操作菜單:Build菜單

Compile:快捷鍵Ctrl+F7。編譯當(dāng)前處于源代碼窗口中的源程序文件,以便檢查是否有語法錯(cuò)誤或警告,如果有的話,將顯示在Output輸出窗口中。
Build:快捷鍵F7。對(duì)當(dāng)前工程中的有關(guān)文件進(jìn)行連接,若出現(xiàn)錯(cuò)誤的話,也將顯示在Output輸出窗口中。
Execute:快捷鍵Ctrl+F5。運(yùn)行(執(zhí)行)已經(jīng)編譯、連接成功的可執(zhí)行程序(文件)。
Start Debug:選擇該項(xiàng)將彈出子菜單,其中含有用于啟動(dòng)調(diào)試器運(yùn)行的幾個(gè)選項(xiàng)。例如其中的Go選項(xiàng)用于從當(dāng)前語句開始執(zhí)行程序,直到遇到斷點(diǎn)或遇到程序結(jié)束;Step Into選項(xiàng)開始單步執(zhí)行程序,并在遇到函數(shù)調(diào)用時(shí)進(jìn)入函數(shù)內(nèi)部再?gòu)念^單步執(zhí)行;Run to Cursor選項(xiàng)使程序運(yùn)行到當(dāng)前鼠標(biāo)光標(biāo)所在行時(shí)暫停其執(zhí)行(注意,使用該選項(xiàng)前,要先將鼠標(biāo)光標(biāo)設(shè)置到某一個(gè)你希望暫停的程序行處)。執(zhí)行該菜單的選擇項(xiàng)后,就啟動(dòng)了調(diào)試器,此時(shí)菜單欄中將出現(xiàn)Debug菜單(而取代了Build菜單)。

(5)與調(diào)試相關(guān)的操作菜單:Debug菜單

啟動(dòng)調(diào)試器后才出現(xiàn)該Debug菜單(而不再出現(xiàn)Build菜單)。
Go:快捷鍵F5。從當(dāng)前語句啟動(dòng)繼續(xù)運(yùn)行程序,直到遇到斷點(diǎn)或遇到程序結(jié)束而停止(與Build→Start Debug→Go選項(xiàng)的功能相同)。
Restart:快捷鍵Ctrl+Shift+F5。重新從頭開始對(duì)程序進(jìn)行調(diào)試執(zhí)行(當(dāng)對(duì)程序做過某些修改后往往需要這樣做!)。選擇該項(xiàng)后,系統(tǒng)將重新裝載程序到內(nèi)存,并放棄所有變量的當(dāng)前值(而重新開始)。
Stop Debugging:快捷鍵Shift+F5。中斷當(dāng)前的調(diào)試過程并返回正常的編輯狀態(tài)(注意,系統(tǒng)將自動(dòng)關(guān)閉調(diào)試器,并重新使用Build菜單來取代Debug菜單)。
Step Into:快捷鍵F11。單步執(zhí)行程序,并在遇到函數(shù)調(diào)用語句時(shí),進(jìn)入那一函數(shù)內(nèi)部,并從頭單步執(zhí)行(與Build→Start Debug→Step Into選項(xiàng)的功能相同)。
Step Over:快捷鍵F10。單步執(zhí)行程序,但當(dāng)執(zhí)行到函數(shù)調(diào)用語句時(shí),不進(jìn)入那一函數(shù)內(nèi)部,而是一步直接執(zhí)行完該函數(shù)后,接著再執(zhí)行函數(shù)調(diào)用語句后面的語句。
Step Out:快捷鍵Shift+F11。與“Step Into”配合使用,當(dāng)執(zhí)行進(jìn)入到函數(shù)內(nèi)部,單步執(zhí)行若干步之后,若發(fā)現(xiàn)不再需要進(jìn)行單步調(diào)試的話,通過該選項(xiàng)可以從函數(shù)內(nèi)部返回(到函數(shù)調(diào)用語句的下一語句處停止)。

Run to Cursor:快捷鍵Ctrl+F10。使程序運(yùn)行到當(dāng)前鼠標(biāo)光標(biāo)所在行時(shí)暫停其執(zhí)行(注意,使用該選項(xiàng)前,要先將鼠標(biāo)光標(biāo)設(shè)置到某一個(gè)你希望暫停的程序行處)。事實(shí)上,相當(dāng)于設(shè)置了一個(gè)臨時(shí)斷點(diǎn),與Build→Start Debug→Run to Cursor選項(xiàng)的功能相同。

Insert/Remove Breakpoint:快捷鍵F9。本菜單項(xiàng)并未出現(xiàn)在Debug菜單上(在工具欄和程序文檔的上下文關(guān)聯(lián)菜單上),列在此處是為了方便大家掌握程序調(diào)試的手段,其功能是設(shè)置或取消固定斷點(diǎn)——程序行前有一個(gè)圓形的黑點(diǎn)標(biāo)志,表示已經(jīng)該行設(shè)置了固定斷點(diǎn)。另外,與固定斷點(diǎn)相關(guān)的還有Alt+F9(管理程序中的所有斷點(diǎn))、Ctrl+F9(禁用/使能當(dāng)前斷點(diǎn))。

相關(guān)文章

  • OpenCV實(shí)現(xiàn)圖像細(xì)化算法

    OpenCV實(shí)現(xiàn)圖像細(xì)化算法

    本文主要介紹了OpenCV實(shí)現(xiàn)圖像細(xì)化算法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C語言函數(shù)指針詳解

    C語言函數(shù)指針詳解

    本文主要介紹 C語言函數(shù)指針的知識(shí),這里整理了詳細(xì)的資料及示例代碼以便大家學(xué)習(xí)參考,有需要學(xué)習(xí)此部分知識(shí)的朋友可以參考下
    2021-09-09
  • QT編寫地圖實(shí)現(xiàn)獲取區(qū)域邊界

    QT編寫地圖實(shí)現(xiàn)獲取區(qū)域邊界

    區(qū)域邊界是一些坐標(biāo)點(diǎn)集合,而且不同的行政區(qū)劃得到的區(qū)域邊界點(diǎn)數(shù)組集合個(gè)數(shù)不同。本文將具體介紹QT在編寫地圖時(shí)如何實(shí)現(xiàn)獲取區(qū)域邊界,需要的可以參考一下
    2022-01-01
  • 在Visual Studio使用C++開發(fā)Metro應(yīng)用

    在Visual Studio使用C++開發(fā)Metro應(yīng)用

    這篇文章主要介紹了在Visual Studio使用C++開發(fā)Metro應(yīng)用的示例,盡管只是一個(gè)Hello world,但可以體現(xiàn)出VS下為開發(fā)者提供的方便,需要的朋友可以參考下
    2015-07-07
  • 教你用Matlab制作立體動(dòng)態(tài)相冊(cè)

    教你用Matlab制作立體動(dòng)態(tài)相冊(cè)

    沒想到吧,MATLAB竟也能制作3D相冊(cè)!本文將為大家詳細(xì)介紹Matlab制作立體動(dòng)態(tài)相冊(cè)的方法步驟,感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試
    2022-03-03
  • C語言廣播的使用詳解

    C語言廣播的使用詳解

    顧名思義可以把自己的數(shù)據(jù)發(fā)送給在特定范圍內(nèi)的所有人;我們網(wǎng)絡(luò)編程中的廣播一般是通過特定的廣播地址把自己的數(shù)據(jù)發(fā)送給局域網(wǎng)內(nèi)當(dāng)前在線的客戶端
    2022-05-05
  • 詳解C語言之緩沖區(qū)溢出

    詳解C語言之緩沖區(qū)溢出

    緩沖區(qū)是一塊連續(xù)的計(jì)算機(jī)內(nèi)存區(qū)域,可保存相同數(shù)據(jù)類型的多個(gè)實(shí)例。緩沖區(qū)可以是堆棧、堆和靜態(tài)數(shù)據(jù)區(qū)。在C/C++語言中,通常使用字符數(shù)組和malloc/new實(shí)現(xiàn)緩沖區(qū)。溢出指數(shù)據(jù)被添加到分配給該緩沖區(qū)的內(nèi)存塊之外。緩沖區(qū)溢出是最常見的程序缺陷
    2021-06-06
  • opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合

    opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合

    這篇文章主要為大家詳細(xì)介紹了opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言實(shí)現(xiàn)單詞小助手功能完善版

    C語言實(shí)現(xiàn)單詞小助手功能完善版

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)單詞小助手功能的完善版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 詳解C++11中的lambda匿名函數(shù)

    詳解C++11中的lambda匿名函數(shù)

    匿名函數(shù),簡(jiǎn)單地理解就是沒有名稱的函數(shù),又常被稱為 lambda 函數(shù)或者 lambda 表達(dá)式,這篇文章主要介紹了C++11中的lambda匿名函數(shù),需要的朋友可以參考下
    2022-11-11

最新評(píng)論