본문 바로가기
다양한 TIP

C++ 메모리 누수(C++ memory leak check)

by 유기농프로그래밍 2024. 3. 19.
반응형

Valgrind의 Massif 도구로 메모리 사용 분석하기

리눅스 환경에서 개발하는 많은 개발자들이 성능 최적화의 일환으로 메모리 사용량을 분석하고자 할 때, Valgrind의 Massif 도구를 활용하는 것이 탁월한 선택입니다. 이 글에서는 valgrind --tool=massif ./your_program 명령어의 사용법, 의미 및 분석 방법에 대해 상세히 알아보겠습니다.

 

Massif란 무엇인가?

Massif는 Valgrind 도구 모음 중 하나로, C, C++ 등에서 개발된 프로그램의 힙 메모리 사용을 분석하는 도구입니다. 메모리 누수 검사, 메모리 사용량 최적화 등을 위해 사용되며, 프로그램 실행 중 메모리 할당 및 해제 패턴을 상세히 기록합니다. Massif는 프로그램의 메모리 사용량을 시간에 따라 그래프로 시각화해줌으로써, 메모리 사용량의 변화를 쉽게 파악할 수 있게 해줍니다.

 

Massif 사용법

 

명령어 구조

valgrind --tool=massif ./your_program


이 명령어는 Valgrind를 사용하여 ./your_program (여러분의 프로그램 경로와 이름)을 실행하며, --tool=massif 옵션을 통해 Massif 도구를 선택적으로 사용하겠다는 것을 의미합니다.

 

실행 과정

분석 대상 프로그램 실행: 이 명령어는 프로그램을 실행시키면서 메모리 사용 분석을 시작합니다. 분석은 프로그램이 시작될 때부터 종료될 때까지 진행됩니다.


결과 파일 생성: 프로그램 실행이 완료되면, Massif는 massif.out.xxxx (여기서 xxxx는 프로세스 ID)라는 이름의 파일에 분석 결과를 저장합니다.

 

분석 결과 확인

분석이 완료된 후, ms_print 유틸리티를 사용하여 결과를 보기 쉽게 출력할 수 있습니다.

ms_print massif.out.xxxx

이 명령은 분석 결과를 상세히 출력하여, 메모리 사용량의 추이, 가장 많은 메모리를 사용하는 코드 영역 등을 확인할 수 있게 해줍니다.

 

 

분석 결과 해석하기

Massif 분석 결과에는 다음과 같은 정보가 포함됩니다:


메모리 사용량의 시간별 추이: 프로그램 실행 동안의 메모리 사용량 변화를 그래프로 보여줍니다.
메모리 사용량의 상세 내역: 특정 시점에서 메모리 사용량이 가장 많은 부분을 상세히 분석하여 제공합니다.
호출 스택 정보: 메모리 사용량이 많은 코드 영역을 식별할 수 있도록, 해당 메모리 할당을 호출한 스택의 정보를 제공합니다.

 

 

메모리 최적화 전략

분석 결과를 통해 메모리 사용량이 많은 부분을 식별한 후, 다음과 같은 방법으로 메모리 최적화를 시도할 수 있습니다:

불필요한 메모리 할당 제거: 메모리 사용량이 많은 부분에서 불필요한 메모리 할당이 있는지 검토합니다.
데이터 구조 최적화: 데이터구조를 적합하도록 검토합니다.

 

 

추가 꿀팁!

Process에서 fork된 것까지 분석하는 옵션입니다.

 

 Valgrind와 Massif는 기본적으로 부모 프로세스를 계속해서 모니터링하며, 자식 프로세스는 별도로 추적되지 않습니다. 그러나 Massif는 자식 프로세스의 메모리 사용 분석을 위한 옵션을 제공합니다.

 

자식 프로세스 분석하기

Massif는 --trace-children=yes 옵션을 사용하여 fork()로 생성된 자식 프로세스들의 메모리 사용도 분석할 수 있도록 합니다. 이 옵션을 사용하면, 모든 자식 프로세스가 자동으로 Massif에 의해 분석됩니다. 각각의 프로세스는 개별적인 분석 파일을 생성하며, 이 파일들은 프로세스 ID를 사용하여 구분됩니다.

valgrind --tool=massif --trace-children=yes ./your_program

 

고려사항

분석 파일: --trace-children=yes 옵션을 사용하면, 부모 프로세스와 각 자식 프로세스마다 별도의 분석 파일이 생성됩니다. 파일 이름은 massif.out.<pid> 형식을 따르며, 여기서 <pid>는 각 프로세스의 ID입니다.


성능 영향: Valgrind는 프로그램 실행 속도를 상당히 느리게 만들 수 있습니다. 특히, 많은 수의 자식 프로세스를 생성하는 프로그램을 분석할 때는 이러한 성능 저하가 더욱 두드러질 수 있습니다. 실제 성능과는 다를 수 있으므로, 분석 결과를 해석할 때 주의가 필요합니다.


자원 한계: 시스템에 따라 동시에 실행할 수 있는 프로세스의 수나 생성할 수 있는 파일의 수에 제한이 있을 수 있습니다. --trace-children=yes 옵션을 사용할 때 이러한 한계에 도달하지 않도록 주의해야 합니다.

분석 파일 확인

Massif가 생성한 분석 파일을 확인하기 위해서는 ms_print 유틸리티를 사용합니다. 이 유틸리티는 Massif의 출력 파일을 해석하여, 메모리 사용량에 대한 그래픽과 상세 정보를 제공합니다.

ms_print massif.out.<pid>

 

fork()를 사용하는 프로그램을 분석할 때는, 각각의 프로세스가 어떻게 메모리를 사용하는지 이해하기 위해 부모와 자식 프로세스의 분석 파일 모두를 검토할 필요가 있습니다. 이러한 분석을 통해 전체 프로그램의 메모리 사용 패턴을 파악할 수 있습니다.

반응형

댓글