這篇文章主要介紹了用VC6.0開發c語言程式的時候調試代碼的一些小技巧,需要的朋友可以參考下
(1)設定固定斷點或臨時斷點
所謂斷點,是指定程式中的某一行,讓程式運行至該行後暫停運行,使得程式員可以觀察剖析器的運行過程中的情況。這些情況一般包括:
①在變數視窗(Varibles)中觀察程式中變數的當前值。程式員觀察這些值的目的是與預期值對比,若與預期值不一致,則此斷點前啟動並執行程式肯定在某個地方有問題,以此可縮小故障範圍。例如以下程式是計算cos(x)並顯示,運行時發現無論x輸入為多少,結果都是0.046414。
複製代碼 代碼如下:
#include <stdio.h>
#include <math.h>
void main()
{
int x;
printf("Please input x:");
scanf("% d", &x);
printf("cos(x)=%fn", cos(x));
}
在該程式中,若你沒有看到問題——程式較長、較複雜時很難看出問題所在,則應該使用調試手段定位故障位置。
②在監控視窗(Watch)中觀察指定變數或運算式的值。當變數較多時,使用Varibles視窗可能不太方便,使用Watch視窗則可以有目的、有計劃地觀察關鍵變數的變化。
③在輸出視窗中觀察程式當前的輸出與預期是否一致。同樣地,若不一致,則此斷點前啟動並執行程式肯定在某個地方有問題。
④在記憶體視窗(Memory)中觀察記憶體中資料的變化。在該視窗中能直接查詢和修改任意地址的資料。對初學者來說,通過它能更深刻地理解各種變數、數組和結構等是如何佔用記憶體的,以及數組越界的過程。
⑤在呼叫堆疊視窗(Call Stack)中觀察函數調用的嵌套情況。此視窗在函數調用關係比較複雜或遞迴調用的情況下,對分析故障很有協助。
(2)逐步執行程式
讓 程式被一步一步(行)地執行,觀察分析執行過程是否符合預要求。例如,以下程式預期的功能是從鍵盤上讀入兩個數(x和y),判斷x和y是否相等,相等則在 螢幕上顯示x=y,不相等則顯示x<>y。這是要求實現的功能,但程式實際的健全狀態卻是:無論輸入什麼,都會在螢幕上顯示x=y和x& lt;>y,程式肯定有問題,但表面上看卻可能找不到問題所在,使用逐步執行,則能定位故障點,縮小看的範圍。例如,在逐步執行的過程中,若輸入 “2,3”,發現x和y的值的確變成了2和3,此時按道理不應執行“printf("x=yn");”,但單步跟蹤卻發現被執行了,因此多半問題出在 “if (x = y)”。
複製代碼 代碼如下:
#include <stdio.h>
void main()
{
int x, y;
printf("Please input x, y:");
scanf("%d,%d", &x, &y);
if (x = y)
{
printf("x=yn");
}
else;
{
printf("x<>yn");
}
}
在逐步執行的過程中,應靈活應用Step Over、Step Into、Step Out、Run to Cursor等方法,提高調試效率。建議在程式調試過程中,記住並使用“Step Over、Step Into、Step Out、Run to Cursor”等功能表項目的快速鍵,開始時可能較生疏、操作較慢,但堅持一段時間就能生巧、效率提高。
(3)使用斷言
斷 言是對某種假設條件進行檢查(可理解為若條件成立則無動作,否則應報告),它可以快速發現並定位軟體問題,同時對系統錯誤進行自動警示。斷言可以對在系統 中隱藏很深,用其它手段極難發現的問題進行定位,從而縮短軟體問題定位時間,提高系統的可測性。實際應用時,可根據具體情況靈活地設計斷言。
使用斷言時,必須在程式的開頭加上:
#include <assert.h>
①可用斷言來確認函數的參數。樣本:假設某函數參數中有一個指標,那麼使用指標前可對它檢查,以防止其他人調用本函數時使用null 指標作參數。代碼如下:
複製代碼 代碼如下:
int exam_fun( unsigned char *str )
{
assert(str != NULL); // 斷言“指標不為空白”,若“空”(斷言不成立)則報錯
... //other program code
}
②可用斷言來確認是否發生了不該發生的情況。樣本:以下程式段運行結果有錯,檢查起來很困難而且搞了很久都不知是什麼地方有問題。因此,建議分析程 序的正常運行情況應該是什麼,運行過程中是否出了異常,針對所有(或關鍵狀態)應當正常的情況,使用斷言,就很有可能發現異常原因,且調試效率很高。針對 該程式段,我們斷言(斷定)變數i的取值應該為“i>=0 && i<SIZE”且較關鍵,但在運行過程中是否有可能被無意修改(例如其它變數越界)而超出範圍呢,就可使用斷言檢查是否發生了這樣的情況。
複製代碼 代碼如下:
for (i=0; i<SIZE; i++)
{
... //other program code
assert(i>=0 && i<SIZE); // 斷言“i的正常取值範圍”,若斷言不成立則報錯
array[i] = i;
... //other program code
}
斷言不成立時(一出現異常),系統將立即報錯,此時可進入程式調試狀態,檢查程式的運行情況。
(4)與調試相關的操作菜單:Build菜單
Compile:快速鍵Ctrl+F7。編譯當前處於原始碼視窗中的來源程式檔案,以便檢查是否有語法錯誤或警告,如果有的話,將顯示在Output輸出視窗中。
Build:快速鍵F7。對當前工程中的有關檔案進行串連,若出現錯誤的話,也將顯示在Output輸出視窗中。
Execute:快速鍵Ctrl+F5。運行(執行)已經編譯、串連成功的可執行程式(檔案)。
Start Debug:選擇該項將彈出子功能表,其中含有用於啟動調試器啟動並執行幾個選項。例如其中的Go選項用於從當前語句開始執行程式,直到遇到斷點或遇到程式結 束;Step Into選項開始逐步執行程式,並在遇到函數調用時進入函數內部再從頭逐步執行;Run to Cursor選項使程式運行到當前滑鼠游標所在行時暫停其執行(注意,使用該選項前,要先將滑鼠游標設定到某一個你希望暫停程式行處)。執行該菜單的選 擇項後,就啟動了調試器,此時功能表列中將出現Debug菜單(而取代了Build菜單)。
(5)與調試相關的操作菜單:Debug菜單
啟動調試器後才出現該Debug菜單(而不再出現Build菜單)。
Go:快速鍵F5。從當前語句啟動繼續運行程式,直到遇到斷點或遇到程式結束而停止(與Build→Start Debug→Go選項的功能相同)。
Restart:快速鍵Ctrl+Shift+F5。重新從頭開始對程式進行調試執行(當對程式做過某些修改後往往需要這樣做!)。選擇該項後,系統將重新裝載程式到記憶體,並放棄所有變數的當前值(而重新開始)。
Stop Debugging:快速鍵Shift+F5。中斷當前的調試過程並返回正常的編輯狀態(注意,系統將自動關閉調試器,並重新使用Build菜單來取代Debug菜單)。
Step Into:快速鍵F11。逐步執行程式,並在遇到函數調用語句時,進入那一函數內部,並從頭逐步執行(與Build→Start Debug→Step Into選項的功能相同)。
Step Over:快速鍵F10。逐步執行程式,但當執行到函數調用語句時,不進入那一函數內部,而是一步直接執行完該函數後,接著再執行函數調用語句後面的語句。
Step Out:快速鍵Shift+F11。與“Step Into”配合使用,當執行進入到函數內部,逐步執行若干步之後,若發現不再需要進行單步調試的話,通過該選項可以從函數內部返回(到函數調用語句的下一語句處停止)。
Run to Cursor:快速鍵Ctrl+F10。使程式運行到當前滑鼠游標所在行時暫停其執行(注意,使用該選項前,要先將滑鼠游標設定到某一個你希望暫停程式 行處)。事實上,相當於設定了一個臨時斷點,與Build→Start Debug→Run to Cursor選項的功能相同。
Insert/Remove Breakpoint:快速鍵F9。本功能表項目並未出現在Debug菜單上(在工具列和程式文檔的上下文關聯菜單上),列在此處是為了方便大家掌握程式調試 的手段,其功能是設定或取消固定斷點——程式行前有一個圓形的黑點標誌,表示已經該行設定了固定斷點。另外,與固定斷點相關的還有Alt+F9(管理程式 中的所有斷點)、Ctrl+F9(禁用/使能當前斷點)。