콘텐츠로 이동

DHAT - 동적 힙 분석 도구 치트시트

DHAT - 동적 힙 분석 도구 치트시트

DHAT (동적 힙 분석 도구)는 대부분의 메모리 프로파일러와 다른 질문에 답하는 Valgrind 도구입니다. “할당한 메모리가 얼마나 많은가”보다는 그 메모리가 실제로 어떻게 사용되었는가를 보고합니다: 할당되었지만 읽지 않은 블록, 한 번 기록되고 다시 건드리지 않은 블록, 매우 단기 할당, 그리고 할당이 실제로 접근한 바이트보다 훨씬 큰 할당. 그 사용 보기는 크기 만으로 프로파일러가 볼 수 없는 낭비를 종종 드러냅니다.

설치

플랫폼명령어
Debian/Ubuntusudo apt install valgrind
Fedora/RHELsudo dnf install valgrind
Arch Linuxsudo pacman -S valgrind
macOS제한된 지원; Linux 선호
확인valgrind --tool=dhat --version

유용한 스택 추적을 위해 -g로 프로그램을 구축합니다. DHAT는 Valgrind에서 실행되므로 상당한 느림을 예상합니다 — 이것은 분석 도구입니다, 프로덕션 프로파일러가 아닙니다.

DHAT 실행

valgrind --tool=dhat ./my-program
# → dhat.out.<pid> 생산
옵션목적
--dhat-out-file=FILE출력 경로
--mode=heap기본 힙 프로파일링
--mode=copy메모리 복사 프로파일 (memcpy 등.)
--mode=ad-hoc사용자 정의 계측 포인트
--num-callers=N보고서의 스택 깊이

결과 보기

DHAT 출력은 JSON이며 번들로 제공되는 HTML 뷰어에서 봅니다:

# 뷰어를 열고 dhat.out.<pid>를 로드합니다
firefox /usr/libexec/valgrind/dh_view.html
UI 요소표시
할당 지점의 트리호출 스택으로 그룹화
총 / 최대 바이트사이트당 부피
읽기 / 쓰기메모리가 실제로 접근된 정도
수명블록이 살아 있었던 기간
정렬가장 나쁜 범죄자를 찾기 위해 모든 메트릭

중요한 메트릭

메트릭드러냄
총 바이트이 사이트에서 할당 부피
최대 바이트최고 동시 사용
읽기 / 쓰기접근 강도
읽기 = 0할당되었지만 읽지 않음 — 순수 낭비
쓰기 = 0초기화되지 않음 — 가능한 버그 또는 낭비
짧은 수명변화; 스택/풀링의 후보
접근 비율할당된 vs 접근한 바이트

“읽기 = 0” 경우는 고전적인 DHAT 발견입니다: 프로그램이 성실하게 할당, 채우기, 해제하는 메모리로, 아무도 그것을 읽지 않습니다.

일반적인 발견 및 수정

발견가능한 수정
많은 작은 단기 할당스택 할당, 아레나, 또는 객체 풀
큰 블록, 작은 접근 부분사용하는 것만 할당; 지연 로드
읽지 않은 할당작업을 완전히 삭제
같은 크기의 반복 할당/해제버퍼 재사용
과도한 컨테이너정확한 용량 예약

복사 모드

valgrind --tool=dhat --mode=copy ./my-program

복사 모드는 호출 사이트별 memcpy/memmove 부피를 프로파일하며 — 프로파일링이 복사에서 시간을 표시하고 어느 코드가 책임이 있는지 알아야 할 때 유용합니다.

애드혹 모드

애드혹 모드를 사용하면 DHAT 클라이언트 요청으로 코드에 주석을 달아 임의의 이벤트를 세거나, DHAT를 “어느 호출 스택이 가장 많이” 카운터로 전환할 수 있습니다.

DHAT vs 관련 도구

측면DHATmassifheaptrackBytehound
초점메모리가 사용되는 방법시간에 따른 최고 사용할당 프로파일링대화형 탐색
오버헤드높음 (Valgrind)높음 (Valgrind)낮음낮음
고유 통찰읽지 않음/미달성 블록최고 스냅샷변화 + 누수풍부한 필터링
최적 대상낭비된 일 찾기최고 감소빠른 현실적 실행심층 대화형 분석

현실적인 실행의 낮은 오버헤드 프로파일링을 위해 heaptrack 또는 Bytehound를 사용합니다; 할당 메모리가 실제로 사용되었는지 알아야 할 때 DHAT을 참고합니다.

리소스