« 双眼鏡『SUPER☆STAR』って使えるぞ! | トップページ | 秋葉原の『つけめん一歩』 »

2008年4月10日 (木)

確保されたメモリーを残らず確認したいのさ!

ある処理をするたびにメモリーがガンガン消費されて行くぅ~。

だからって、メモリーリークが発生している訳ではありません…。

どのようにメモリーが確保されているか良く分からん…。

と言う訳で現在どのようにメモリーが使用されているかを
確認できると嬉しいなぁ~♪

なんて思いましたよ!

「_CrtMemDumpAllObjectsSince」辺りを使えば何とかなるかと思いきや…
どうも一括表示には向かないみたい…。

そう言えばメモリーリークをチェックできるんだからその辺を引っこ抜けば…
と思い当たって調べてみる…。

メモリーデバッグ情報の大元は、
「C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\DBGHEAP.C」
の中の「static _CrtMemBlockHeader * _pFirstBlock;」だったりする…。
「static」なので外部からアクセスできない…。(泣)

…書き換えるなんて…
論外です!<と言っておきます!

でも、何らかの逃げの処理があるはず!と探すと…
内部データをコピーしてくれる「_CrtMemCheckpoint( );」がありましたよ。

でも「_CrtMemBlockHeader」構造体を参照できない。
「C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\DBGINT.H」
の中にあるのだがインクルードしても
「#error :  ERROR: Use of C runtime library internal header file.」
なんてエラーをぺって吐きやがる!

仕方が無いので引っこ抜きました…。

※ちなみに「VC++6」だよ。

//--------------------------------------
#define _CRTDBG_MAP_ALLOC
#include<stdio.h>
#include<malloc.h>
#include<crtdbg.h>
//--------------------------------------
#define        nNoMansLandSize        4
typedef struct _CrtMemBlockHeader
{
    struct _CrtMemBlockHeader *pBlockHeaderNext;
    struct _CrtMemBlockHeader *pBlockHeaderPrev;
    char *szFileName;
    int nLine;
    size_t nDataSize;
    int nBlockUse;
    long lRequest;
    unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
//--------------------------------------
void MemoeyDumpToFile( void )
{
    static int Flag    = 0;
    _CrtMemBlockHeader *Header;
    _CrtMemState State;
    FILE *File;

    _CrtMemCheckpoint( &State );

    File = fopen( "Memory.log", Flag ? "a" : "w" );
    Flag = 1;

    fprintf( File, "========================================\n" );
    fprintf( File, "■ size = %d BYTE / cont = %d / total = %d / wait = %d\n", State.lSizes[1], State.lCounts[1], State.lTotalCount, State.lSizes, State.lHighWaterCount );
    for( Header = State.pBlockHeader ; Header != NULL ; Header = Header->pBlockHeaderNext )
    {
        if( Header->nBlockUse == _CRT_BLOCK )
            continue;
        fprintf( File, "%s : %d : %d BYTE( %d BLOCK)-# %d\n", Header->szFileName, Header->nLine, Header->nDataSize, Header->nBlockUse, Header->lRequest );
    }
    fprintf( File, "----------------------------------------\n" );
    fclose( File );
}
//--------------------------------------
void main( void )
{
    int i;
    void *a[10];

    for( i = 0 ; i < 10 ; i++ )
        a[i]    = malloc( 100 + i );

    MemoeyDumpToFile( );

    for( i = 0 ; i < 10 ; i++ )
        free( a[i] );

    MemoeyDumpToFile( );

    for( i = 0 ; i < 3 ; i++ )
        a[i]    = malloc( 100 + i );

    MemoeyDumpToFile( );

    for( i = 0 ; i < 3 ; i++ )
        free( a[i] );

    MemoeyDumpToFile( );
}

結果は、こんな感じ。

========================================
■ size = 1045 BYTE / cont = 10 / total = 6761 / wait = 1244896
c:\test\memoeydumptofile.cpp : 83 : 109 BYTE( 1 BLOCK)-# 49
c:\test\memoeydumptofile.cpp : 83 : 108 BYTE( 1 BLOCK)-# 48
c:\test\memoeydumptofile.cpp : 83 : 107 BYTE( 1 BLOCK)-# 47
c:\test\memoeydumptofile.cpp : 83 : 106 BYTE( 1 BLOCK)-# 46
c:\test\memoeydumptofile.cpp : 83 : 105 BYTE( 1 BLOCK)-# 45
c:\test\memoeydumptofile.cpp : 83 : 104 BYTE( 1 BLOCK)-# 44
c:\test\memoeydumptofile.cpp : 83 : 103 BYTE( 1 BLOCK)-# 43
c:\test\memoeydumptofile.cpp : 83 : 102 BYTE( 1 BLOCK)-# 42
c:\test\memoeydumptofile.cpp : 83 : 101 BYTE( 1 BLOCK)-# 41
c:\test\memoeydumptofile.cpp : 83 : 100 BYTE( 1 BLOCK)-# 40
----------------------------------------
========================================
■ size = 0 BYTE / cont = 0 / total = 10857 / wait = 1244896
----------------------------------------
========================================
■ size = 303 BYTE / cont = 3 / total = 15256 / wait = 1244896
c:\test\memoeydumptofile.cpp : 93 : 102 BYTE( 1 BLOCK)-# 54
c:\test\memoeydumptofile.cpp : 93 : 101 BYTE( 1 BLOCK)-# 53
c:\test\memoeydumptofile.cpp : 93 : 100 BYTE( 1 BLOCK)-# 52
----------------------------------------
========================================
■ size = 0 BYTE / cont = 0 / total = 19352 / wait = 1244896
----------------------------------------

目的は、達成できたみたい。

実際に組み込んでテストしてみた。

どうやら個々に細かくメモリー確保&開放を行ったために
メモリー全体が断片化していっているみたいです。

使用しているメモリー容量は変わっていないみたいだし…。

一度確保したメモリーを完全に開放してから
確保し直した方が良さそうです…。<色々な事情から難しそう…。

前向きに検討ですかね…。

後ろ向きに剣道ですかね…。(笑)

ああ、バンブー終わっちゃったし~。
ARIAも灯里がああなって終わるとは~。

まあ、お陰で早く寝られそうです…。(爆)

|

« 双眼鏡『SUPER☆STAR』って使えるぞ! | トップページ | 秋葉原の『つけめん一歩』 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 確保されたメモリーを残らず確認したいのさ!:

« 双眼鏡『SUPER☆STAR』って使えるぞ! | トップページ | 秋葉原の『つけめん一歩』 »