맨위로가기

Valgrind

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Valgrind는 북유럽 신화의 발할라로 들어가는 주요 입구에서 이름을 따온, 동적 분석 도구들의 프레임워크이다. 줄리안 시워드가 최초 개발했으며, Just-in-time 컴파일 기술을 사용하여 가상 머신 기반으로 작동한다. Valgrind는 메모리 오류를 감지하는 Memcheck를 비롯한 다양한 도구를 제공하며, 멀티스레드 코드의 경쟁 조건, 캐시 프로파일링, 힙 프로파일링 등 다양한 분석 기능을 수행한다. 리눅스, macOS, FreeBSD, 솔라리스, 안드로이드 등 다양한 운영 체제를 지원하며, x86, x86-64, ARM, PowerPC, MIPS 등 여러 아키텍처를 지원한다. 하지만 정적 또는 스택 할당 데이터의 경계 오류를 모두 감지하지 못한다는 한계가 있다.

더 읽어볼만한 페이지

  • 프로파일러 - 프로파일링 (컴퓨터 프로그래밍)
    프로파일링(컴퓨터 프로그래밍)은 프로그램의 성능 분석 및 개선을 위한 기술로, 실행 시간 측정과 병목 현상 파악에 사용되며, 다양한 종류의 프로파일러가 존재한다.
  • 자유 소프트웨어 테스트 도구 - Cppcheck
    Cppcheck는 C/C++ 코드의 정적 분석 도구로서, 버그, 코드 스타일 문제, 성능 저하 요인 등을 검출하여 코드 품질을 향상시키고, 다양한 운영체제와 IDE에서 사용 가능한 오픈 소스 프로젝트이다.
  • 자유 소프트웨어 테스트 도구 - OneFuzz
    OneFuzz는 마이크로소프트가 소프트웨어 테스트 효율성을 위해 개발한 퍼징 도구로, 앙상블 퍼징, 프로그래밍 방식 결과 분석, 알림 콜백 기능을 제공하며, 2020년 공개되었으나 2023년 개발이 종료되고 GitHub 프로젝트는 보관되었다.
  • 소프트웨어 테스트 도구 - 코드 커버리지
    코드 커버리지는 테스트 스위트에 의해 실행된 코드의 비율을 측정하는 기준으로, 최종 제품 인증에 필요한 테스트 수준을 결정하며, 다양한 커버리지 기준 중 안전 필수 애플리케이션에서는 수정 조건/결정 커버리지(MC/DC)와 같은 고급 기준이 사용된다.
  • 소프트웨어 테스트 도구 - Doctest
    Doctest는 파이썬의 docstring과 내부 검사 기능을 활용하여 코드의 정확성을 검증하고 문서화하며, 테스트 실패 시 오류를 보고한다.
Valgrind - [IT 관련 정보]에 관한 문서
일반 정보
이름Valgrind 밸그라인드
개발자Valgrind 개발팀
출시일2002년 7월 27일
최신 안정화 버전3.23.0
최신 안정화 버전 출시일2024년 4월 26일
운영체제리눅스
FreeBSD
솔라리스
안드로이드
프로그래밍 언어C
장르프로파일러
메모리 디버거
라이선스GNU General Public License
웹사이트Valgrind 공식 웹사이트

2. 역사

Valgrind라는 이름은 북유럽 신화의 발할라로 들어가는 주요 입구를 참고하여 지어졌다.[18][19] 개발 기간(출시 전) 동안 프로젝트는 헤임달로 명명되었지만, 이 이름은 보안 패키지와 충돌할 수 있었다.

Valgrind의 원저자는 줄리안 시워드이며, 그는 2006년 Valgrind 작업으로 구글-오라일리 오픈 소스 어워드를 수상했다.[20][21]

