C언어가 다른 프로그래밍 언어에 비해서 가지는 장점은 속도와 메모리 접근성일 것이다. C는 역사가 오래된 언어이기 때문에 기계어랑 가까운 편에 속하고 실행 속도도 빠르다. 무엇보다 메모리에 직접 접근이 가능한 장점 덕분에 임베디드 시스템에서도 오랫동안 자리를 차지한 언어이다.
하지만 C언어는 다른 언어에 비해 복잡하고, 메모리 누수를 막지 못하면 프로그램의 효율이 떨어지는 단점을 가지고 있다. C로 프로그램을 작성하고 나서 메모리 누수가 나면 매우 안타깝다. 이럴 때 간단하게 메모리 누수를 확인하는 Tool이 있다.
1. (MAC 한정) leaks
leaks [PID] 를 이용하면은 현재 메모리 누수가 얼마나 있는지 확인이 가능하다. 하지만 정확도가 낮은 편이고, 맥 에서만 지원되는 프로그램이기에 간단히 테스트하는 용도로 쓰면 될 것 같다. 사용법을 간단히 알아보자.
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a = malloc(sizeof(char) * 5);
a = "1234";
while(1);
}
|
cs |
위의 소스를 보면 a에 동적할당 후 free를 하지 않았으므로 5 바이트의 메모리 누수가 있을 것이다. 또한 while(1) 로 프로그램이 종료되지 않게 했다. 이 소스를 실행 후 (컴파일에 -g 플래그를 넣자. 디버그 할때 역추적을 할 수 있다.) 새 터미널에서 ps -al 명령어로 이 프로그램의 PID를 알아낸다. 마지막으로 leaks [해당 프로그램의 PID] 를 실행하면 어디서 누수가 났는지 알 수 있다. 더 좋은 방법도 있다.
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a = malloc(sizeof(char) * 5);
a = "1234";
system("leaks a.out");
return (0);
}
|
cs |
system 함수를 이용하여 "leaks 파일이름" 을 매개변수로 넣으면 알아서 출력이 된다.
2. valgrind
이 프로그램은 따로 설치를 해야 한다. 맥은 brew install valgrind , 윈도우는 sudo apt install valgrind 명령어로 설치를 할 수 있다. 실행법은 valgrind [실행파일 이름] 이다. 1번의 후자 코드로 테스트 해 보았다.
LEAK SUMMARY에서 정확히 5바이트의 메모리 누수가 일어난 것을 알 수 있다. 또한 잘못된 메모리 접근에 대해서도 알 수가 있다.
3. lldb
lldb도 valgrind와 사용법이 비슷하다. 설치는 따로 하는것이 좋으며, lldb [실행파일 이름] 으로 실행한다. 프로그램 실행 하면 아무것도 보이지 않을 것이다. 여기서 사용하는 명령어를 알아보자.
run : 프로그램을 끝까지 실행 후 메모리를 진단.
b [함수이름] : 함수에 Break Point 걸기
b [filename] : 7 : filename의 7번째 줄에 Break Point 걸기
b del : Break Point 지우기
메모리 누수를 잡는 법은 많다. 하지만 결국 누수를 잡는것은 사람이므로, 프로그램 구조에 대한 이해와 꼼꼼히 분석하는 능력을 길러야 한다.
'프로그래밍 언어 > C C++' 카테고리의 다른 글
C언어의 static 변수 (2) | 2021.06.08 |
---|---|
size_t 는 무엇일까? (0) | 2021.05.28 |
줄넘김 문자 endl , \n 차이 (0) | 2021.03.24 |
gcc 를 이용해 c언어 간단히 컴파일하기 (0) | 2021.03.23 |
main 함수에 입력 변수 설정하기 (0) | 2021.03.03 |