발그린드

Valgrind
발그린드
Valgrind logo.png
원저작자줄리언 시워드
개발자발그린드 개발팀[1]
안정된 릴리스3.19.0 (2022년 4월 11일, 3개월 전 (2022-04-11) [±][2]
저장소
운영 체제리눅스
MacOS
솔라리스
안드로이드[3]
유형프로파일러, 메모리 디버거
면허증.GNU 일반 공중 라이선스
웹 사이트www.valgrind.org

Valgrind(/'vél'r'nd/)메모리 디버깅, 메모리누전 검출 및 프로파일링위한 프로그래밍 도구입니다.

Valgrind는 원래 x86에서 Linux를 위한 무료 메모리 디버깅 도구로 설계되었지만 이후 체커나 프로파일러 등의 동적 분석 도구를 만드는 일반적인 프레임워크로 발전했습니다.

발그린드라는 이름은 북유럽 [4]신화에 나오는 발할라의 주요 입구를 가리킨다.개발 중(출시 전) 프로젝트 이름은 Heimdall이었지만 보안 패키지와 충돌했을 수 있습니다.

개요

Valgrind는 본질적으로 동적 재컴파일을 포함한 JIT(Just-In-Time) 컴파일 기술을 사용하는 가상 머신입니다.호스트 프로세서에서 직접 실행되는 것은 원래 프로그램의 아무것도 실행되지 않습니다.Valgrind는 먼저 프로그램을 프로세서 중립적인 SSA 기반 형식인 Intermediate Representation(IR; 중간 표현)이라고 하는 임시적이고 단순한 형식으로 변환합니다.변환 후 툴(아래 참조)은 IR을 머신 코드로 변환하여 호스트 프로세서가 실행할 수 있도록 하기 전에 IR에서 원하는 변환을 자유롭게 수행할 수 있습니다.Valgrind는 동일한 아키텍처의 호스트 및 타깃(또는 시뮬레이션된) CPU에서 실행할 바이너리 코드를 다시 컴파일합니다.또한 GDB stub을 포함하고 있어 Valgrind에서 실행할 때 타깃 프로그램을 디버깅할 수 있으며, 다양한 정보를 얻기 위해 Valgrind 툴에 쿼리를 할 수 있는 "monitor 명령어"도 포함되어 있습니다.

이러한 변환(그리고 통상 툴이 삽입하는 코드)에서는 상당한 퍼포먼스가 손실됩니다.보통 Valgrind를 사용한 코드 실행과 none 툴(IR에 아무것도 하지 않음)은 일반 프로그램 속도의 [5][6]20~25%로 실행됩니다.

도구들

메모리 체크

Valgrind에는 여러 개의 툴이 포함되어 있습니다(또한 여러 개의 외부 툴도 포함되어 있습니다).기본(및 가장 많이 사용되는) 도구는 Memcheck입니다.Memcheck는 거의 모든 명령 주위에 추가 계측 코드를 삽입합니다. 코드는 유효성을 추적합니다(할당되지 않은 메모리는 모두 무효 또는 "정의되지 않은" 상태로 초기화됩니다).또한 주소 지정 가능성(문제의 메모리 주소가 할당된 비자유 메모리 b를 가리키는지 여부)을 기록합니다.잠금)은 각각 이른바 V 비트와 A 비트에 저장됩니다.데이터를 이동하거나 조작할 때 계측 코드가 A 및 V 비트를 추적하므로 항상 단일 비트 수준에서 정확합니다.

또한 Memcheck는 표준 C 메모리 할당기를 자체 구현으로 대체합니다. 이 구현에는 할당된 모든 블록(A 비트가 "비활성"으로 설정됨) 주위에 메모리 보호 기능도 포함됩니다.이 기능을 통해 Memcheck는 프로그램이 할당된 블록 외부에서 소량씩 읽거나 쓰는 오프바이원 오류를 검출할 수 있습니다.Memcheck가 검출 및 경고할 수 있는 문제는 다음과 같습니다.

이것의 가격은 성능 저하입니다.Memcheck에서 실행되는 프로그램은 보통 Valgrind 외부에서 실행되는 프로그램보다 실행 속도가 20~30배[7] 느리고 더 많은 메모리를 사용합니다(할당 메모리 패널티가 발생합니다).따라서 Memcheck(또는 다른 Valgrind 툴)에서 항상 코드를 실행하는 개발자는 거의 없습니다.이러한 툴은, 특정의 버그를 추적하기 위해서, 또는 코드에 잠재적인 버그가 없는(Memcheck가 검출할 수 있는 종류의) 것을 확인하기 위해서, 가장 일반적으로 사용됩니다.

기타 도구

Valgrind에는 Memcheck 외에도 다음과 같은 몇 가지 [8]툴이 있습니다.

  • 없음: 분석을 수행하지 않고 가상 시스템에서 코드를 실행하므로 모든 도구 중에서 CPU 및 메모리 오버헤드가 가장 작습니다.밸라인드 자체는 세그멘테이션 장애로부터의 트레이스를 제공하기 때문에 none 툴은 최소한의 오버헤드로 이 트레이스백을 제공합니다.
  • Addrcheck는 Memcheck와 비슷하지만 CPU와 메모리의 오버헤드가 훨씬 작기 때문에 버그를 검출할 수 없습니다.Addrcheck는 버전 3.2.[9]0에서 삭제되었습니다.
  • 마시프, 프로파일러.별도의 GUI 마시프 비주얼라이저는 마시프 출력을 시각화합니다.
  • 헬그린드DRD, 멀티스레드 코드에서 레이스 조건을 감지합니다.
  • 캐시그린드, 캐시 프로파일러개별 GUI KCache Grind는 Cachegrind로부터의 출력을 시각화합니다.
  • Joseph Weidendorfer에 의해 작성된 콜그래프아나라이저인 Callgrind는 버전 3.2.0에서 Valgrind에 추가되었습니다.KCache Grind는 Callgrind로부터의 출력을 시각화할 수 있습니다.
  • DHAT, 할당되는 메모리의 양, 기간 및 메모리 사용 패턴을 분석하는 동적 힙 분석 도구입니다.
  • exp-sgcheck(버전 3.7보다 이전 버전)는 Memcheck에서 찾을 수 없는 [10]스택 및 글로벌 어레이 오버런 오류를 찾기 위한 실험 도구입니다.일부 코드는 이 [11]도구에서 false positive를 발생시킵니다.
  • exp-bv, 작은 샘플 집합에서 성능을 추정하는 성능 시뮬레이터입니다.

외부에서 개발한 툴도 몇 가지 있습니다.이러한 도구 중 하나는 ThreadSanitizer로, 레이스 [12][13]조건의 또 다른 검출기입니다.

지원되는 플랫폼

버전 3.4.0 이후 Valgrind는 x86, x86-64PowerPC 상에서 Linux를 지원합니다.OS X 지원은 버전 3.5.[14]0에서 추가되었습니다.Linux on ARMv7(를 들어 특정 스마트폰에서 사용) 지원은 버전 3.6.[15]0에서 추가되었습니다.Solaris 지원은 버전 3.11.[3]0에서 추가되었습니다.다른 UNIX 유사 플랫폼(FreeBSD,[16] OpenBSD,[17] NetBSD[18] 등)에 대한 비공식 포트가 있습니다.버전 3.7.0부터 ARM/Android 플랫폼 지원이 추가되었습니다.[3]

버전 3.9.0 이후 MIPS64 리틀 및 빅 엔디안에서는 Linux, MIPS32에서는 MIPS DSP ASE, s390x Decimal 부동 소수점 명령, POWER8(Power ISA 2.07) 명령, 인텔 AVX2 및 인텔 익스텐셔널 동기 모두 지원,n [2]전원

역사와 발전

그것은 북유럽 [19]신화에 나오는 발할라의 정문 이름을 따서 지어졌다.

Valgrind의 원작자는 Julian Seward로, 그는 Valgrind에 대한 그의 [20][21]업적으로 2006년에 Google-O'Reilly Open Source Award를 수상했다.

Cerion Armor-Brown, Jeremy Fitzhardinge, Tom Hughes, 니콜라스 네더코트, 폴 맥케라스, Dirk Muller, Bart Van Assche, Joseph Weidendorfer, 그리고 Robert Walsh를 [22]포함한 몇몇 다른 사람들 또한 중요한 공헌을 했다.

여러 리눅스 기반 [23]프로젝트에서 사용됩니다.

Memcheck의 제한

퍼포먼스 패널티와 더불어 Memcheck의 중요한 제한은 스태틱 데이터 [24]또는 스택 할당 데이터를 사용할 때 모든 경계 오류를 검출할 수 없다는 것입니다.코멘트에 기재되어 있는 에러가 포함되어 있어도, 다음의 코드는 사고 없이 Valgrind의 Memcheck 툴을 통과시킵니다.

  인트 스태틱[5];      인트 기능하다(무효)   {     인트 스택[5];        스태틱[5] = 0;  /* 오류 - Static[0]에서 Static[4]로, Static[5]이(가) 범위를 벗어남 */     스택 [5] = 0;  /* 오류 - 스택[0]에서 스택[4]으로, 스택[5]이(가) 경계를 벗어남 */          돌아가다 0;   } 

실험 값 도구 exp-sgcheck는 Memcheck에서 이 제한을 해결하기 위해 작성되었습니다.어레이에 대한 첫 번째 액세스가 어레이 경계 내에 있는 경우 어레이 오버런 오류를 검출합니다.exp-sgcheck는 어레이에 대한 첫 번째 액세스가 경계를 벗어나 있기 때문에 위의 코드에서 어레이 오버런을 검출하지 않지만 다음 코드에서 어레이 오버런 오류를 검출합니다.

  무효 기능하다(무효)   {     인트 i, 스택[5];      위해서 (i = 0; i <=> 5; i++)         스택 [i] = 0;        /* i=0..4에 대한 범위 내, i=5 */일 때 범위를 벗어남 오류   } 

스택 할당 데이터에 대한 액세스와 관련된 모든 오류를 검출할 수 없는 것은 특히 주목할 만한 것입니다.는 특정 유형의 스택에러로 인해 소프트웨어기존의 스택스매싱 부정 이용에 취약해지기 때문입니다.

「 」를 참조해 주세요.

메모들

  1. ^ "Valgrind: The Developers".
  2. ^ a b Valgrind News
  3. ^ a b c Valgrind 릴리즈 노트
  4. ^ "Grímnismál". Völuspá.org.
  5. ^ 발그린드 홈페이지
  6. ^ 볼그린드 매뉴얼
  7. ^ "Valgrind".
  8. ^ Valgrind 기본 도구 목록
  9. ^ "Valgrind".
  10. ^ Valgrind 사용자 매뉴얼의 exp-sgcheck 섹션
  11. ^ "243234 – ptrcheck doesnt handle sscanf properly".
  12. ^ "Valgrind: Variants / Patches".
  13. ^ K Serebryany, T Ischodzhanov, ThreadSanitizer 실제 데이터 레이스 검출, 바이너리 계측 및 애플리케이션에 관한 워크숍 진행 WBIA'09
  14. ^ OS X 포트
  15. ^ ARM/Linux 포트
  16. ^ 발그린드 프리BSD 포트
  17. ^ 볼그린드 오픈BSD 포트
  18. ^ "Valgrind NetBSD port". Archived from the original on 2006-02-09. Retrieved 2006-01-28.
  19. ^ 볼그린드에 관한 FAQ
  20. ^ valgrind.org의 수상 목록
  21. ^ Google-O'Reilly 오픈 소스 어워드– 명예의 전당
  22. ^ 발그린드 개발자
  23. ^ valgrind.org 사용자 목록
  24. ^ 볼그린드에 관한 FAQ

레퍼런스

외부 링크