日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux系統(tǒng)中找出并解決程序錯(cuò)誤方法( 二 )


內(nèi)存泄漏(即 malloc() 內(nèi)存在對(duì)應(yīng)的 free() 調(diào)用執(zhí)行后永不被釋放)和緩沖區(qū)溢出(例如對(duì)以前分配到某數(shù)組的內(nèi)存進(jìn)行寫(xiě)操作)是一些常見(jiàn)的問(wèn)題 , 它們可能很難檢測(cè)到 。這一部分將討論幾個(gè)調(diào)試工具 , 它們極大地簡(jiǎn)化了檢測(cè)和找出內(nèi)存問(wèn)題的過(guò)程 。
MEMWATCH
MEMWATCH 由 Johan Lindh 編寫(xiě) , 是一個(gè)開(kāi)放源代碼 C 語(yǔ)言內(nèi)存錯(cuò)誤檢測(cè)工具 , 您可以自己下載它(請(qǐng)參閱本文后面部分的參考資料) 。只要在代碼中添加一個(gè)頭文件并在 gcc 語(yǔ)句中定義了 MEMWATCH 之后 , 您就可以跟蹤程序中的內(nèi)存泄漏和錯(cuò)誤了 。MEMWATCH 支持 ANSI C , 它提供結(jié)果日志紀(jì)錄 , 能檢測(cè)雙重釋放(double-free)、錯(cuò)誤釋放(erroneous free)、沒(méi)有釋放的內(nèi)存(unfreed memory)、溢出和下溢等等 。

CODE:#include "STDLIB.H"
#include "STDIO.H"
#include "memwatch.h"
int main(void)
{
char *ptr1;
char *ptr2;
ptr1 = malloc(512);
ptr2 = malloc(512);
ptr2 = ptr1;
free(ptr2);
free(ptr1);
}

清單 1. 內(nèi)存樣本(test1.c)
清單 1 中的代碼將分配兩個(gè) 512 字節(jié)的內(nèi)存塊 , 然后指向第一個(gè)內(nèi)存塊的指針被設(shè)定為指向第二個(gè)內(nèi)存塊 。結(jié)果 , 第二個(gè)內(nèi)存塊的地址丟失 , 從而產(chǎn)生了內(nèi)存泄漏 。
現(xiàn)在我們編譯清單 1 的 memwatch.c 。下面是一個(gè) makefile 示例:

CODE:test1
gcc -DMEMWATCH -DMW_STDIO test1.c memwatch
c -o test1
當(dāng)您運(yùn)行 test1 程序后 , 它會(huì)生成一個(gè)關(guān)于泄漏的內(nèi)存的報(bào)告 。清單 2 展示了示例 memwatch.log 輸出文件 。

CODE:MEMWATCH 2.67 Copyright (C) 1992-1999 Johan Lindh
...
double-free: <4> test1.c(15), 0x80517b4 was freed from test1.c(14)
...
unfreed: <2> test1.c(11), 512 bytes at 0x80519e4
{FE FE FE FE FE FE FE FE FE FE FE FE ..............}
Memory usage statistics (global):
N)umber of allocations made: 2
L)argest memory usage : 1024
T)otal of all alloc() calls: 1024
U)nfreed bytes totals : 512

清單 2. test1 memwatch.log 文件
MEMWATCH 為您顯示真正導(dǎo)致問(wèn)題的行 。如果您釋放一個(gè)已經(jīng)釋放過(guò)的指針 , 它會(huì)告訴您 。對(duì)于沒(méi)有釋放的內(nèi)存也一樣 。日志結(jié)尾部分顯示統(tǒng)計(jì)信息 , 包括泄漏了多少內(nèi)存 , 使用了多少內(nèi)存 , 以及總共分配了多少內(nèi)存 。
YAMD
YAMD 軟件包由 Nate Eldredge 編寫(xiě) , 可以查找 C 和 C中動(dòng)態(tài)的、與內(nèi)存分配有關(guān)的問(wèn)題 。在撰寫(xiě)本文時(shí) , YAMD 的最新版本為 0.32 。請(qǐng)下載 yamd-0.32.tar.gz(請(qǐng)參閱參考資料) 。執(zhí)行 make 命令來(lái)構(gòu)建程序;然后執(zhí)行 make install 命令安裝程序并設(shè)置工具 。
一旦您下載了 YAMD 之后 , 請(qǐng)?jiān)?test1.c 上使用它 。請(qǐng)刪除 #include memwatch.h 并對(duì) makefile 進(jìn)行如下小小的修改:使用 YAMD 的 test1 。

CODE:gcc -g test1.c -o test1
清單 3 展示了來(lái)自 test1 上的 YAMD 的輸出 。

CODE:YAMD version 0.32
Executable: /usr/src/test/yamd-0.32/test1
...
INFO: Normal allocation of this block
Address 0x40025e00, size 512
...
INFO: Normal allocation of this block
Address 0x40028e00, size 512
...
INFO: Normal deallocation of this block
Address 0x40025e00, size 512
...
ERROR: Multiple freeing At
free of pointer already freed
Address 0x40025e00, size 512
...
WARNING: Memory leak
Address 0x40028e00, size 512
WARNING: Total memory leaks:
1 unfreed allocations totaling 512 bytes
*** Finished at Tue ... 10:07:15 2002
Allocated a grand total of 1024 bytes 2 allocations
Average of 512 bytes per allocation
Max bytes allocated at one time: 1024
24 K alloced internally / 12 K mapped now / 8 K max
Virtual program size is 1416 K
End.

清單 3. 使用 YAMD 的 test1 輸出
YAMD 顯示我們已經(jīng)釋放了內(nèi)存 , 而且存在內(nèi)存泄漏 。讓我們?cè)谇鍐?4 中另一個(gè)樣本程序上試試 YAMD 。

推薦閱讀