1. 程式人生 > >VC++6.0除錯工具使用初步

VC++6.0除錯工具使用初步

【摘要】程式設計初者學會IDE(整合開發環境)中提供的除錯工具,是一件非常重要的事。本文在初學者有初步的程式設計體驗(只需要掌握到控制結構)為前提,介紹了單步執行、斷點設定及觀察程式執行情況的方法,並配有練習的建議,方便讀者的學習。


  在編寫程式中,尤其是完成一個工程的過程中,通過編譯的程式往往也會存在錯誤(bug)。這種錯誤是執行錯誤和邏輯錯誤,比語法錯誤更隱蔽,更危險。
  如何找出這些錯誤?在冗長的程式碼中,找出這些錯誤來並不總是一件容易的事。排錯(debug)是一件程式設計師不得不面對的麻煩事,但真正的程式設計師會把與bug戰鬥當成自己的神聖使命。
  除錯程式是程式設計師應該具備的基本能力。在學習編寫程式過程中,學會除錯程式是最實用的技能之一。可以純粹依靠人工,一行一行,或一塊一塊地檢查,思考,很累人。也可以像現有的各種教材及課堂教學中介紹的,輸出變數及中間變數(用輸出語句cout<<...;),以觀察執行結果及執行的中間結果。這種方法簡潔方便,但增加了寫程式碼的維護量,同時,有時並不能方便地找到問題所在。
  在實際的工作中,除錯工作常用IDE(整合開發環境,如VC++6.0)提供的工具進行。本文旨在指導同學們初步學會利用VC++6.0除錯程式的方法,學會單步執行程式和使用斷點的方法,並在過程中觀察執行環境(最重要的是變數)的變化,從而在今後能夠高效地完成程式的除錯。

  一、認識除錯功能

  在組建(build)選單中,點選開始除錯(start debug),在其下級子選單中,包含了啟動偵錯程式執行的各項子命令(如圖1所示)
  
            圖1 開始除錯選單

  各子命令及其功能如下: 
  • Go:從程式中的當前語句開始執行,直到遇到斷點(後面講)或遇到程式結束。
  • Step Into:控制程式單步執行,並在遇到函式呼叫時進入函式內部。
  • Run to Cursor:在除錯執行程式時,使程式執行到當前游標所在位置時停止,相當於設定了一個臨時斷點。


  二、單步除錯程式碼
  利用圖1選單中的Step into功能或按F11鍵,進入單步除錯狀態,有一個箭頭指向程式的第一行,每按一次F11鍵,程式再向前執行一行語句,如圖2所示。
  

            圖2 開始除錯後的介面

  我們對圖2的介面進行觀察。

  首先,選單中增加一個除錯(debug)選單,如圖中①處,下面是選單中的部分功能(滑鼠浮到上面時,會有提示,請試一試。)
  • Step Into(F11):單步除錯程式,遇到呼叫函式時,進入函式內部逐步執行;
  • Step Over(F10):也是單步除錯程式,遇到呼叫函式時,並不進入函式內容執行;
  • Step Out:除錯程式時,從正在執行的某個巢狀結構的內部跳到該結構的外部,常用於知道呼叫函式中不存在錯誤的情況;
  • Run to Cursor(CTRL-F10):除錯程式時,直接執行到插入點處。

  其次,和當前正在執行的語句相關的變數,以及其當前的值顯示在了②處。 

  再次,黃色箭頭代表了正在執行的位置。

  【練習1】

  下面,針對求1+2+3+...+100的程式,體驗單步執行。步驟:
  (1)編寫如圖所示求1+2+3+...+100的程式,排除編譯錯誤;
  (2)按前述開始單步執行,用“Step Into(F11)”持續執行,在執行過程中,注意觀察變數的變化。
  • 除錯中,要將自己的預期和計算機執行的結果進行比較,當發現不一致,恭喜,問題找到了。
  • 本程式迴圈要執行100次!有的程式進入迴圈要執行的次數更多,而初步跟蹤確定迴圈不可能出問題,需要快速“跳出”迴圈。將游標移到迴圈後,用“Run to Cursor”,程式即執行到游標處。
  • 在cout<<...一行繼續F11,會嚇人一跳,出現的介面是:
  
     圖3 程式會執行到“看不懂”的程式碼中去,用Step Out功能退出
  這是因為F11的單步執行,進入到了實現cout功能的程式碼中去了(教訓:以後再到這兒,切記用Step Over(F10),而不是Step Into(F11)),此時請用Step Out功能可以退出。

  【練習2】再將上面的過程進行幾遍,熟練上述過程,學會觀察,會靈活使用Step Over(F10)、Step Into(F11)、Step Out和Run to Cursor處理。

  提示:Step Over(F10)和Step Into(F11)的區別將在學習函式後更加明確,需要跟蹤自定義函式內部程式碼時,用Step Into(F11),不需要跟蹤時,就Over過去了。

  【練習3】將游標置於程式中某一語句上,用Run to Cursor(快捷鍵CTRL-F10),看看發生什麼現象——直接執行到了游標處!這是一種快速觀察的方法。(PS:本練習受1樓博友留言啟發加上,表示感謝。)


  三、設定斷點和斷點應用
  斷點是程式執行需要中斷的地方。可以讓程式中斷在需要的地方,從而方便其分析。
  有兩種設定斷點的方法,如圖4所示:
  • 將游標移到需要設定斷點的程式行,點選工具欄上的“手型”按鈕設定斷點。
  • 利用滑鼠右鍵設定:在程式行前的空白欄內點滑鼠右鍵,選擇選單中的Insert/Remove Breakpoints選項可以設定斷點。
  
          圖4設定斷點及相關工具

  設定了斷點的程式行前會出現一個黑色的實心圓圈。

  取消斷點用同樣的按鈕和選單。
  Go(F5)命令從程式中的當前語句開始執行,直到遇到斷點(後面講)或遇到程式結束。

  【練習4】在程式中隨意設定和取消斷點(一個程式中可以根據需要設定多個斷點),然後用Go命令(F5)執行,觀察變數及程式流程的變化。
  技巧:在除錯的過程中,可以直接使用Run to Cursor,從而避免多次的用Step Into/Over等命令。如果設定了斷點,直接執行程式就可以在斷點處停止,從而避免程式設計師總得關注游標的位置。一個程式中可以設多個斷點,這也為程式設計師提供了方便。

  四、用好快捷鍵和“除錯”工具欄
  在使用中記住各功能的快捷鍵,這將提高你的工作效率。快捷鍵可以從選單中看到。
  可以在工具欄處點右鍵,選擇“除錯”工具欄,如圖5,工具欄也可以方便你的工作。
  
  圖5 除錯工具欄

  【練習5】將工具欄中的功能都點一點,看一看,想一想,但不求甚解。隨著學習的深入,我們會逐步掌握。

  五、程式除錯方法小結
  上面僅介紹了程式除錯的基本方法,但靈活運用可以為編寫出正確的程式提供強大的支撐。
  隨著經驗的增加,簡短且演算法簡單的程式你可能憑觀察就知一二。對需要觀察其執行過程的程式,可以這樣做:
  • 增加必要的斷點(當然,嫌疑解除後去除斷點);
  • 如果必要,新增監視,以便於觀察一些表示式的值;
  • 用Step Into、Step Over、Step Out或Run to Cursor等的組合,跟蹤程式執行的過程
  • 在執行過程中,和自己對執行結果的預期結合起來,思考程式可能出現的問題。
  • 需要退出程式時,使用除錯選單中的“Stop Debugging”選項終止執行。這時再修改程式。
  • 如果程式執行異常,一定要告訴自己:程式中一定有bug,不是機器的錯,我得找出bug來,Bug也一定會被你找出來。