Nicholas Nethercote, Bart Van Assche, Florian Krohm, Tom Hughes, Philippe Waroquiers, Mark Wielaard, Paul Floyd, Petar Jovanovic, Carl Love, Cerion Armour-Brown, Ivo Raisr 등 여러 개발자들이 Valgrind 개발에 기여했다.[22]

3. 작동 원리

Valgrind는 Just-in-time 컴파일(JIT) 기술과 동적 재컴파일을 사용하는 가상 머신을 기반으로 작동한다. 원래 프로그램은 호스트 프로세서에서 직접 실행되지 않고, VEX 라이브러리를 사용하여 중간 표현(IR)으로 변환된 후 도구에 의해 분석 및 계측된다.[6][7] 이 과정에서 성능 저하가 발생하지만, 디버깅 중에는 큰 문제가 되지 않는다.

Valgrind는 동일 아키텍처의 호스트 및 대상 CPU에서 실행되도록 이진 코드를 재컴파일한다. 시스템 콜은 호스트 OS의 시스템 콜을 호출하기 전에 Valgrind에서 처리된다. 가상 머신으로서 CPU와 메모리만 가상화하고, 그 외의 하드웨어는 호스트 OS의 것을 그대로 사용한다.

Valgrind는 클라이언트 프로그램의 거동을 투명하게 수정하는 기능 외에도, 클라이언트 프로그램에서 명시적으로 Valgrind의 기능을 호출할 수 있는 클라이언트 요청 기능을 제공한다.

3. 1. Instrumentation

Instrumentation은 코드 세그먼트(영역)에 필요한 내용을 추가하여 원하는 결과를 얻도록 하는 작업이다. 이러한 작업은 소스 코드, 프리프로세서, 어셈블리 코드, 기계 코드, 이진 실행 파일 등 여러 단계에서 수행될 수 있다.

일반적으로 정적 instrumentation은 위 단계의 코드를 분석하여 필요한 추가 코드를 삽입하고, instrumented code를 실행시켜 원하는 결과를 얻는다.

그러나 동적 instrumentation은 런타임에 instrumentation을 수행하여 바로 실행한다. 동적 instrumentation은 실행 중의 메모리나 캐시 동작을 관찰하여 대응할 수 있다는 장점이 있다. Valgrind는 대표적인 동적 instrumentation 프레임워크이다.

Valgrind는 Just-in-time 컴파일 기술, 동적 재컴파일을 포함하는 가상 머신이다. 원래 프로그램은 호스트 프로세서에서 직접 실행되지 않는다. 대신, Valgrind는 먼저 프로그램을 중간 표현(IR)으로 변환하는데, 이는 프로세서 중립적인 정적 단일 할당 형태 기반의 형태이다. 변환 후, 도구(아래 참조)는 Valgrind가 IR을 다시 기계어로 변환하여 호스트 프로세서가 실행하도록 하기 전에 IR에 대해 원하는 변환을 자유롭게 수행할 수 있다. Valgrind는 동일한 아키텍처의 호스트 및 대상(또는 시뮬레이션된) CPU에서 실행되도록 이진 코드를 재컴파일한다. 또한 Valgrind에서 실행되는 대상 프로그램의 디버깅을 허용하는 GDB 스텁이 포함되어 있으며, Valgrind 도구에 다양한 정보를 쿼리할 수 있는 "모니터 명령"이 있다.

이러한 변환(및 일반적으로 도구가 삽입하는 코드)에서 상당한 양의 성능이 손실된다. 일반적으로 Valgrind 및 "none" 도구(IR에 아무것도 하지 않음)로 실행되는 코드는 일반 프로그램 속도의 20%에서 25%로 실행된다.[6][7] Valgrind는 JIT 컴파일러(바이너리 변환) 기술을 사용한 가상 머신이다. 클라이언트 프로그램(원래 프로그램) 자체가 호스트 프로세서에서 직접 실행되는 것은 아니다. 대신 VEX라고 부르는 라이브러리를 사용하여 Valgrind는 먼저 클라이언트 프로그램을 중간 표현(IR)으로 변환한다. 중간 표현 자체는 프로세서 비의존적이며, SSA 기반이다. 변환 후, Valgrind가 중간 표현을 머신 코드로 다시 변환하여 호스트 프로세서에서 실행시키지만, 그 전후로 "도구"(아래 참조)는 IR에 대해 자유롭게 조작을 수행할 수 있다. 상당한 성능이 이러한 변환 과정(및 도구가 삽입하는 코드)에서 손실되며, 클라이언트 프로그램은 Valgrind 상에서 (전혀 도구를 사용하지 않는 경우에도) 통상보다 4~5배 느리게 동작한다. 그러나 가상 머신에 의한 IR 형태는 계측·분석·디버깅에 적합하여 도구 개발이 쉬워지며, 대부분의 클라이언트 프로그램에서는 디버깅 중 이러한 정도의 성능 저하는 큰 문제가 되지 않는다.

시스템 콜도 호스트 OS의 시스템 콜을 호출하기 전에 Valgrind에서 한 번 처리된다. 가상 머신으로서 가상화하는 것은 CPU와 메모리뿐이며, 그 외의 하드웨어는 호스트 OS의 것을 그대로 사용한다.

이는 클라이언트 프로그램의 거동을 Valgrind에서 투명하게 수정하는 기능이지만, 그 외에 클라이언트 프로그램에서 명시적으로 Valgrind의 기능을 호출할 수도 있다. 이 기능은 클라이언트 요청이라고 불리며, Valgrind의 유무 확인 및 설정 변경, 클라이언트 프로그램 측에서 관리하고 있는 메모리나 스택을 Valgrind에 추가, 발생한 에러의 출력 등을 제공한다. Valgrind가 투명하게 수정한 처리에 대해서도, Valgrind 내부에서는 클라이언트 요청으로서 Valgrind로 전달되는 경우가 있다.

4. 구조

Valgrind는 코어와 도구들로 구성된다. 코어는 인스트루멘테이션(instrumentation)을 위한 환경을 제공하며, 도구들은 인스트루멘트될(instrumented) 코드들을 포함한다. 코어는 도구의 함수들에 래퍼(wrapper)를 사용하여 모든 도구에 공통적인 동작을 수행한다. 도구들에 링크되는 코어는 해당 도구가 필요로 하는 동작을 자동으로 수행한다.[6][7]

Valgrind는 Just-in-time 컴파일 기술, 동적 재컴파일을 포함하는 가상 머신이다. 원래 프로그램의 어떠한 부분도 호스트 프로세서에서 직접 실행되지 않는다. 대신, Valgrind는 먼저 프로그램을 중간 표현(IR)이라고 하는 임시적이고 단순한 형태로 변환하는데, 이는 프로세서 중립적인 정적 단일 할당 형태 기반의 형태이다. 변환 후, 도구는 Valgrind가 IR을 다시 기계어로 변환하여 호스트 프로세서가 실행하도록 하기 전에 IR에 대해 원하는 변환을 자유롭게 수행할 수 있다. Valgrind는 동일한 아키텍처의 호스트 및 대상(또는 시뮬레이션된) CPU에서 실행되도록 이진 코드를 재컴파일한다.

5. 도구

Valgrind는 다양한 도구를 제공하며, 외부 도구도 사용할 수 있다. 이러한 도구들은 공유 라이브러리 형태로 제공되며, 동적 링커의 사전 로드 기능을 통해 클라이언트 프로그램보다 먼저 로드된다. 이를 통해 클라이언트 프로그램이 원래 참조하는 공유 라이브러리의 심볼을 Valgrind의 도구로 먼저 리졸브하여 동작을 변경한다.

Valgrind는 기본 도구 외에도 여러 가지 도구를 가지고 있다.

