2012年10月8日 星期一

A simple implement for global new override to track memory.


// heaplog.h

#ifndef BRWHEAPLOG_H
#define BRWHEAPLOG_H

extern const char* __file__;
extern size_t __line__;
#define new (__file__=__FILE__,__line__=__LINE__) && 0 ? NULL : new
void closeLoggingFile();

#endif


//heaplog.cpp


//#include "BrwHeapLog.h"

#include <stdlib.h>
#include <stdio.h>
#include <WTypes.h>

//typedef hash_map<void*, string> AllocHashMap;

static int AllocCount = 0;

HANDLE& getFileHandle()
{
    static HANDLE handle = ::CreateFile(TEXT("\\Release\\MemoryTest.txt"),
        GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    return handle;
}

static void writeFile(HANDLE& handle, char* str)
{
    ::SetFilePointer(handle, 0, NULL, FILE_END);
    DWORD writeLen = 0;
    ::WriteFile(handle, str, strlen(str), &writeLen, NULL);
}

static void recordAlloc(void* p, const char* fileName, size_t line, size_t size)
{
    AllocCount += size;
    HANDLE& handle = getFileHandle();
    char str[1024];
   
    static char* above = "More";
    static char* less = "Less";
    char* temp = less;
    if(size/1024)
        temp = above;
    sprintf_s(str, "[%d] File-%s Line-%d Size-%d :%s Than 1KB SUM:%d\r\n", p, fileName, line, size, temp, AllocCount);
    writeFile(handle, str);
}

static void unrecordAlloc(void* p)
{
    HANDLE& handle = getFileHandle();
    char str[100];
    sprintf_s(str, "[%d] was deleted\r\n",p);
    writeFile(handle, str);
}

void closeLoggingFile()
{
    ::CloseHandle(getFileHandle());
}

const char* __file__ = "unknown";
size_t __line__ = 0;

void* operator new(size_t size)
{
    void *ptr = malloc(size);
    recordAlloc(ptr,__file__,__line__, size);
    __file__ = "unknown";
    __line__ = 0;
    return ptr;
}

void operator delete(void *ptr)
{
    if(ptr)
    {
        unrecordAlloc(ptr);
        free(ptr);
    }
}


沒有留言:

張貼留言