1. 程式人生 > >如何在Visual C++下除錯執行C程式

如何在Visual C++下除錯執行C程式

  本文轉載自網際網路,如有侵權,請聯絡我及時刪除。謝謝。

  從2008年4月開始,全國計算機等級考試將全面停止Turbo C2.0(簡稱TC)軟體的使用,所有參加二級C語言、三級資訊科技、網路技術和資料庫技術上機考試的考生,都要在Visual C++6.0(簡稱VC)環境下除錯執行C程式。眾所周知,VC軟體主要是用來開發C++程式的,如何在VC下除錯執行C程式,對於眾多程式設計者來說,確實是一個新的話題。
VC與TC的差異,主要是體現在程式設計語言C++與C的關係上。其實,瞭解計算機程式設計的人都知道,C++是C語言的升級板,VC是在Windows進行C++程式設計的主要軟體,VC完全相容了C的功能,也就是說,在VC下是完全能夠進行C語言程式開發。

一、在VC下執行一個C程式

1.啟動VC

  啟動VC的前提是首先要安裝VC軟體。如果你的系統安裝了VC軟體,當你啟動了Windows系統之後,從“開始”選單進入“所有程式”子選單,找到Microsoft Visual C++ 6.0並單擊它即進入VC軟體的主視窗,如圖1所示:

微型編譯條工具欄


這裡寫圖片描述
圖1


這裡寫圖片描述
圖2

2.編輯程式

  若要在VC視窗下進行C程式的編輯,首先,單擊工具欄的New Text File按鈕,生成一個新的文字檔案視窗,如圖2所示;接著,單擊Save按鈕,啟用“儲存為”對話方塊,在指定的資料夾下,輸入當前程式的檔名(注意:檔名必須給出.C的副檔名),再按“儲存”按鈕。到此為止,在指定的目錄下,就生成了一個由讀者自己命名的C檔案(比如C001.C),接下來,就可以進入編輯螢幕輸入你的C源程式了。

  由於當前的檔案是C源程式檔案,在其中輸入的任何內容(如:關鍵字、使用者識別符號及各種運算子),VC系統都會按C源程式的格式進行編排、組織。比如:在檔案中,當你輸入了一個C關鍵字時,VC系統自動將其設定為藍色字型以示區別;在編輯過程中,如果你輸入了一個塊結構語句(如:for(i=0;i<10;i++)、if(s!=’\0’)、while(k<5)),按回車後,VC系統會把游標定位在該塊語句起始位置開始的下一行的每五個字元位置上,以表示下面輸入的內容是屬於該塊語句的,以體現C源程式的縮排式書寫格式;此時,如果輸入一個左花括號“{”並回車,VC系統將把該花括號左移到與上一行塊語句起始位置對齊的位置上;接著,再按下回車鍵,VC系統會自動採用縮排格式,將當前游標位置定位在此花括號的下一行的第五列上;如果上一行語句與下一行語句同屬於一個程式段(比如:同一個複合語句中的語句),VC系統會自動將這兩個程式行的起始位置對齊排列;……更詳細的內容請讀者自行上機實習,並認真體會其中的輸入技巧。

3.編譯程式

  程式編輯完後,即可對源程式進行編譯處理。按“編譯微型條”(圖2所示)的Compile(功能鍵是Ctrl+F7)按鈕,對程式進行編譯,這時,螢幕上出現如圖3所示的對話方塊,讓建立一個預設的工程工作區,選“是”按鈕確認;緊接著,又出現如圖4所示的對話方塊,問是否要儲存當前的C檔案,回答“是”;然後,系統開始編譯當前程式。如果程式正確,即程式中不存在語法錯誤,則VC視窗的輸出如圖5所示的結果。


這裡寫圖片描述
圖3


這裡寫圖片描述
圖4


這裡寫圖片描述
圖5

輸出視窗

  如果程式中存在語法錯誤,則在VC的輸出視窗顯示如圖6所示的錯誤資訊。這些資訊告訴我們:在編譯C001.C的程式時出現錯誤;錯誤行是第7行;錯誤原因是識別符號printf前面丟了分號“;”。按照錯誤提示修改程式,再一次按Ctrl+F7進行編譯,直到不存在語法為止。

4.執行程式

  當程式編譯提示無錯誤資訊(0 error(s))後,按下微型編譯條工具欄上的“建立執行程式”(BuildExecute)按鈕 ,或相應的功能鍵Ctrl+F5,程式開始執行,然後顯示程式的輸出結果如圖7所示。輸出結果的螢幕將等待使用者按下任意鍵後,才返回編輯狀態,一個C程式的執行過程結束。


這裡寫圖片描述
圖6


這裡寫圖片描述
圖7

二、在VC下除錯C程式的方法

1.VC除錯功能簡介

  當一個C源程式編輯完成之後,你可以用上節講的方法進行編譯、執行。如果程式無編譯錯誤,但無執行結果,或執行結果有誤時,你就需要呼叫VC的編譯除錯工具來除錯你的程式,以便找出出錯的原因,從而達到正確的執行結果。

  VC為除錯C程式提供了多種工具和多組方法,常用的方法有選單法、工具欄法和功能鍵法。實際上,這三種方法是相似或相同的,只是根據使用者的熟悉程度和習慣用法選擇其中之一,來完成你的除錯過程。作者習慣使用功能鍵法,因為使用功能鍵既方便操作,又能節省除錯程式的時間,使除錯過程在較短的時間內完成。下面結合除錯工具來介紹以上立法。

  在VC視窗下的選單欄和工具欄的空白處,點右鍵啟用快捷選單,選擇“編譯”選單項,這時VC視窗就出現了除錯工具欄,如圖8所示。


這裡寫圖片描述
圖8

  除錯工具欄中的工具可分為兩部分:控制程式執行工具和設定觀察視窗工具。

① 對於控制程式執行工具,從左到右的常用按鈕、功能鍵及功能說明依次是:

  ●Restart 重新執行程式,功能鍵是 Ctrl+Shift+F5。無論C源程式處於任何狀態(編輯、執行、除錯),按下此按鈕均可使程式從編譯開始,逐步進入除錯程式狀態。

  ●Stop Debugging 停止程式除錯,功能鍵是Shift+F5。當除錯過程處於跟蹤程式執行的狀態時,按下此按鈕,將停止除錯程式,返回編輯狀態。編輯狀態下此按鈕無效。

  ● Show Next Statement 指示當前程式執行的語句行。

  ● Step Into 單步執行並且可進入函式內部執行,功能鍵是F11。程式在除錯過程中,按下此按鈕可單步跟蹤程式執行,與Stp Over按鈕不同的是,該功能可進入函式內部,繼續函式內部的語句行跟蹤。

  注意:使用此按鈕時,當 位於有庫函式呼叫的語句行,不用F11功能,以免進入庫函式的彙編程式塊中,取而代的是F10功能鍵。

  ● Step Over 單步執行程式,功能鍵是F10。本按鈕的功能類似於F11,但它不進入函式內部,它將每一條語句看作一步,包括函式呼叫語句。

  ●Step Out 從當前函式中退出,功能鍵是Shift+F11。當程式執行至某個函式內部時,按下此按鈕後,除錯狀態即從函式內部退出,返回到呼叫該函式的主函式的當前語句。

  ●Run to Cursor 執行到當前游標位置,功能鍵是Ctrl+F10。當程式處於除錯狀態時,為了跳過某程式段,可預先將游標定位在某語句行上,按下此按鈕,即可使程式直接執行到當前游標位置,從而節省了時間,加快了除錯程式的步驟。

  ② 對於設定觀察視窗工具,其功能主要是為配合程式跟蹤執行,設定一些觀察點,以便定位出錯的位置,從而找到出錯的原因。

  ● QuickWatch 快速觀察表示式的值,功能鍵是Shift+F9。當程式執行到某個關鍵語句行時,你可以按下該按鈕,即在螢幕上顯示如圖9所示的“QuickWatch”視窗,其中:E表示式下拉列表框中的a,是由使用者輸入的當前源程式中的一個數組名;V 當前值列表中的“Name”和“Value”列的值就是a陣列中所有元素的元素名和元素值。


這裡寫圖片描述
圖9

  ●Watch 設定觀察點。當用戶按下該按鈕,螢幕顯示如圖10所示觀察視窗,其中的“Name”列和“Value”列為空。這時,使用者可以在Name列中輸入使用者待觀察的觀察點,即程式中某個變數的名字,然後回車,在Value列就顯示出該變數的當前值。觀察點可以設定多個,多個觀察點還可以分別放在不同的觀察標籤內(Watch1、Watch2…)。


這裡寫圖片描述
圖10

  ● Variables 變數列表,當按下此按鈕,螢幕顯示如圖11所示的變數列表視窗。視窗中的“Name”列和“Value”列中列出了當前函式中的所有變數名和相應的值,其中:簡單變數只顯示變數名和它的值;陣列名前面有一個“ ”符號,Value列顯示它的地址值。


這裡寫圖片描述
圖11

  ●Registers 暫存器列表,按下此按鈕,螢幕上顯示如圖12所示的暫存器視窗,視窗中列出了所有暫存器的內容。


這裡寫圖片描述
圖12

  ●Memory 記憶體列表,按下此按鈕,螢幕上顯示如圖13所示的記憶體列表視窗,其中“A地址”文字框中顯示的是記憶體的當前地址值,下面的列表框中顯示的是從指定地址開始的所有記憶體區域的值,??表示其值不確定(沒有賦確定的值)。使用者可以在程式執行時,在“Watch”視窗中找到某個變數的地址或陣列名的值(陣列名本身是一個地址量),然後,將該值輸出“A地址”的文字框中,在記憶體列表區立即就能看到它的儲存值,不過該值是一個十六進位制的數,並且,一個整型數佔據四個位元組的儲存區域。詳細內容可參考下面的例子。


這裡寫圖片描述
圖13

2.使用VC除錯C程式的方法

  以下程式是全國計算機等級考試二級C語言的一道上機改錯題,請考生除錯該程式,使其能按要求輸出正確的結果。

① 程式功能說明

  給定程式C003.C中函式fun的功能是:從s所指字串中,找出t所指子串的個數作為函式值返回。

  例如,當s所指字串中的內容為:”abcdabfab”,t所指字串的內容為:”ab”,則函式返回整數3。

  請改正程式中的錯誤,使它能得出正確的結果。

  注意: 不要改動main函式, 不得增行或刪行, 也不得更改程式的結構!

② 源程式

#define    N     80

int  fun(char  *s,  char  *t)

{
   int  n=0;   char  *p , *r;
   while ( *s )
   {
      p=s;
      r=p;
      while(*r)
        if(*r==*p)
        {
           r++;
           p++;
        }
        else  break;
        if(*r = O)
             n++;
         s++;
      }
   return  n;
}
main()
{
     char  a[N],b[N];    int   m;
     printf("Enter string a : ");
     gets(a);
     printf("Enter substring b : ");
     gets( b );
     m=fun(a, b);
     printf(" The result is : m=%d ",m);
}

③ 除錯過程

  a) 啟動VC系統,編輯輸出源程式,並以c003.c命名,結果如圖14所示。


這裡寫圖片描述
圖14

  b) 按功能鍵Ctrl+F11編譯源程式,編譯顯示結果如圖15所示。


這裡寫圖片描述
圖15

  編譯結果告訴我們,程式中存在一個錯誤,兩個警告。其中:警告的原因都是因為系統函式沒有包含標頭檔案stdio.h,錯誤的原因是第16行的識別符號(identifierf)’O’沒有定義。需要說明的是,這裡的錯誤很特別:從程式字面上看,這裡的O好象是數字0,而一般考生也分辨不出或不會認為是O。但是,既然編譯系統給出錯誤資訊,就應該根據該錯誤資訊來修改程式。在源程式前面增加一行檔案包含命令“#include ”,再把字母O改寫成字元0(這是缺乏程式設計經驗的考生的共同作法),再一次編譯程式,結果告訴我們程式編譯成功。

  然後,按Ctrl+F5功能鍵,執行程式,在提示輸入的螢幕上輸入題目要求的兩個字串,螢幕顯示如圖16所示,結果再一次告訴考生:程式結果有錯,即程式中存在邏輯錯誤。


這裡寫圖片描述
圖16

  c) 接下來,我們對程式作運一步除錯,以找出程式出錯的真正原因。

  除錯一個存在邏輯錯誤的程式,首先要確定程式中可能出現錯誤的大概位置。根據題意說明可確定錯誤存在於函式fun中。根據這一判斷,我們先將游標定位在fun函式的第一條可執行的語句行上,然後,按下功能鍵Ctrl+F10,讓程式執行到游標位置。注意:這個過程中間要進入輸入螢幕狀態,等待輸入a和b字串,請考生按要求輸入,用回車符確認。當看到工作列的VC圖示在閃爍,請將視窗切換到VC狀態,如圖17所示:


這裡寫圖片描述
圖17

  接下來,邊按功能鍵F10,邊觀察螢幕下方變數(Variables)子視窗中p字串和r字串的變化,同時還要注意VC視窗左邊的黃色指點針箭頭。一直重複以上過程,你會發現,黃色箭頭始終沒有指向“n++;”語句。我們要找的第一個邏輯錯誤點就是if語句後面的表示式。按照正常的情況,if後面的表示式應該是關係表示式或邏輯表示式,而這裡的表示式是賦值表示式,正確的語句應該是:

        if(*r == 0)
                  n++;

  修改之後再按Ctrl+F5執行程式,程式結果如圖18所示。

  為了利用VC的除錯功能和手段,更好地觀察其它相關變數的變化規律,在上述過程中,還可以在VC的觀察(Watch)視窗輸入其它變數,在跟蹤程式執行過程中觀察其變化。


這裡寫圖片描述
圖18

  這種結果也不對,這是第一次錯誤結果的另一個極端:從m=0變到m=10。

  如何查詢其中的原因?不仿再回顧一下剛才在跟蹤程式執行時,變數(Variables)視窗中的p和r字串的值的變化情況,再結合程式中r字串的作用,不難看出,p和r應該是不同的字串,且p字串是指向s字串,而r字串則應該指向t字串。正確的結果應該是:將語句“r=p;”改成“r=t;”。

  至此,一個存在錯誤的C程式的除錯過程結束,執行該程式,即可得到正確的執行結果。需要說明的是,以上除錯的程式只是一個簡單的例子,其中用到的除錯方法也是經常使用的方法之一,若要真正掌握在VC下除錯C程式的方法和步驟,需要讀者進行大量的上機實踐和練習。

轉載地址:http://blog.163.com/shi_shun/blog/static/237078492009219104529817/