도구 이름설명
Memcheck메모리 오류를 검사하는 도구이다.
None분석을 수행하지 않고 가상 머신에서 코드를 실행한다. CPU 및 메모리 오버헤드가 가장 적다.
Massif 프로파일러. 별도의 GUI인 massif-visualizer로 시각화할 수 있다.
Helgrind 및 DRD멀티스레드 코드에서 경쟁 조건을 감지한다.
Cachegrind캐시 프로파일러. 별도의 GUI인 KCacheGrind로 시각화할 수 있다.
Callgrind호출 그래프 분석기. KCacheGrind로 시각화할 수 있다.
DHAT메모리 할당량과 기간, 메모리 사용 패턴을 분석하는 동적 힙 분석 도구.
exp-bbv작은 샘플 세트에서 성능을 추정하는 성능 시뮬레이터.



외부에서 개발된 도구도 있으며, 그 중 하나는 경쟁 조건을 감지하는 ThreadSanitizer이다.[11][12]

5. 1. Memcheck

Memcheck는 Valgrind의 기본 도구이자 가장 많이 사용되는 도구로, 메모리 관련 오류를 감지하는 데 사용된다. Memcheck는 거의 모든 명령어에 계측 코드를 삽입하여 메모리의 ''유효성''(V 비트)과 ''주소 지정 가능성''(A 비트)을 추적한다.[8]

  • V 비트: 메모리가 초기화되어 유효한 값을 가지는지 여부를 나타낸다. 할당되지 않은 메모리는 초기화될 때까지 유효하지 않은(정의되지 않은) 상태로 시작한다.
  • A 비트: 메모리 주소가 할당되고 해제되지 않은 메모리 블록을 가리키는지 여부를 나타낸다.


Memcheck는 데이터를 이동하고 조작할 때도 A 비트와 V 비트를 1비트 수준까지 정확하게 추적한다.[8]

