天天看點

Linux系統移植實驗--記憶體調試實驗九  記憶體調試

實驗九  記憶體調試

【實驗目的】

段錯誤和記憶體錯誤是C語言程式設計經常遇到的問題,使用memwatch是由johan lindh編寫,是一個開發源代碼C語言記憶體錯誤檢測工具。能檢測雙重釋放,錯誤釋放,沒有釋放記憶體,溢出等等情況。

【實驗環境】

1、 ubuntu 12.04發行版

2、 FS4412平台

3、 交叉編譯器 arm-none-linux-gnueabi-gcc

【實驗步驟】

1、 解壓memwatch.-2.7.1.tar.gz,在解開的目錄下添加代碼memtest.c

#include <stdlib.h>

#include <stdio.h>

#include "memwatch.h"

int main(int argc,char **argv)

{

        char *ptr1;

        char *ptr2;

        ptr1 = malloc(512);

        ptr2 = malloc(512);

        ptr1[512]= 'A';

        ptr2 = ptr1;

        free(ptr2);

        free(ptr1);

        return 0;

}

2、 修改  Makefile

Makefile檔案為:

memtest:

        $(CC) -DMEMWATCH -DMW_STDIO  memtest.c  memwatch.c

5、運作make并在主機上執行a.out,執行後會生成一個記錄檔案memwatch.log,内容如下:

============= MEMWATCH 2.71 Copyright (C) 1992-1999 Johan Lindh =========

Started at Thu Jan  1 00:08:33 1970

Modes: __STDC__ 32-bit mwDWORD==(unsigned long)

mwROUNDALLOC==4 sizeof(mwData)==32 mwDataSize==32

overflow: <3> memtest.c(12), 512 bytes alloc'd at <1> memtest.c(8)

double-free: <4> memtest.c(13), 0x1a1b4 was freed from memtest.c(12)

Stopped at Thu Jan  1 00:08:33 1970

unfreed: <2> test.c(9), 512 bytes at 0x1a3e4  {FE FE FE FE 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

//overflow: <3> memtest.c(12)緩沖區溢出,當程式執行到第12行free(ptr2)才檢測到的;

512 bytes alloc'd at <1> memtest.c(8)

//表示出錯緩沖區的大小為512位元組,是在memtest.c的第8行配置設定的。很容易發現代碼的ptr1[512]= 'A'出現錯誤。

double-free: <4> memtest.c(13), 0x1a7f4 was freed from memtest.c(12)

//double-free: <4> memtest.c(13)是一個雙重釋放的錯誤,表示程式執行到13行的時候才檢測到。

0x1a7f4 was freed from memtest.c(12)

//表示首位址為 0x1a7f4的記憶體在12行已經被釋放。

Stopped at Wed Dec 31 19:00:38 1969

unfreed: <2> test.c(9), 512 bytes at 0x1a3e4        {FE FE FE FE FE FE FE FE

//表示一塊記憶體沒有釋放,表示這塊記憶體是在memtest.c的第9行配置設定,大小為512位元組,首位址為0x1a3e4        。

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

 //表示未釋放的記憶體

繼續閱讀