일반적으로 클러스터 환경에서 메모리 누수를 확인할 때 leaks 명령어를 많이 사용할 것이다. main문 마지막에 무한루프를 걸고 터미널에서 leaks 쉘 명령어를 이용하거나, system 함수를 이용해 system(”leaks a.out”)을 이용하곤 한다.
하지만 에러 처리를 하다보면 다른 함수 내에서 exit을 하는 경우도 많이 생기는데, 이럴 때는 main문 마지막의 system 함수가 호출되지 않는다는 문제가 있다. 이럴 때 atexit 함수를 이용할 수 있다.
#include <stdlib.h>
int atexit(void (*function)(void));
C
복사
atexit으로 프로세스가 정상종료될 때 호출될 함수를 등록할 수 있다. 다음과 같이 쓰면 된다.
#include <stdlib.h>
#include <stdio.h>
void function_1(void)
{
printf("function_1\n");
do_something_1();
exit(42);
}
void function_2(void)
{
printf("function_2\n");
do_something_2();
return ;
}
void check_leak(void)
{
system("leaks a.out");
}
int main(int argc, char **argv)
{
atexit(check_leak); //check_leak 함수가 프로세스 종료시 실행되도록 등록
if (argc > 3)
function_1();
else
function_2();
return (0);
}
C
복사
atexit의 인자로 호출하고 싶은 함수 포인터를 넣어주면 된다. 우리는 누수를 확인하고 싶으므로 system(”leaks a.out”) 을 실행하는 함수를 만들어 넣어주었다.
어느 분기에서 프로세스가 종료되든 leaks가 실행되는 것을 확인할 수 있다.
참고:
system 함수에 대한 설명: 문자열을 인자로 받아, 해당 문자열을 쉘에서 실행해주는 함수이다.
#include <stdlib.h>
int system(const char *command);
C
복사
자식 프로세스를 포크하고 쉘에서 명령어를 실행하는 것이기 때문에 아래과 같이 동작한다고 되어있다.
execl("/bin/sh", "sh", "-c", command, (char *) NULL);