또한, Memcheck는 표준 [https://en.cppreference.com/w/cpp/memory/new/operator_new C++ 할당자] 및 C 메모리 할당자를 자체 구현으로 대체한다. 이 대체된 할당자는 할당된 모든 블록 주변에 ''메모리 가드''(A 비트가 "유효하지 않음"으로 설정됨)를 포함한다. 이 기능을 통해 Memcheck는 오프 바이 원 에러를 감지할 수 있다.[8]

Memcheck가 감지할 수 있는 문제점은 다음과 같다.[8]

  • 초기화되지 않은 메모리 읽기
  • 유효하지 않은 메모리 읽기/쓰기 (다음의 경우를 포함)
  • free된 메모리
  • malloc된 블록 외부의 메모리
  • 스택 포인터 아래의 메모리
  • 시스템 호출에 잘못된 매개변수 사용
  • mem*str* 함수를 사용한 안전하지 않은 중복 메모리 복사
  • 메모리 누수
  • 불일치하는 할당 및 할당 해제 (다음의 경우를 포함)
  • C와 C++ 혼합 (예: mallocdelete)
  • 스칼라와 배열 혼합 (예: newdelete[])
  • 크기가 지정된 할당 해제가 할당과 동일한 크기가 아님
  • 정렬된 할당 해제가 할당과 동일한 정렬이 아님
  • 잘못된 정렬 사용
  • 크기가 0인 realloc 사용


Memcheck를 사용하면 성능 저하가 발생한다. Memcheck에서 실행되는 프로그램은 일반적으로 Valgrind 외부에서 실행하는 것보다 20–30배 느리고 더 많은 메모리를 사용한다.[8] 이러한 성능 저하 때문에, 개발자들은 주로 특정 버그를 추적하거나 잠재적 버그가 없는지 확인하기 위해 Memcheck를 사용한다.[8]

Memcheck의 중요한 제한 사항은 정적 또는 스택 할당 데이터 사용 시 경계 오류를 모두 감지할 수는 없다는 것이다.[24] 특정 유형의 스택 오류는 소프트웨어를 스택 스매싱 익스플로잇에 취약하게 만들 수 있기 때문에 주의가 필요하다.

5. 2. 기타 도구

Memcheck 외에도 Valgrind는 여러 도구를 가지고 있다.[9]

  • '''None''': 분석을 수행하지 않고 가상 머신에서 코드를 실행하므로 모든 도구 중에서 CPU 및 메모리 오버헤드가 가장 적다. Valgrind 자체가 세그멘테이션 오류에서 추적을 제공하므로 ''None'' 도구는 최소한의 오버헤드로 이 추적을 제공한다.
  • '''Massif''': 프로파일러이다. 별도의 GUI인 massif-visualizer는 Massif의 출력을 시각화한다.
  • '''Helgrind''' 및 '''DRD''': 멀티스레드 코드에서 경쟁 조건을 감지한다.
  • '''Cachegrind''': 캐시 프로파일러이다. 별도의 GUI인 KCacheGrind는 Cachegrind의 출력을 시각화한다.
  • '''Callgrind''': Josef Weidendorfer가 제작한 호출 그래프 분석기로, 버전 3.2.0부터 Valgrind에 추가되었다. KCacheGrind는 Callgrind의 출력을 시각화할 수 있다.
  • '''DHAT''': 메모리 할당량과 기간, 그리고 메모리 사용 패턴을 분석하는 동적 힙 분석 도구이다.
  • '''exp-bbv''': 작은 샘플 세트에서 성능을 추정하는 성능 시뮬레이터이다.


또한 외부에서 개발된 여러 도구도 있다. 이러한 도구 중 하나는 경쟁 조건을 감지하는 또 다른 도구인 ThreadSanitizer이다.[11][12]

6. 지원 플랫폼

Valgrind는 리눅스, macOS, 솔라리스를 지원하며, AMD, X86, PPC, AIX, MIPS 등의 아키텍처를 지원한다.[13][4][14] 3.7.0 버전부터는 ARM/안드로이드 플랫폼도 지원한다.[4]

현재 버전 3.23.0 기준으로, Valgrind가 지원하는 플랫폼은 다음과 같다.

플랫폼아키텍처
리눅스x86, x86-64, ARM (32비트/64비트), PPC32, PPC64, s390x, MIPS32, MIPS64
안드로이드ARM (2.3 이상), x86 (4.0 이상), MIPS32
macOSx86, x86-64 (OS X 10.9 이상. 10.8은 제한적인 지원만 제공)
FreeBSDx86, x86-64 (11.3-RELEASE 이상), ARM (14.0-RELEASE 이상, 64비트)
솔라리스, illumosx86, x86-64 (솔라리스 11 이상)



OpenBSD,[15] NetBSD[16] 및 QNX[17] 와 같은 다른 유닉스 계열 플랫폼 및 새로운 CPU 아키텍처에 대한 비공식적인 포팅 버전도 존재한다. 공식적으로 인식된 것은 다음과 같다.

7. 확장성

Valgrind는 리눅스, macOS, 솔라리스를 지원하며, AMD, X86, PPC, AIX, MIPS 등 다양한 아키텍처를 지원한다.[13][4][14] 3.7.0 버전부터는 ARM/안드로이드 플랫폼도 지원한다.[4] 이 외에도 FreeBSD, OpenBSD,[15] NetBSD,[16] QNX[17]와 같은 유닉스 계열 플랫폼에 대한 비공식적인 포팅도 존재한다.

Valgrind는 클라이언트 요청을 통해 기능을 명시적으로 호출할 수 있다. 클라이언트 요청은 Valgrind 유무 확인, 설정 변경, 메모리/스택 추가, 에러 출력 등의 기능을 제공한다.

8. 한계

Memcheck는 정적 또는 스택 할당 데이터 사용 시 경계 오류의 모든 경우를 감지할 수 없다.[24] 다음 코드는 주석에 설명된 오류가 포함되어 있음에도 불구하고 Valgrind의 ''Memcheck'' 도구를 문제 없이 통과한다.

```c

int Static[5];

int func(void)

{

int Stack[5];

Static[5] = 0; /* Static[0] 부터 Static[4] 까지 존재하며, Static[5] 는 경계 밖임 */

Stack [5] = 0; /* Stack[0] 부터 Stack[4] 까지 존재하며, Stack[5] 는 경계 밖임 */

return 0;

}

```

스택 할당 데이터의 접근과 관련된 모든 오류를 감지할 수 없다는 점은 특히 주목할 만하다. 왜냐하면 특정 유형의 스택 오류는 소프트웨어를 고전적인 스택 스매싱 익스플로잇에 취약하게 만들기 때문이다.

참조

[1] 웹사이트 AUTHORS https://valgrind.org[...] 2022-09-19
[2] 웹사이트 Valgrind: The Developers https://valgrind.org[...]
[3] 웹사이트 Twenty years of Valgrind https://nnethercote.[...] 27 July 2022 2023-08-04
[4] 뉴스 Valgrind release notes https://valgrind.org[...]
[5] 웹사이트 Valgrind https://valgrind.org[...] 2023-05-04
[6] 웹사이트 Valgrind homepage https://valgrind.org[...]
[7] 문서 Valgrind Manual http://www.network-t[...]
[8] 웹사이트 Valgrind https://valgrind.org[...]
[9] 웹사이트 Valgrind main tool list https://valgrind.org[...]
[10] 웹사이트 Valgrind https://valgrind.org[...]
[11] 웹사이트 Valgrind: Variants / Patches https://valgrind.org[...]
[12] 논문 ThreadSanitizer–data race detection in practice http://data-race-tes[...] Proceedings of the Workshop on Binary Instrumentation and Applications WBIA'09
[13] 문서 ARM/Linux port http://talk.maemo.or[...]
[14] 문서 OS X port http://blog.mozilla.[...]
[15] 문서 Valgrind OpenBSD port http://ports.su/deve[...]
[16] 웹사이트 Valgrind NetBSD port https://web.archive.[...] 2006-01-28
[17] 웹사이트 foundry27 : View Release https://community.qn[...] 2024-05-24
[18] 문서 Valgrind FAQ http://www.valgrind.[...]
[19] 웹사이트 Grímnismál https://www.voluspa.[...]
[20] 웹사이트 valgrind.org's list of awards https://valgrind.org[...]
[21] 웹사이트 Google-O'Reilly Open Source Awards – Hall of Fame http://code.google.c[...]
[22] 웹사이트 The Valgrind Developers https://valgrind.org[...]
[23] 웹사이트 valgrind.org's list of users https://valgrind.org[...]
[24] 웹사이트 Valgrind FAQ http://www.valgrind.[...]
[25] 웹사이트 Current Releases https://valgrind.org[...] 2024-07-08
[26] 웹사이트 Valgrind FAQ http://www.valgrind.[...]
[27] 웹사이트 valgrind.org's list of users http://valgrind.org/[...]
[28] 웹사이트 Valgrind FAQ http://www.valgrind.[...]
[29] 웹사이트 pkgsrc/devel/valgrind/ http://cvsweb.netbsd[...] NetBSD 2024-07-09
[30] 웹사이트 petrpavlu/valgrind-riscv64: Valgrind with support for the RISCV64/Linux platform. https://github.com/p[...] Petr Pavlu 2024-07-09
[31] 웹사이트 valgrind.org's list of awards http://valgrind.org/[...]
[32] 웹사이트 Google-O'Reilly Open Source Awards - Hall of Fame https://code.google.[...]
[33] 웹인용 Valgrind News http://www.valgrind.[...]
[34] 뉴스 Valgrind release notes http://valgrind.org/[...]
[35] 웹사이트 Valgrind FAQ http://www.valgrind.[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com