【實踐1】利用單步執行、設定斷點等手段,觀察下面程式執行的過程

1.

#include <iostream>
using namespace std;
int main()
{
   int a=1,b=2,c=3;
   if(a<=c)
     if(b==c)
       cout<<"a="<<a<<endl;
     else
       cout<<"b="<<b<<endl;
   cout<<"c="<<c<<endl;
   return 0;      
}

2.
#include <iostream>
using namespace std;
int main()
{
    int x=1,a=0,b=0;
    switch (x)  
    { 
       case 0: a++; break;
       case 1: b++;
       case 2: a++; b++; break;
       case 3: a++; b++;
    }
    cout<<"a="<<a<<",b="<<b<<endl;
    return 0;
}
3.
#include <iostream>
using namespace std;
 int main ( )
{  
	int  i , j, s=0;
	for (i=1; i<=4; i++)
	{
		for( j=1; j<=i; j++)
			s=s+1;
	}
	cout<<”s=”<<s<<endl;
	return  0;
}

4.
#include <iostream>
using namespace std;
 int  main()  
{
	int number=1024,digit;
	do
	{
		digit=number%10;
		number=number/10;
		cout<<digit;
	} while(number>0);
	cout<<endl;
	return 0;
}

  【實踐2】選擇一個你以前做的程式,請你的同學在你的程式中作兩處改動,使其可能會造成邏輯錯誤(如兩數交換的程式中將a=b;和b=t;兩條語句換一下順序),你利用自己的思考和除錯工具將程式改正過來。