2012-01-31 2 views
15

C++ 프로그램에서 메모리 누수를 확인하려면 newdelete 연산자에 오버로드하여 할당 된 메모리를 추적 할 수 있습니다. C 프로그램에서 누출 여부를 확인하려면 어떻게해야합니까? C에서 연산자 오버로딩이 없으므로 malloc 함수 포인터를 덮어 쓰면 malloc에 대한 호출을 가로 채고 메모리 할당을 추적 할 수 있습니까? 외부 유틸리티를 사용하지 않고보다 쉬운 방법이 있습니까? 필자가 메소드 포인터를 덮어 쓰는 것에 익숙하지 않아서 일부 코드를 제공해주십시오.C 프로그램에서 메모리 누출 감지?

참고 : 연습을 위해 외부 유틸리티없이이 작업을 수행하고 싶습니다.

+4

Valgrind의 문제점은 무엇입니까? –

+0

@MitchWheat 나는 외부 유틸리티를 사용할 수 없다고 언급했다. –

+0

이것이 학습을위한 것이라면, valgrind가 어떻게하는지에 대해 배울 수있다. –

답변

35

제안한 바와 같이 Valgrind와 같은 우수한 도구가 이미 존재합니다. 또한

:

내가 연습 외부 유틸리티없이이 작업을 수행하고자하는
이 재미 있고 내가
당신은 메모리 사용량을 감지하는 매크로 트릭을 사용하여 수행 될 확신하고 누수 오류, 실제로 누설 감지기를 작성하십시오. 프로젝트에 할당 및 할당 취소 기능이 하나만 있으면이 작업을 수행 할 수 있어야합니다.

#define malloc(X) my_malloc(X, __FILE__, __LINE__, __FUNCTION__) 

void* my_malloc(size_t size, const char *file, int line, const char *func) 
{ 

    void *p = malloc(size); 
    printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size); 

    /*Link List functionality goes in here*/ 

    return p; 
} 

할당 된 위치의 파일 및 줄 번호로 연결된 주소의 연결된 목록을 유지 관리합니다. malloc의 항목으로 링크 목록을 업데이트합니다.

free에 대한 구현을 작성하면 연결된 목록에 대해 해제하라는 메시지가 표시되는 주소 항목을 확인할 수 있습니다. 일치하는 항목이 없으면 사용 오류가 발생하여 플래그를 지정할 수 있습니다.

프로그램 끝에서 연결된 목록의 내용을 로그 파일에 인쇄하거나 쓰십시오. 누수가없는 경우 연결된 목록에 항목이 없어야하지만 누수가있는 경우 로그 파일은 메모리가 할당 된 위치의 정확한 위치를 제공합니다.

이 매크로 트릭을 사용하면 어떤 함수가 제공하는지 유형 검사를 잃게된다는 점에 유의하십시오. 그러나 나는 많은 시간을 사용하는 깔끔한 작은 트릭입니다.

희망이 도움 모든 최고의, 소스 코드에 전화를 포장 할 것이다 당신이 GNU ld을 사용하는 경우, 당신은 링커가 모든 호출을 래핑 할 수 있습니다 @ 루게릭 병의 대답에 추가 :

+0

이것은 확실히 흥미있는 접근법입니다. malloc이 호출 된 후 크기가 자유롭게 호출 될 때 일부 카운터에 크기를 추가 할 수 있습니까? –

+3

그럴 수는 있지만 원하는대로 세분화 할 수는 없습니다. 2000 바이트를 잃었습니다. 2000 바이트 할당 하나 또는 10 200 바이트 할당 중 하나였습니까? 목록을 사용하면 로그를 통해 많은 일을 처리하는 데 많은 시간을 절약 할 수 있습니다. – Duck

+0

@MikeG : 예, Duck이 올바르게 말했듯이, 링크 된 목록은 오류 할당을 정확하게 결정할 수있는 유연성과 기능을 제공합니다. –

10

Valgrind이 필요합니다.

코드를 포함하지 않았지만 Algorithms in a Nutshell의 첫 장을 읽은 것을 기억합니다. 재미있게 찾은 경우를 대비하여 추가되었습니다.

우리가 이상 쓰기 malloc에 ​​ 기능 점수

는 사실, 당신이 할 수있는 할당에게 메모리를 malloc에 ​​대한 호출을 차단하고 추적 할 수있는 C에 과부하를 더 연산자는 없기 때문이다. LD_PRELOAD 읽기.

+0

Valgrind를 사용하는 법을 알고 있습니다. 직접 구현하려고합니다. –

+1

@MikeG : 암을 앓고 있고 병원에 대해 알고 있지만 연습을 위해 스스로 치료하려고하는 것과 같습니다. –

+5

@KerrekSB : 놀랍지는 않습니다. 훌륭한 학습 경험입니다. 물론, valgrind는 실시간 프로젝트 환경에서 가장 좋지만, 오랫동안 해봤을 때 좋은 학습 이었음을 인정해야합니다. 전에. –

4

(아마도 malloc, realloc, callocfree)을 링크 타임에 관계없이 가져옵니다. 그런 다음 __wrap_malloc 등을 쓰고 원래 함수를 __real_malloc과 같이 호출 할 수 있습니다.

이 공유 라이브러리에서 전화와 함께 작동하는 방법을 모르겠어요 http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html

--wrap=symbol를 참조하십시오. 나는 그렇지 않다고 추측하고있다. Hooks for Malloc

1

당신의 malloc, 무료 후크를 수정하는 방법입니다. 나는 의도적 인 메모리 누수로 테스트를했다. 나는 왜이 결과가 다른 개발자를 돕기 위해이 솔루션을 발견하는 데 엄청난 어려움을 겪었는지 알 수 없다.

+1

하이퍼 링크 변경을 참조하십시오. 링크에서 발견 한 솔루션을 설명해야합니다. –

1

사용이 자일링스 SDK의 GCC를 사용하여 자일링스 Zynq의 baremetal에 나를 위해 일한 기능을 mallinfo : 여기