dbgalloc.c

来自「深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心」· C语言 代码 · 共 183 行

C
183
字号
#include <edef.h>
#include <eframe.h>
#include <ealloc.h>
#include <estring.h>
#include <estdlib.h>
#include <eassert.h>

#ifdef  DEBUG_ALLOC


#define ALIGN_MASK   7

typedef struct _DBGMEMINFO
{
	LPBYTE lpbFileName;
	int line;
	DWORD dwThreadId;
	DWORD dwProcessId;
	LPVOID lpvRet;
}DBGMEMINFO;

#define DBGMEMSIZE ( ( sizeof( DBGMEMINFO ) + ALIGN_MASK ) & (~ALIGN_MASK) )

void * Debug_Mem_Alloc( DWORD dwSize, char * file, int line )
{
	//char buf[16];
	//int iFileLen, iLineLen, iPreFixLen;
	char * p;


	if( dwSize )
	{
		//itoa( line, buf, 10 );
		//iLineLen = strlen( buf );
		//iFileLen = strlen( file );	
		
		//iPreFixLen = iFileLen + sizeof( char ) + iLineLen + sizeof( char ) + sizeof(DWORD) + sizeof(DWORD);
		//iPreFixLen = (iPreFixLen + ALIGN_MASK) & (~ALIGN_MASK);  // align to dword
		//iPreFixLen = DBGMEMSIZE;//( sizeof( _DBGMEMINFO ) + ALIGN_MASK ) & (~ALIGN_MASK);
		
		p = (char*)Mem_Alloc( dwSize + DBGMEMSIZE );
		if( p )
		{
			DBGMEMINFO * lpmi = (DBGMEMINFO *)p;
			//strcpy( p, file );
			//strcat( p, "@" );
			//strcat( p, buf );
			
			//*( (DWORD*)(p + iPreFixLen - sizeof( DWORD) ) ) = iPreFixLen;
			//*( (DWORD*)(p + iPreFixLen - sizeof( DWORD) - sizeof(DWORD) ) ) = GetCurrentProcessId();
			lpmi->line = line;
			lpmi->lpbFileName = (LPBYTE)file;
			lpmi->dwProcessId = GetCurrentProcessId();
			lpmi->dwThreadId = GetCurrentThreadId();
			lpmi->lpvRet = ( p + DBGMEMSIZE );

			return lpmi->lpvRet;//(p + iPreFixLen);
		}
	}
	return NULL;
}

void * Debug_Mem_Realloc( void * p, DWORD dwSize, char * file, int line )
{
	//_HeapCheck();

	if( p )
	{
		DBGMEMINFO * lpmi = (DBGMEMINFO *)( (LPBYTE)p - DBGMEMSIZE );
		//DWORD iPreFixLen = *( (DWORD*)( (char*)p - sizeof(DWORD) ) );
		//DWORD dwProcessId = *( (DWORD*)( (char*)p - sizeof(DWORD) - sizeof(DWORD) ) );
		
		//ASSERT( GetCurrentProcessId() == dwProcessId );
		ASSERT( lpmi->lpvRet == p );

		//_HeapCheck();

		if( dwSize )
		{
		    //char * pr = (char*)Mem_Realloc( (char*)p - iPreFixLen, iPreFixLen+dwSize );
			char * pr = (char*)Mem_Realloc( (char*)lpmi, DBGMEMSIZE + dwSize );
			//_HeapCheck();
			if( pr )
			{
				lpmi = (DBGMEMINFO *)pr;
				lpmi->lpvRet = pr + DBGMEMSIZE;
				return lpmi->lpvRet;//pr + iPreFixLen;
			}
			else
				return NULL;
		}
		else
		{
			//_HeapCheck();
			Debug_Mem_Free( p, file, line );
			//_HeapCheck();
			return NULL;
		}
	}
	else
	{
		if( dwSize )
		{
			//_HeapCheck();
		    return Debug_Mem_Alloc( dwSize, file, line );
		}
		else
			return NULL;
	}
}

void Debug_Mem_Free( void * p, char * file, int line )
{
	if( p )
	{
		DBGMEMINFO * lpmi = (DBGMEMINFO *)( (LPBYTE)p - DBGMEMSIZE );

		//DWORD * pdw = (DWORD*)((char*)p - sizeof(DWORD));
		//DWORD iPreFixLen = *pdw;
		//char * pd = (char*)p - iPreFixLen;

		//DWORD dwProcessId = *( (DWORD*)( (char*)p - sizeof(DWORD) - sizeof(DWORD) ) );
		
		//ASSERT( GetCurrentProcessId() == dwProcessId );

		//ASSERT( (lpmi->lpvRet == p) && (lpmi->dwProcessId == GetCurrentProcessId()) );
		DEBUGMSG( !( (lpmi->lpvRet == p) && (lpmi->dwProcessId == GetCurrentProcessId()) ), ( "lpmi->lpvRet=%x,p=%x,lpmi->ProcessId=%x,CurProcId=%x", lpmi->lpvRet, p, lpmi->dwProcessId, GetCurrentProcessId() ) );

		lpmi->lpvRet = NULL;
		

		Mem_Free( lpmi );
	}
}

void * Debug_Mem_Calloc( DWORD num, DWORD size )
{
	void *ptr;

	size *= num;
	ptr = Debug_Mem_Alloc( size );
	if( ptr )
	    memset( ptr, 0, size );
	return ptr;	
}

//BOOL Debug_Mem_Enum( LPMEMENUM lpfn, UINT uiFlag )
//{
//}
static BOOL CALLBACK _CheckThread( LPVOID lpv, LPARAM lParam )
{
	DBGMEMINFO * lpmi = (DBGMEMINFO *)lpv;

	//ASSERT( lpmi->lpvRet == lpv );
	if( lpmi->dwThreadId == (DWORD)lParam )
	{
		RETAILMSG( 1, ( "find the thread alloc mem:file=%s,line=%d.\r\n", lpmi->lpbFileName, lpmi->line ) );
	}
	return TRUE;
}

static BOOL CALLBACK _CheckProcess( LPVOID lpv, LPARAM lParam )
{
	DBGMEMINFO * lpmi = (DBGMEMINFO *)lpv;

	ASSERT( lpmi->dwProcessId == (DWORD)lParam );
	RETAILMSG( 1, ( "the process mem is not free:file=%s,line=%d, ProcesId=%x,ThreadId=%x.\r\n", lpmi->lpbFileName, lpmi->line, lpmi->dwProcessId, lpmi->dwThreadId ) );
	return TRUE;
}


void _CheckThreadAllocMem( void )
{
	;//Mem_Enum( _CheckThread, GetCurrentThreadId(), 0 );
}

void _CheckProcessAllocMem( void )
{
	;//Mem_Enum( _CheckProcess, GetCurrentProcessId(), 0 );
}

#endif   // DEBUG_ALLOC

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?