程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 應用VC6.0對C說話法式停止調試的根本手腕分享

應用VC6.0對C說話法式停止調試的根本手腕分享

編輯:關於C++

應用VC6.0對C說話法式停止調試的根本手腕分享。本站提示廣大學習愛好者:(應用VC6.0對C說話法式停止調試的根本手腕分享)文章只能為提供參考,不一定能成為您想要的結果。以下是應用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)=%f\n", cos(x));
}

在該法式中,若你沒有看到成績——法式較長、較龐雜時很好看出成績地點,則應當應用調試手腕定位毛病地位。

②在監控窗口(Watch)中不雅察指定變量或表達式的值。當變量較多時,應用Varibles窗口能夠不太便利,應用Watch窗口則可以有目標、有籌劃地不雅察症結變量的變更。

③在輸入窗口中不雅察法式以後的輸入與預期能否分歧。異樣地,若紛歧致,則此斷點前運轉的法式確定在某個處所有成績。

④在內存窗口(Memory)中不雅察內存中數據的變更。在該窗口中能直接查詢和修正隨意率性地址的數據。對初學者來講,經由過程它能更深入地輿解各類變量、數組和構造等是若何占用內存的,和數組越界的進程。

⑤在挪用客棧窗口(Call Stack)中不雅察函數挪用的嵌套情形。此窗口在函數挪用關系比擬龐雜或遞歸挪用的情形下,對剖析毛病很有贊助。

(2)單步履行法式

讓法式被一步一步(行)地履行,不雅察剖析履行進程能否相符預請求。例如,以下法式預期的功效是從鍵盤上讀入兩個數(x和y),斷定x和y能否相等,相等則在屏幕上顯示x=y,不相等則顯示x<>y。這是請求完成的功效,但法式現實的運轉狀態倒是:不管輸出甚麼,都邑在屏幕上顯示x=y和x<>y,法式確定有成績,但外面上看卻能夠找不到成績地點,應用單步履行,則能定位毛病點,減少看的規模。例如,在單步履行的進程中,若輸出“2,3”,發明x和y的值切實其實釀成了2和3,此時按事理不該履行“printf("x=y\n");”,但單步跟蹤卻發明被履行了,是以多半成績出在“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=y\n");
}
else;
{
  printf("x<>y\n");
}
}

在單步履行的進程中,應靈巧運用Step Over、Step Into、Step Out、Run to Cursor等辦法,進步調試效力。建議在法式調試進程中,記住並應用“Step Over、Step Into、Step Out、Run to Cursor”等菜單項的快捷鍵,開端時能夠較陌生、操作較慢,但保持一段時光就可以生巧、效力進步。

(3)應用斷言

斷言是對某種假定前提停止檢討(可懂得為若前提成立則無舉措,不然應申報),它可以疾速發明並定位軟件成績,同時對體系毛病停止主動報警。斷言可以對在體系中隱蔽很深,用其它手腕極難發明的成績停止定位,從而延長軟件成績定位時光,進步體系的可測性。現實運用時,可依據詳細情形靈巧地設計斷言。
應用斷言時,必需在法式的開首加上:

#include <assert.h>

①可用斷言來確認函數的參數。示例:假定某函數參數中有一個指針,那末應用指針前可對它檢討,以避免其別人挪用本函數時應用空指針作參數。代碼以下:


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(禁用/使能以後斷點)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved