日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Vc6.0 調(diào)試指南

 angelbrian 2012-08-24
Vc6.0 調(diào)試指南 --Happy Debugging

Vc6.0 調(diào)試指南 --Happy Debugging
回去洗個(gè)澡,再來(lái)完成這項(xiàng)浩大的工程。

//Vc6.0下載 http://down./100.html
//Visual AssistX //Vc6.0的一個(gè)好用的插件 http://down./361.html
//如果您 Vc6.0 還不知道怎么使用, 請(qǐng)點(diǎn)擊 http://down./357.html 下載 Pdf 文檔 自行學(xué)習(xí)。

/*****************************************
一:深入了解 編譯、鏈接、組建(Look into Compile、Linking、Build)
(1) Compile
(2) Linking
(3) Build

二:斷點(diǎn) (Break Point)
(1) 普通斷點(diǎn) (Nomal Break Point)
(2) 條件斷點(diǎn) (Condition Break Point)
(3) 數(shù)據(jù)斷點(diǎn) (Data Break Point)

三:斷點(diǎn)之后能做些什么?(What can I do after Break Point)
(1)variables
(2)watch
(3)stack
(4)memory

四:斷言 (Assert)

五:printf()

六:Log

七:Trace

八:虛擬內(nèi)存簡(jiǎn)介(Virtual Memory Intro )

九:常見(jiàn)的段錯(cuò)誤 (Common Segmentation Fault)
(1)堆區(qū)內(nèi)存錯(cuò)誤 (Heap Memory Errors)
1,未初始化的內(nèi)存仿問(wèn) (Uninitialized Memory Access)
2,無(wú)效的內(nèi)存仿問(wèn) (Invalid Memory Access)
3,內(nèi)存泄露 (Memory leaks)
4,未分配內(nèi)存 (Missing allocation)

(2)棧區(qū)內(nèi)存錯(cuò)誤 (Stack Memory Errors)
1,未初始化的內(nèi)存仿問(wèn) (Uninitialized Memory Access)
2,無(wú)效的內(nèi)存仿問(wèn) (Invalid Memory Access)
3,數(shù)組越界 (Writing off the end of the array)
4,棧溢出 (Stack Overflows)

十:輕松解決 內(nèi)存泄漏 (Hunting Memory Leaks)

結(jié)束語(yǔ):怎樣盡可能的避免錯(cuò)誤
**********************************************************/

下面就開(kāi)始祥細(xì)講解,/

一:深入了解 Compile、Linking、Build
(1)Compile - 編譯
當(dāng)您點(diǎn)擊 編譯按鈕時(shí),編譯器將會(huì)把你的源代碼文件 (.c文件)轉(zhuǎn)換為目標(biāo)文件(.obj文件) ,目標(biāo)文件包含的是
源代碼文件翻譯后的機(jī)器語(yǔ)言。這些是不能被直接運(yùn)行的,還需要 鏈接器將此中間代碼與其他代碼相結(jié)合來(lái)生成可執(zhí)行文件。請(qǐng)轉(zhuǎn)看 Linking,

Compile時(shí),編譯器通常會(huì)給你2種類(lèi)型的提示:warnings 和 errors

warnings
別小看 warnings ,它有可能會(huì)導(dǎo)致相當(dāng)嚴(yán)重且極其隱蔽的 bug,尤其是在 指針管理內(nèi)存 這一塊,/

常見(jiàn)的warning有以下幾種類(lèi)型

1,使用了未經(jīng)初始化的變量,或者定義變量了卻沒(méi)有使用。
解析: 未經(jīng)初始化的變量會(huì) 存一個(gè)隨機(jī)值,絕大多數(shù)的時(shí)候這個(gè)值都不是你想要的,你用它,編譯器能不給你warning嗎,?

2,使用了一些看上去非常愚蠢的語(yǔ)句,編譯器都看不下去了
例如, if (blueguy = 0)
           printf("blueguy = 0!!");

       if(blueguy && greengirl || hemy)
           ;

3, 使用了未定義的語(yǔ)句 (注意,vc6.0是不會(huì)給這樣的語(yǔ)句一個(gè)warning的)

例如, j = i++ + i++;  //我自己都不知道自己想表達(dá)什么意思 , 呵呵
       x = x>0 ? x++ : x--;

4,類(lèi)型不匹配
例如, char * blueguy = (int*) greengirl;
本意是按單字節(jié)仿問(wèn)內(nèi)存的,結(jié)果卻按四字節(jié)仿問(wèn)內(nèi)存, 你感到崩潰,我感到崩潰,編譯器也感到崩潰,估計(jì)編譯器會(huì)真的崩潰了 ,/

5, 函數(shù)原型明明寫(xiě)著有返回值的,結(jié)果函數(shù)體內(nèi)卻沒(méi)有 return一個(gè)值, 反之亦然。
例如,
int main(void)
{
}
或者
void main()
{
    return 0;
}

......等等,等等,等等。/
好了,warnings 就簡(jiǎn)單介紹到這里了,希望您寫(xiě)的程序里 一個(gè) warning也沒(méi)有

errors
出現(xiàn)errors時(shí),相對(duì)來(lái)說(shuō)比較好解決一些, 通常編譯器會(huì)給你明確的提示
像,"syntax errors", "unexpected parenthesis ", "unexpected end of file"之類(lèi)的,

常見(jiàn)的errors有以下幾種類(lèi)型
(1)語(yǔ)句缺少 ";"號(hào)
例如,
for(;)

struct bluguy
{
   int x;
}


(2)括號(hào)不匹配
例如,
int main(void)
{

if (!blueguy

Compile就這樣結(jié)束了,下面接著看 Linking

(2)Linking - 鏈接
vc6.0上是沒(méi)有 Linking按鈕的,或許是 我菜了,/ 沒(méi)注意到
vc6.0的 Build 把 Compile與Linking合在一起了 ,/
鏈接的作用是將目標(biāo)代碼、系統(tǒng)的標(biāo)準(zhǔn)啟動(dòng)代碼和庫(kù)代碼結(jié)合在一起,生成可執(zhí)行程序。
在你Compile的時(shí)候,編譯器假定所有的結(jié)構(gòu)體、函數(shù)、全局變量都已經(jīng)在別的文件里聲明了,但這個(gè)假設(shè)并不總是成立的,
鏈接器就是在文件中查看這些結(jié)構(gòu)體、函數(shù)以及全局變量是不是已經(jīng)聲明了,/

常見(jiàn)的Linker Errors有以下幾種,
1, "undefined function" - 不明確的函數(shù) (這可能是函數(shù)參數(shù)不匹配 或者未包含相應(yīng)的庫(kù) 或者函數(shù)沒(méi)有函數(shù)原型造成的,/)

2,"could not find definition for X" -  使用的變量未定義,

3,"multiple definitions"  - 多重定義(多個(gè)文件定義了相同的函數(shù)或全局變量)

(3)Build - 組建
Build沒(méi)什么好講的,就是集成了Compile與Linking 的功能。
將Compile與Linking 分隔開(kāi)來(lái) ,可以讓你能夠單獨(dú)編譯文件,總之是為了方便管理的,/

順便說(shuō)一下,當(dāng)您的程序出現(xiàn)了,warning 或者 Errors 的時(shí)候,雙擊一下提示信息就可以定位到那一行,/

二:斷點(diǎn)
(1) 普通斷點(diǎn),
圖1


nomal.jpg (60.42 KB)



普通斷點(diǎn)是最簡(jiǎn)單, 也是最常用的,只要在能夠下斷點(diǎn)的位置下上斷點(diǎn)(按下F9,有的行是不能下斷點(diǎn)的),上圖中,斷點(diǎn)下在 blueguy = 0;這條語(yǔ)句上,也就是第9行,以下簡(jiǎn)稱(chēng)"第9行",好,按下 F5, 程序立馬就斷在 blueguy = 0; 這條語(yǔ)句上。斷下來(lái)有什么用?請(qǐng)?zhí)D(zhuǎn)本文列表三:斷點(diǎn)之后能做些什么?

(2) 條件斷點(diǎn)1 - 遇到斷點(diǎn)一定次數(shù)后斷下來(lái)

還是在圖1的第9行下個(gè)斷點(diǎn),然后,按下 Ctrl+b, 彈出如下對(duì)話(huà)框
圖2


condition1.jpg (32.56 KB)


單擊,at{"blueguy.c"}.9 這一行后,彈出如下對(duì)話(huà)框
圖3


condition2.jpg (39.05 KB)



好,現(xiàn)在單擊 Condition按鈕,彈出如下對(duì)話(huà)框
圖4


condition3.jpg (50.53 KB)


接下來(lái), 在stopping標(biāo)識(shí)的文本框內(nèi)填上一個(gè)你想要填上的數(shù)字,這里填的是 6。好,
單擊 OK按鈕 ,再次按下 F5, 程序斷在了第9行。此時(shí)按下 Ctrl+b 可以看到
圖5


condition4.jpg (34.93 KB)



(2) 條件斷點(diǎn)2 - 某個(gè)變量(普通變量或指針變量)的值發(fā)生變化時(shí)斷下來(lái)
還是在第9行下上斷點(diǎn), 先按下F5,程序斷在了第9行,按下 Ctrl+b
彈出如下對(duì)話(huà)框


condition2.jpg (39.05 KB)


再按下 Condition按鈕,彈出如下對(duì)話(huà)框



condition3.jpg (36.24 KB)


在Enter the expression to be evaluated標(biāo)識(shí)的文本框下
寫(xiě)上你想寫(xiě)入的變量,這里寫(xiě)的是 blueguy, 再按下 F5, 好,程序斷在了第9行,并伴有下圖提示


condition5.jpg (24.97 KB)



(3)數(shù)據(jù)斷點(diǎn) - 某個(gè)表達(dá)式的值為真時(shí)斷下來(lái)
還是在第9行下上斷點(diǎn), 先按下F5,程序斷在了第9行,按下 Ctrl+b


condition2.jpg (39.05 KB)


單擊下Date按鈕,彈出如下對(duì)話(huà)框,


data1.jpg (41.11 KB)


在Enter the expression to be evaluated標(biāo)識(shí)的文本框下
寫(xiě)上你想寫(xiě)的表達(dá)式,這里寫(xiě)的是 greengirl == 6
好,先按下F9撤消斷點(diǎn),再按下F5, 程序斷在了第9行,伴有下圖提示:
見(jiàn)下樓,


data2.jpg (33.24 KB)


如果你嫌麻煩的話(huà),你也可以這樣下斷點(diǎn)
if (greengirl == 6)
  blueguy = 0;
不過(guò)這樣做,調(diào)試過(guò)后你得記得刪除它,否則會(huì)給閱讀代碼選成 視覺(jué)障礙,

好了,怎樣下斷點(diǎn)就講到這里,如果你細(xì)心的話(huà),會(huì)發(fā)現(xiàn)還有個(gè) Message按鈕, 那是消息斷點(diǎn),不怎么常用,
不在我的講解之列 ,/


三:斷點(diǎn)之后能做些什么?
先上張大圖


debug.jpg (146.13 KB)



假設(shè)程序斷在了第9行
(1)variables
這個(gè)窗口可以查看 自動(dòng)變量的值,不過(guò)他的最大用途在于查看函數(shù)的返回值。
假設(shè) 有這樣一個(gè)程序段
#include <stdio.h>

int blueguy(void){return 5;}
int sum(int a, int b){return a+b;}

int main(void)
{
    printf("%d", sum(5, blueguy()));
    return 0;
}
如果,我想查看 sum() 以及 blueguy()的返回值,如果不使用 variables窗口,
我就得 定義兩個(gè)變量來(lái)接收 sum() 以及 blueguy()的返回值,例似這樣的語(yǔ)句,int greengirl = blueugy().... 是不是? 很幸運(yùn), variables窗口為我們省去了這個(gè)麻煩。

現(xiàn)在我們把斷點(diǎn)下在 return 0; 按下 F9, 程序斷下來(lái)。
看下面這張圖, 很驚喜吧,


Autos.jpg (59.43 KB)



(2)watch
點(diǎn)擊調(diào)試工具條上的 watch按鈕
1,現(xiàn)在想查看下greengirl的值,只需把光標(biāo)放在 greengirl上選中,拖到 watch窗口里就行了

2,watch窗口中,在整形變量后面加上",c"可以顯示該變量對(duì)應(yīng)的ASCII字符,也可以直接敲數(shù)字這么顯示,比如118,c的對(duì)應(yīng)值是'v', 'v',d就是顯示字符'v'對(duì)應(yīng)的十進(jìn)制ASCII碼值 是118, 'v',x顯示的是對(duì)應(yīng)的十六進(jìn)制的ASCII碼值

3, 數(shù)組名后加上",N"  (N表示表示數(shù)組元素個(gè)數(shù)) 可以查看該數(shù)組的值, 對(duì)于查看大型數(shù)組的尾部數(shù)據(jù)比較方便
例如, int blueguy[100][10] = {...};
watch窗口中, 輸入blueguy[99], 10, 可以看到二維數(shù)組最后一維的數(shù)據(jù)。

4, watch可以計(jì)算簡(jiǎn)單算式的值,例如: blueguy - greengirl

(3)stack
點(diǎn)擊調(diào)試工具條上的 stack按鈕

假設(shè)現(xiàn)在內(nèi)存崩了,且崩在了第9行,stack 顯示了函數(shù)的調(diào)用關(guān)系, 可以逐級(jí)向上檢查錯(cuò)誤

(4)memory
點(diǎn)擊調(diào)試工具條上的 memory按鈕

memory窗口可以查看指針?biāo)傅膬?nèi)存區(qū)域里的值,使用時(shí),把指針的值放在Address里就可以了,這在查看聲音、圖片、文件等大型數(shù)組的值時(shí)相當(dāng)方便

(5)disassembly
有時(shí)內(nèi)存崩了,彈出這個(gè)反匯編窗口,在這個(gè)窗口里可以看到相應(yīng)的函數(shù),不過(guò)用途不大。
還有兩個(gè)不常用的窗口, 不在我的講解之列

斷點(diǎn)之后能做些什么?就簡(jiǎn)單的介紹到這里了,反正這些都是很常用的,具體怎么用不在我的講解之列


四:斷言
使用斷言時(shí),先加上 頭文件, <assert.h>
斷言是在條件表達(dá)式不成立的情況下,終止程序。
斷言是用來(lái)調(diào)錯(cuò)的,不要用來(lái)作為異常處理語(yǔ)句

假設(shè) 現(xiàn)在內(nèi)存崩了,并且程序中有如下代碼
char *blueguy = malloc(10000);
我現(xiàn)在想看看 是不是blueguy分配失敗了,
可以這樣寫(xiě)個(gè) 斷言
char* blueguy = malloc(blueguy);
assert(blueguy);

現(xiàn)在假設(shè) blueguy 分配失敗,為空,那么編譯器就會(huì)彈出類(lèi)似下圖的提示框


assert.jpg (32.26 KB)



這個(gè)窗口上面寫(xiě)著 錯(cuò)誤在哪一個(gè)文件,哪一行  ,此時(shí)找到那個(gè)文件,按下 ctrl+g,在框內(nèi)填上行數(shù)就可以定位到那一行。/

五: printf()
現(xiàn)在講解下深受控制臺(tái)下編程的朋友鐘愛(ài)的printf()函數(shù); 但請(qǐng)注意,不要迷戀 printf();因?yàn)樗墓δ懿⒉皇悄敲磸?qiáng)大,想查看某個(gè)值的時(shí)候,斷個(gè)點(diǎn)就可以,不用花力氣去書(shū)寫(xiě) printf()輸出語(yǔ)句。

不過(guò)printf()也有它的優(yōu)點(diǎn),想查看變量之外的信息的時(shí)候,還是很有用的
比如說(shuō),我想看下 漢諾塔 遞歸程序的 函數(shù)調(diào)用路徑
可以 定義一個(gè) 監(jiān)視變量 表示遞歸深度 ,/

Example:
//聲明:本人不保證程序能夠正確運(yùn)行,
#include <stdio.h>

void Hanoi(int n, char a, char b, char c)
{
    if ( n == 1 )
    {
        while(n--)
           printf(" ");
        printf("Hanoi(%d, %c, %c, %c)\n", n, a, b, c);

        //cout << a << "->" << b << endl;
        //printf("%c -> %c\n", a, b);
        return ;
     }

     while(n--)
       printf(" ");
    printf("Hanoi(%d, %c, %c, %c)\n", n, a, b, c);

//先將n-1個(gè)盤(pán)子,以b為中轉(zhuǎn),從a柱移動(dòng)到c

    Hanoi( n-1,a,c,b);
//將一個(gè)盤(pán)子從a移動(dòng)到b
    //cout << a << "->" << b << endl;
    //printf("%c -> %c\n", a, b);

//將c柱上的n-1個(gè)盤(pán)子,以a為中轉(zhuǎn),移動(dòng)到b柱
    Hanoi( n-1,c,b,a);

}

int main(void)
{
    int N;
    scanf("%d", &N);
    Hanoi(N,'A','B','C');
    return 0;
}

當(dāng)然,printf()還有其他的用途,關(guān)鍵看你怎么用了,不在我的講解之列

六:Log
有時(shí)候,前面介紹的調(diào)試技術(shù)(本文已經(jīng)通過(guò) 編程中國(guó)ISO9001認(rèn)證)并不能直觀的看到數(shù)據(jù)的變化,比如 watch窗口太小了,放不下那么多的值...
Log是java/c#中的名詞,c 語(yǔ)言是沒(méi)有提供這個(gè)調(diào)試功能的,實(shí)際上所謂的Log也沒(méi)什么東西,無(wú)非是打開(kāi)文件,寫(xiě)入數(shù)據(jù)罷了。
我們可以用 c語(yǔ)言 的 fopen() 、fwrite ()等文件操作函數(shù)來(lái)仿寫(xiě) Log

這里要介紹兩個(gè)用于調(diào)試的重要的宏
__FILE__  表示 文件名
__LINE__  表示調(diào)用語(yǔ)句所在的行數(shù)

Example:
//聲明:本人不保證程序能夠正確運(yùn)行,
void Log(void)
{
   char bugInfo[200];
   pFile = fopen ("E:\\blueguyDebug.log",  , "a+" );
   sprintf(bugInfo, "File: %s  Line: %d: Here is a bug", __FILE__, __LINE__);
   fwrite (bugInfo, sizeof(bugInfo[0]) , sizeof(bugInfo) , pFile );
   fclose (pFile);
}

/*一套完整的日志接口*/

void bgOpenLog(void)
{

     if(Log == NULL)
         Log = fopen("log.txt", "w");
}

void bgWriteLog(const char* s)
{
    fwrite(s, sizeof(char), strlen(s), Log);
}

void bgCloseLog(void)
{
     fclose(Log);
     Log = NULL;
}

不再多說(shuō)了,繼續(xù)看下一個(gè)調(diào)試技術(shù)


七:Trace

假設(shè)你現(xiàn)在 在寫(xiě)windows應(yīng)用程序,  程序出錯(cuò)了,你想用printf()函數(shù)來(lái)輸出信息, 很遺憾的告訴你,可能沒(méi)有,
這個(gè)時(shí)候,您可以使用 可變參數(shù)來(lái)仿寫(xiě) printf()函數(shù)

Example:
//聲明:本人不保證程序能夠正確運(yùn)行,

Trace(const char* fmt,...)
{
     char text[256];  
     va_list  ap;         
     if (fmt == NULL)         
         return;         
     va_start(ap, fmt);         
     vsprintf(text, fmt, ap);     
     va_end(ap);
     
     //在屏幕上畫(huà)出這個(gè)字符串
}

八:虛擬內(nèi)存簡(jiǎn)介 (Virtual Memory)
每一個(gè)跑在你的操作系統(tǒng)的應(yīng)用程序都有一個(gè)唯一的地址空間。這些地址空間看起來(lái)是連續(xù)的內(nèi)存塊,實(shí)事上,它們并不是物理上連續(xù)的內(nèi)存,僅僅是操作系統(tǒng)給應(yīng)用程序的一個(gè)鏡像空間--虛擬內(nèi)存.

每個(gè)應(yīng)用程序可利用的虛擬內(nèi)存一般劃分為六個(gè)段:

環(huán)境變量段 -- 用于存儲(chǔ)環(huán)境變量和命令行參數(shù)。
棧 -- 用于存儲(chǔ)函數(shù)參數(shù),自動(dòng)變量等。
堆 -- 用于動(dòng)態(tài)分配內(nèi)存
兩個(gè)數(shù)據(jù)段 -- 分別用于存儲(chǔ) 初始化和未初始化的 靜態(tài)變量或全局變量
文本段 -- 用于存放實(shí)際的代碼



九:常見(jiàn)的段錯(cuò)誤 (Common Segmentation Fault)
(1)堆區(qū)內(nèi)存錯(cuò)誤 (Heap Memory Errors)
1,未初始化的內(nèi)存仿問(wèn) (Uninitialized Memory Access)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    char *pStr = (char*) malloc(512);
    char c = pStr[0]; // the contents of pStr were not initialized
}

2,無(wú)效的內(nèi)存仿問(wèn) (Invalid Memory Access)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    char *pStr = (char*) malloc(25);
    free(pStr);
    strcpy(pStr, "blueguy")// Invalid write to deallocated memory in heap
}


3,內(nèi)存泄露 (Memory leaks)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    char *pStr = (char*) malloc(512);
    return;
}

4,未分配內(nèi)存 (Missing allocation)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    char* pStr = (char*) malloc(20);
    free(pStr);
    free(pStr); // results in an invalid deallocation
}


(2)棧區(qū)內(nèi)存錯(cuò)誤 (Stack Memory Errors)
1, 無(wú)效的內(nèi)存仿問(wèn) (Invalid Memory Access)
#include <stdio.h>
int* blueguy(void);
int main(void)
{
   
    int *greengirl = NULL;
    greengirl  = blueguy();
    printf("%d", greengirl[0]);
    return 0;     
}
int* blueguy(void)
{
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    return a;
}

2,未初始化的內(nèi)存仿問(wèn) (Uninitialized Memory Access)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    int a;
    int b = a * 4; // uninitialized read of variable a

}

3,數(shù)組越界 (Writing off the end of the array)
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    int blueguy[10];
   
    printf("%d", blueguy[10]);   
    return 0;
}

4,棧溢出 (Stack Overflows)
//輸入了小于0的值
#include <stdio.h>
int factorial(int n);
int main(void)
{
    int blueugy, greengirl ;
    scanf("%d", &blueguy);
    greengirl = factorial(blueguy);     
    printf("%d", greengirl);
    return 0;   
}

int factorial(int n)
{
    if(n == 0)
    {
        return 1;
    }
    return factorial(n-1) * n;
}

//超過(guò)棧內(nèi)存分配限制
#include <stdio.h>
int factorial(int n);
int main(void)
{
    int blueugy[1000000];
   
    return 0;   
}

十:輕松解決 內(nèi)存泄漏(Hunting Memory Leaks)
為了解釋方便,假設(shè)現(xiàn)在程序需要載入500張圖片。
給圖片結(jié)構(gòu)體 定義一個(gè)  id;
typedef struct bgImage
{
   int id;
   char* buffer;
   int width;
   int height;
}BGImage;
typedef BGImage* Image;

定義一個(gè) int inspect[500] (初始化為 0)數(shù)組來(lái)監(jiān)視內(nèi)存。
給每個(gè)文件名編號(hào),從100開(kāi)始,(之所以不從0開(kāi)始編號(hào),是為了處理方便),然后101,...

(1)
每次載入圖片的時(shí)候,根據(jù)路徑名計(jì)算出 圖片id。
bgMalloc()
{
    ID = (path[0]-'0')*100 + (path[1]-'0')*10 + (path[2]-'0');
    img->id =  ID;   
    inspect[img->id - 100]++;
    for (i = 0; i < 500; i++)
    {
        if (inspect[i] > 1)
           printf("內(nèi)存泄漏");
    }

(2)
每次釋放圖片的時(shí)候
bgFree(Image img)
{
    inspect[img->id - 100]--;
    free(img->buffer);
    img->buffer = NULL;
    free(img);
    img = NULL;
}

(3)
在某個(gè)時(shí)刻,根據(jù) 監(jiān)視列表 判斷內(nèi)存是否泄漏。比如程序退出的時(shí)候。
for (i = 0; i < 500; i++)
{
    if (inspect[i] > 0)
       printf("內(nèi)存泄漏");
}


小帖士:
(1)定義指針變量時(shí)就將其賦值為 NULL
(2)malloc/free, fopen/fclose使用時(shí)一定要配對(duì),
(3)free/fclose后,記得將指針置為 NULL

至此, 我所知道的調(diào)試技術(shù)已經(jīng)介紹完了,這里列舉的都是常見(jiàn)的,也是常用的,怎樣去靈活運(yùn)用這些調(diào)試技能,還是得靠自己多實(shí)踐, 記得某位哲人說(shuō)過(guò): 實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)
又記得某位哲人說(shuō)過(guò):沒(méi)有調(diào)查就沒(méi)有發(fā)言權(quán)

結(jié)束語(yǔ):怎樣盡可能的避免錯(cuò)誤

調(diào)試的最高境界就是不去調(diào)試,怎樣才能不去調(diào)試或者只需少量調(diào)試就能使程序正常跑起來(lái)呢?
答案是,深入學(xué)習(xí) c語(yǔ)言,培養(yǎng) c語(yǔ)言 的審美感。怎么說(shuō) c語(yǔ)言也是一門(mén)語(yǔ)言,話(huà)都說(shuō)不周整的人,
編程能力肯定不怎么樣,/君不見(jiàn),那些大牛們寫(xiě)起帖子來(lái)就像是寫(xiě)論文,像RockCarry、Knocker、forever74、jig、 rootkit 、rtgirl、starwing83、廣陵絕唱..../ (不再一一列舉了)他們寫(xiě)的帖子,讀起來(lái)就是不一樣,像是讀散文,/
哥最看不上的就是那些只會(huì)寫(xiě)兩個(gè)字還讓別人回去琢磨的"高手"...

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多