adding findleak
This commit is contained in:
parent
7fa0ff29cc
commit
7f5404d2d1
|
@ -0,0 +1,217 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "findleak.h"
|
||||||
|
|
||||||
|
#undef malloc
|
||||||
|
#undef calloc
|
||||||
|
#undef free
|
||||||
|
|
||||||
|
|
||||||
|
static leakMem * ptr_start = NULL;
|
||||||
|
static leakMem * ptr_next = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
// Name: MyMalloc
|
||||||
|
// Desc: This is hidden to user. when user call malloc function then
|
||||||
|
// this function will be called.
|
||||||
|
|
||||||
|
|
||||||
|
void *MyMalloc (uint nSize, cchar* file, uint lineNumber)
|
||||||
|
{
|
||||||
|
void * ptr = malloc (nSize);
|
||||||
|
if (ptr != NULL)
|
||||||
|
{
|
||||||
|
SubAddMemInfo(ptr, nSize, file, lineNumber);
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
// Name: MyCalloc
|
||||||
|
// Desc: This is hidden to user. when user call calloc function then
|
||||||
|
// this function will be called.
|
||||||
|
|
||||||
|
|
||||||
|
void * MyCalloc (uint elements, uint nSize, const char * file, uint lineNumber)
|
||||||
|
{
|
||||||
|
uint tSize;
|
||||||
|
void * ptr = calloc(elements , nSize);
|
||||||
|
if(ptr != NULL)
|
||||||
|
{
|
||||||
|
tSize = elements * nSize;
|
||||||
|
SubAddMemInfo (ptr, tSize, file, lineNumber);
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
// Name: SubAdd
|
||||||
|
// Desc: It's actually Adding the Info.
|
||||||
|
|
||||||
|
|
||||||
|
void SubAdd(infoMem alloc_info)
|
||||||
|
{
|
||||||
|
leakMem * mem_leak_info = NULL;
|
||||||
|
mem_leak_info = (leakMem *) malloc (sizeof(leakMem));
|
||||||
|
mem_leak_info->memData.addr = alloc_info.addr;
|
||||||
|
mem_leak_info->memData.nSize = alloc_info.nSize;
|
||||||
|
strcpy(mem_leak_info->memData.fileName, alloc_info.fileName);
|
||||||
|
mem_leak_info->memData.lineNumber = alloc_info.lineNumber;
|
||||||
|
mem_leak_info->nxt = NULL;
|
||||||
|
|
||||||
|
if (ptr_start == NULL)
|
||||||
|
{
|
||||||
|
ptr_start = mem_leak_info;
|
||||||
|
ptr_next = ptr_start;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ptr_next->nxt = mem_leak_info;
|
||||||
|
ptr_next = ptr_next->nxt;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
// Name: ResetInfo
|
||||||
|
// Desc: It erasing the memory using by List on the basis of info( pos)
|
||||||
|
|
||||||
|
|
||||||
|
void ResetInfo(uint pos)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint index = 0;
|
||||||
|
leakMem * alloc_info, * temp;
|
||||||
|
|
||||||
|
if(pos == 0)
|
||||||
|
{
|
||||||
|
leakMem * temp = ptr_start;
|
||||||
|
ptr_start = ptr_start->nxt;
|
||||||
|
free(temp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(index = 0, alloc_info = ptr_start; index < pos;
|
||||||
|
alloc_info = alloc_info->nxt, ++index)
|
||||||
|
{
|
||||||
|
if(pos == index + 1)
|
||||||
|
{
|
||||||
|
temp = alloc_info->nxt;
|
||||||
|
alloc_info->nxt = temp->nxt;
|
||||||
|
free(temp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
// Name: DeleteAll
|
||||||
|
// Desc: It deletes the all elements which resides on List
|
||||||
|
|
||||||
|
void DeleteAll()
|
||||||
|
{
|
||||||
|
leakMem * temp = ptr_start;
|
||||||
|
leakMem * alloc_info = ptr_start;
|
||||||
|
|
||||||
|
while(alloc_info != NULL)
|
||||||
|
{
|
||||||
|
alloc_info = alloc_info->nxt;
|
||||||
|
free(temp);
|
||||||
|
temp = alloc_info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
// Name: MyFree
|
||||||
|
// Desc:
|
||||||
|
|
||||||
|
|
||||||
|
void MyFree(void * mem_ref)
|
||||||
|
{
|
||||||
|
uint loop;
|
||||||
|
// if the allocated memory info is part of the list, removes it
|
||||||
|
leakMem *leak_info = ptr_start;
|
||||||
|
/* check if allocate memory is in our list */
|
||||||
|
for(loop = 0; leak_info != NULL; ++loop, leak_info = leak_info->nxt)
|
||||||
|
{
|
||||||
|
if ( leak_info->memData.addr == mem_ref )
|
||||||
|
{
|
||||||
|
ResetInfo(loop);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(mem_ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
// Name: SubAddMemInfo
|
||||||
|
// Desc: it also fill the the Info
|
||||||
|
|
||||||
|
|
||||||
|
void SubAddMemInfo (void * mem_ref, uint nSize, cchar * file, uint lineNumber)
|
||||||
|
{
|
||||||
|
infoMem AllocInfo;
|
||||||
|
|
||||||
|
/* fill up the structure with all info */
|
||||||
|
memset( &AllocInfo, 0, sizeof ( AllocInfo ) );
|
||||||
|
AllocInfo.addr = mem_ref;
|
||||||
|
AllocInfo.nSize = nSize;
|
||||||
|
strncpy(AllocInfo.fileName, file, MAX_FILENAME_LENGTH);
|
||||||
|
AllocInfo.lineNumber = lineNumber;
|
||||||
|
|
||||||
|
/* SubAdd the above info to a list */
|
||||||
|
SubAdd(AllocInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
// Name: WriteMemLeak
|
||||||
|
// Desc: It writes information about Memory leaks in a file
|
||||||
|
// Example: File is as : "/home/asadulla/test/MemLeakInfo.txt"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void WriteMemLeak(void)
|
||||||
|
{
|
||||||
|
//uint index;
|
||||||
|
leakMem *leak_info;
|
||||||
|
|
||||||
|
FILE * fp_write = fopen(OutFile, "wt");
|
||||||
|
char info[1024];
|
||||||
|
|
||||||
|
if(fp_write != NULL)
|
||||||
|
{
|
||||||
|
sprintf(info, "%s\n", "SUMMARY ABOUT MEMORY LEAKS OF YOUR SOURCE FILE ");
|
||||||
|
fwrite(info, (strlen(info) + 1) , 1, fp_write);
|
||||||
|
sprintf(info, "%s\n", "-----------------------------------");
|
||||||
|
fwrite(info, (strlen(info) + 1) , 1, fp_write);
|
||||||
|
|
||||||
|
for(leak_info = ptr_start; leak_info != NULL; leak_info = leak_info->nxt)
|
||||||
|
{
|
||||||
|
|
||||||
|
sprintf(info, "Name of your Source File : %s\n", leak_info->memData.fileName);
|
||||||
|
fwrite(info, (strlen(info) + 1) , 1, fp_write);
|
||||||
|
|
||||||
|
sprintf(info, "Starting Address : 0x%ld\n", (long)leak_info->memData.addr);
|
||||||
|
fwrite(info, (strlen(info) + 1) , 1, fp_write);
|
||||||
|
|
||||||
|
sprintf(info, " Total size Of memory Leak : %d bytes\n", leak_info->memData.nSize);
|
||||||
|
fwrite(info, (strlen(info) + 1) , 1, fp_write);
|
||||||
|
|
||||||
|
sprintf(info, "Line Number for which no DeAllocation : %d\n", leak_info->memData.lineNumber);
|
||||||
|
fwrite(info, (strlen(info) + 1) , 1, fp_write);
|
||||||
|
|
||||||
|
sprintf(info, "%s\n", "-----------------------------------");
|
||||||
|
fwrite(info, (strlen(info) + 1) , 1, fp_write);
|
||||||
|
fwrite(info, (strlen(info) + 1) , 1, fp_write);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DeleteAll();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue