프로그래밍 언어 : C 플랫폼 : ARM 컴파일러 : ADS 1.2간단한 C 구현으로 메모리 malloc/free를 추적 할 수 있습니까?
내 프로젝트에 간단한melloc/free
전화를 추적 할 필요가
. 프로그램이 모든 리소스를 할당 할 때 얼마나 많은 힙 메모리가 필요한지에 대한 기본적인 아이디어를 얻을 필요가 있습니다. 따라서 malloc/free
호출에 대한 래퍼를 제공했습니다. 이 래퍼에서 나는 malloc
가 호출되는 현재의 메모리 카운트를 증가 할 필요 free
가 호출 될 때 그것을 감소. 내가 호출자에서 할당 할 수있는 크기가 같이 malloc
경우는 정직이다. 나는 어딘가에 포인터/크기 매핑을 저장할 필요로 free
경우 처리하는 방법을 궁금해하고있다. 이것이 C인데, 이것을 쉽게 구현할 표준지도가 없습니다.
모든 라이브러리에서 링크하지 않으려 고하므로 * .c/h 구현이 더 좋습니다.
그래서 이미 간단한 구현으로 나를 이끌 수 있는지 궁금합니다. 그렇지 않다면, 이것은 앞으로 나아가고 하나를 구현하려는 동기입니다.
EDIT : 순수하게 디버깅 용이며이 코드는 제품과 함께 제공되지 않습니다.
편집 : Makis의 답변에 따라 초기 구현입니다. 이것에 대한 의견을 보내 주시면 감사하겠습니다.
편집 : 재 작업 구현
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <limits.h>
static size_t gnCurrentMemory = 0;
static size_t gnPeakMemory = 0;
void *MemAlloc (size_t nSize)
{
void *pMem = malloc(sizeof(size_t) + nSize);
if (pMem)
{
size_t *pSize = (size_t *)pMem;
memcpy(pSize, &nSize, sizeof(nSize));
gnCurrentMemory += nSize;
if (gnCurrentMemory > gnPeakMemory)
{
gnPeakMemory = gnCurrentMemory;
}
printf("PMemAlloc (%#X) - Size (%d), Current (%d), Peak (%d)\n",
pSize + 1, nSize, gnCurrentMemory, gnPeakMemory);
return(pSize + 1);
}
return NULL;
}
void MemFree (void *pMem)
{
if(pMem)
{
size_t *pSize = (size_t *)pMem;
// Get the size
--pSize;
assert(gnCurrentMemory >= *pSize);
printf("PMemFree (%#X) - Size (%d), Current (%d), Peak (%d)\n",
pMem, *pSize, gnCurrentMemory, gnPeakMemory);
gnCurrentMemory -= *pSize;
free(pSize);
}
}
#define BUFFERSIZE (1024*1024)
typedef struct
{
bool flag;
int buffer[BUFFERSIZE];
bool bools[BUFFERSIZE];
} sample_buffer;
typedef struct
{
unsigned int whichbuffer;
char ch;
} buffer_info;
int main(void)
{
unsigned int i;
buffer_info *bufferinfo;
sample_buffer *mybuffer;
char *pCh;
printf("Tesint MemAlloc - MemFree\n");
mybuffer = (sample_buffer *) MemAlloc(sizeof(sample_buffer));
if (mybuffer == NULL)
{
printf("ERROR ALLOCATING mybuffer\n");
return EXIT_FAILURE;
}
bufferinfo = (buffer_info *) MemAlloc(sizeof(buffer_info));
if (bufferinfo == NULL)
{
printf("ERROR ALLOCATING bufferinfo\n");
MemFree(mybuffer);
return EXIT_FAILURE;
}
pCh = (char *)MemAlloc(sizeof(char));
printf("finished malloc\n");
// fill allocated memory with integers and read back some values
for(i = 0; i < BUFFERSIZE; ++i)
{
mybuffer->buffer[i] = i;
mybuffer->bools[i] = true;
bufferinfo->whichbuffer = (unsigned int)(i/100);
}
MemFree(bufferinfo);
MemFree(mybuffer);
if(pCh)
{
MemFree(pCh);
}
return EXIT_SUCCESS;
}
MemAlloc에서 두 개의 malloc()이 필요하다고 생각하지 않습니다. 정렬을 위해 좋은 크기를 결정하는 매크로를 작성하거나 (모든 경우에 대해 충분할 것으로 생각합니다. 64 비트를 사용하십시오.) 메모리를 할당하기 전에 해당 양만큼 nSize를 추가하십시오. – Makis
감사합니다. 나는 32 비트 플랫폼에있다. MemAlloc에서 단일 malloc을 사용하도록 구현을 업데이트했습니다. 나는 정렬에 요점을 이해하지 않습니다. 너무 많이 묻지 않는다면 문제가 될 수있는 곳에서 구현할 수 있습니다. 아마도, MemFree로 전달 된 포인터 또는 malloc에서 반환 된 포인터가 이미 정렬되지 않은 경우, 래퍼를 사용하지 않으면 이러한 정렬이 정렬되지 않기 때문에 수행 할 수있는 작업은 많지 않습니다. – dubnde
다음은 문제에 대한 좋은 설명입니다 : http://www.goingware.com/tips/getting-started/alignment.html 내가뿐만 아니라 32 비트 크기의 정보를 가질 것,이 문제가 해결됩니다. 문제는 다음과 같을 수 있습니다. 위치 X부터 시작하여 메모리를 예약하고 처음 두 바이트는 크기 정보이므로 x + 2를 호출자에게 반환합니다. 그러나 정렬이 4 바이트이면 문제가 발생할 수 있습니다. size_t가 어떤 크기인지 확인하거나 이식성있는 코드를 원할 경우 일부 매크로를 정의해야합니다. – Makis