NAME
mtrace, muntrace - malloc 추적
SYNOPSIS
#include <mcheck.h>
void mtrace(void);
void muntrace(void);
DESCRIPTION
mtrace()
함수는 메모리 할당 함수들(malloc(3), realloc(3), memalign(3), free(3))에 훅 함수를 설치한다. 그 훅 함수들에서는 메모리 할당과 해제에 대한 추적 정보를 기록한다. 그 추적 정보를 이용해 프로그램 내의 메모리 누수와 비할당 메모리 해제 시도를 찾아낼 수 있다.
muntrace()
함수는 mtrace()
로 설치한 훅 함수들을 비활성화해서 메모리 할당 함수들에 대한 추적 정보를 더이상 기록하지 않게 한다. mtrace()
로 설치했던 훅 함수가 없으면 muntrace()
는 아무것도 하지 않는다.
mtrace()
를 호출하면 환경 변수 MALLOC_TRACE
의 값을 확인하는데, 추적 정보를 기록할 파일의 경로명을 담고 있어야 한다. 그 경로명이 성공적으로 열리면 파일을 길이 0으로 잘라낸다.
MALLOC_TRACE
가 설정돼 있지 않거나, 지정한 경로명이 유효하지 않거나 쓰기 가능하지 않으면 훅 함수를 설치하지 않으며 mtrace()
가 아무것도 하지 않는다. set-user-ID 및 set-group-ID 프로그램에서는 MALLOC_TRACE
를 무시하며 mtrace()
가 아무것도 하지 않는다.
ATTRIBUTES
이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.
인터페이스 | 속성 | 값 |
---|---|---|
mtrace() , muntrace() |
스레드 안전성 | MT-Unsafe |
CONFORMING TO
이 함수들은 GNU 확장이다.
NOTES
일반적인 사용 방식에서는 프로그램 실행 시작 때 mtrace()
를 한 번 호출하고 muntrace()
는 전혀 호출하지 않는다.
mtrace()
호출 후 나오는 추적 출력은 텍스트지만 사람이 읽도록 만들어진 건 아니다. GNU C 라이브러리에서 제공하는 펄 스크립트 mtrace(1)
가 그 추적 로그를 해석해서 사람이 읽을 수 있는 출력을 내놓는다. 보기 좋은 결과를 위해선 추적 대상 프로그램을 컴파일 할 때 디버깅을 켜서 실행 파일에 행 번호 정보를 기록하게 하는 게 좋다.
mtrace()
로 수행하는 추적은 (MALLOC_TRACE
가 유효하고 쓰기 가능한 경로명을 가리킨다면) 성능 저하를 유발한다.
BUGS
mtrace(1)
가 내놓는 행 번호 정보가 항상 정확하지는 않다. 행 번호가 소스 코드에서 앞이나 뒤의 (비어 있지 않은) 행을 가리킬 수도 있다.
EXAMPLES
아래의 셸 세션은 두 군데에 메모리 누수가 있는 프로그램으로 mtrace()
함수와 mtrace(1)
명령 사용 방식을 보여 준다. 다음 프로그램을 사용한다.
$ cat t_mtrace.c
#include <mcheck.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
mtrace();
for (int j = 0; j < 2; j++)
malloc(100); /* free 안 함 - 메모리 누수 */
calloc(16, 16); /* free 안 함 - 메모리 누수 */
exit(EXIT_SUCCESS);
}
다음과 같이 프로그램을 돌리면 mtrace()
가 프로그램 내의 두 곳에서 메모리 누수를 진단하는 것을 볼 수 있다.
$ cc -g t_mtrace.c -o t_mtrace
$ export MALLOC_TRACE=/tmp/t
$ ./t_mtrace
$ mtrace ./t_mtrace $MALLOC_TRACE
Memory not freed:
-----------------
Address Size Caller
0x084c9378 0x64 at /home/cecilia/t_mtrace.c:12
0x084c93e0 0x64 at /home/cecilia/t_mtrace.c:12
0x084c9448 0x100 at /home/cecilia/t_mtrace.c:16
처음 두 메시지는 for
루프 안의 malloc(3) 호출 두 번에 해당하는 해제 안 된 메모리에 대한 것이다. 마지막 메시지는 calloc(3) 호출(내부에서 다시 malloc(3) 호출함)에 해당한다.
SEE ALSO
mtrace(1)
, malloc(3), malloc_hook(3), mcheck(3)
2021-03-22