LeakSanitizer 사용법

LeakSanitizer(LSan)은 AddressSanitizer(ASan)에 통합된 메모리 누수를 검출하는 도구이다. 주로 C/C++ 프로그램의 메모리 누수를 탐지하는 데에 사용된다. 이 도구는 GCC와 Clang 컴파일러에서 지원되며, 메모리 할당 및 해제 시점에서 메모리 누수를 감지하여 개발자가 신속하게 해결할 수 있도록 도와준다. 이번 글에서는 LeakSanitizer의 사용법에 대해 알아본다.

LeakSanitizer는 ASan 빌드에서 기본적으로 활성화 되어 있으며, ASAN_OPTIONS=detect_leaks=1 옵션과 함께 활성화 될 수 있다.

AddressSanitizer로 LeakSanitizer 사용

예제 코드

#include <stdlib.h>
#include <stdio.h>

void *p;
void bar() {
    void *p = malloc(7);
    p = 0; // The memory is leaked here.
    printf("p = %p\n", p);
}

void foo() {
    bar();
}

int main() {
    foo();
    return 0;
}

AddressSanitizer를 사용하여 컴파일(-fsanitize=address) 및 실행

LeakSanitizer 기능을 사용하지 않고 ASan을 사용하려면, ASAN_OPTIONS 환경 변수에 detect_leaks=0 로 설정하면 된다.

Stand-alone 모드 사용

AddressSanitizer 없이 LeakSanitizer만 사용하려면 -fsanitize=leak 옵션으로 컴파일 하면 된다. 이렇게 하면 LeakSanitizer가 작동하는데 필요한 요소만 포함되기 때문에 상대적으로 성능 문제에서 조금 더 자유롭게 사용할 수 있다.

성능 비교는 다음 글을 참고한다: LSan 성능 비교

Flags

flagdefaultdescription
exitcode23leak이 인지되었을 때 종료되는 exitcode를 지정
max_leaks00이 아니면, 지정한 만큼만 상위 항목을 리포트함
suppressions(none)suppression을 포함하는 파일 경로
print_suppressions11이면, suppression에 일치되는 통계치를 출력
report_objects01이면, LSan이 개별 leak 객체에 대해 리포트함
use_unaligned00이면, aligned 8-byte 패턴을 사용한다. 1이면, unaligned pattern을 포함한다

Suppressions

LeakSanitizer가 인지된 leak 중에 특정하여 무시하도록 지시 할 수 있는 내용을 포함하는 파일 경로를 지정한다. 파일에는 한 줄에 하나씩 suppression 규칙을 포함되어야 하며, 포멧은 leak:<pattern> 형식으로 지정하면 된다.

예제 소스:

#include <stdlib.h>
#include <stdio.h>

void FooBar() {
  malloc(7);
}

void Baz() {
  malloc(5);
}

int main() {
  FooBar();
  Baz();
  return 0;
}

실행 결과:

참고 사이트

답글 남기기