Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-16 04:51
관리 메뉴

nomad-programmer

[Programming/Tools] valgrind (Memcheck, a memory error detector) 본문

Programming/Tools

[Programming/Tools] valgrind (Memcheck, a memory error detector)

scii 2020. 6. 17. 23:43

대규모의 복잡한 프로그램에서 버그를 찾으려면 정말 오랜 시간이 걸릴 수도 있다. 그래서 다양한 도구들을 이용하여 찾아내 수정해야 한다. 그 도구 중 valgrind를 소개한다.

리눅스 운영체제에서 사용하는 도구 중 "valgrind" 라는 것이 있다. 한마디로 메모리 누수를 검사하는 프로그램이다.

valgrind 는 heap 영역에 할당된 데이터를 감시할 수 있다. 이 프로그램은 가짜 malloc() 함수를 구현해 작동한다. 여러분의 프로그램이 heap 메모리에 할당할 때 valgrind는 malloc()과 free() 함수에 대한 호출을 가로채 자신이 만든 버전을 실행한다. 

valgrind가 구현한 가짜 malloc()은 어느 코드가 호출하는지 어느 메모리가 할당되었는지 기록한다. 프로그램이 실행을 마치면 valgrind는 heap 영역에 남아 있는 데이터에 대한 보고서를 작성해 코드의 어느 부분이 데이터를 생성했는지 알려준다.

더보기

gcc -g test.c -o test

-g 옵션을 붙이면 컴파일한 코드에 소스 코드 줄 수를 저장하도록 컴파일에게 명령한다.

 

디버그 정보를 추가해 프로그램을 준비

valgrind를 제대로 사용하려면 실행 파일에 디버그 정보가 포함되어 있어야 한다. 디버그 정보는 당신의 코드를 컴파일할 때 실행 파일에 추가된 여분의 데이터를 말한다. 어떤 코드가 소스코드의 어느 줄이 컴파일되어 생성된 코드인지 알려주는 줄 번호와 같은 정보가 포함된다. 디버그 정보가 있으면 valgrind는 메모리 누스가 발생한 곳에 대해 자세한 정보를 제공할 수 있다.

실행 파일에 디버그 정보를 추가하려면 소스코드를 컴파일할 때 -g 옵션을 사용해야 한다.

 

valgrind 사용 예

valgrind --leak-check=full ./test

valgrind 실행 결과

위의 사진을 보면 메모리 누수가 없음을 확인할 수 있다.

valgrind 실행 결과

heap 영역에 메모리 누수가 발생했다는 것을 확인할 수 있다. 

valgrind는 다음과 같은 정보를 알려준다.

1. 30바이트 메모리가 할당되었지만 해제되지 않았다.

2. 어느 부분에서 메모리 누수가 발생했는지 알려준다.

3. 3개의 오류가 발견되었다. 

 

메모리 누수 문제 해결

1. 메모리 누수가 언제 발생했는지 찾아낸다.

2. 메모리 누수가 발생한 위치를 찾아낸다.

3. 메모리 누수가 해결되었는지 검사해 확인한다.

valgrind의 메모리 누수 오류 정보를 참조해 해결한 모습

 

메모리 누수는 프로그램 버그에서 가장 찾기 힘든 버그 중 하나이다. 널리 쓰이고 있는 프로그램 중에 상당수는 코드 깊숙한 곳에 메모리 버그를 갖고 있을 수도 있다. 

때문에 바로 valgrind와 같은 도구가 중요한 이유이다.

 

정리

* valgrind는 메모리 누수를 검사한다.

* valgrind는 malloc()과 free()에 대한 호출을 가로채 표준 라이브러리 대신 valgrind의 함수를 호출하게 한다.

* 프로그램이 실행을 끝내면 valgrind는 heap 영역에 남아 있는 데이터에 대한 정보를 상세히 출력한다.

* 프로그램이 실행을 끝내면 valgrind는 heap 영역에 남아 있는 데이터에 대한 정보를 상세히 출력한다.

* 프로그램을 컴파일할 때 디버그 정보를 포함시키면 valgrind는 매우 자세한 정보를 제공한다.

* 프로그램을 여러 번 실행시키면 메모리 누수가 발생하는 곳의 위치를 더 정확히 찾을 수 있다.

* valgrind는 코드의 몇 번째 줄이 heap 영역에 데이터를 만들었는지 알려준다.

* valgrind를 사용해 메모리 누수를 해결했는 지 확인할 수 있다.

'Programming > Tools' 카테고리의 다른 글

[Programming/Tools] gcc 옵션 설명  (0) 2020.06.21
Comments