DWARF 형식
DWARF 형식
DWARF 형식은 ELF 파일(실행 파일, 라이브러리, 오브젝트 파일)에서 DWARF 디버그 심볼을 파싱해요. dwarfdump와 유사하지만 훨씬 빠르며(수백 MB/s), SQL을 지원합니다. .debug_info 섹션의 각 Debug Information Entry(DIE)마다 하나의 행을 생성합니다.
출처: 문서
본문
| Input | Output | Alias |
|---|---|---|
| ✔ | ✗ |
설명 (Description)
DWARF 형식은 ELF 파일(실행 파일, 라이브러리, 또는 오브젝트 파일)에서 DWARF 디버그 심볼을 파싱합니다. dwarfdump와 유사하지만 훨씬 빠르며(수백 MB/s) SQL을 지원합니다.
.debug_info 섹션의 각 Debug Information Entry(DIE)마다 하나의 행을 생성하고, DWARF 인코딩이 트리에서 자식 목록을 종료하는 데 사용하는 "null" 항목도 포함합니다.
.debug_info는 컴파일 유닛에 해당하는 유닛들로 구성됩니다:
- 각 유닛은
compile_unitDIE를 루트로 하는 DIE 트리입니다. - 각 DIE는 tag와 attributes 목록을 갖습니다.
- 각 attribute는 name과 value를 갖습니다(또한 값이 어떻게 인코딩되는지 지정하는 form도 있어요).
DIE는 소스 코드의 것들을 나타내며, tag는 그것이 어떤 종류인지 알려줍니다. 예를 들어:
- 함수 (tag =
subprogram) - 클래스/구조체/열거형 (
class_type/structure_type/enumeration_type) - 변수 (
variable) - 함수 인자 (
formal_parameter).
트리 구조는 해당 소스 코드를 반영합니다. 예를 들어 class_type DIE는 클래스의 메서드를 나타내는 subprogram DIE를 포함할 수 있어요.
DWARF 형식은 다음 컬럼을 출력합니다:
offset-.debug_info섹션에서 DIE의 위치size- 인코딩된 DIE의 바이트 수(특성 포함)tag- DIE의 타입; 관례적인 "DW_TAG_" 접두사는 생략됨unit_name- 이 DIE를 포함하는 컴파일 유닛의 이름unit_offset-.debug_info섹션에서 이 DIE를 포함하는 컴파일 유닛의 위치ancestor_tags- 트리에서 현재 DIE의 조상 태그 배열, 안쪽에서 바깥쪽 순서ancestor_offsets-ancestor_tags와 평행한 조상들의 오프셋- 특성 배열에서 편의를 위해 복제된 몇 가지 공통 특성:
namelinkage_name- 맹글링된 완전한 이름; 일반적으로 함수만 가짐(모든 함수는 아님)decl_file- 이 엔티티가 선언된 소스 코드 파일의 이름decl_line- 이 엔티티가 선언된 소스 코드의 줄 번호
- 특성을 설명하는 평행 배열:
attr_name- 특성의 이름; 관례적인 "DW_AT_" 접두사는 생략됨attr_form- 특성이 어떻게 인코딩되고 해석되는지; 관례적인 DW_FORM_ 접두사는 생략됨attr_int- 특성의 정수 값; 특성에 숫자 값이 없으면 0attr_str- 특성의 문자열 값; 특성에 문자열 값이 없으면 비어 있음
사용 예시 (Example usage)
DWARF 형식은 함수 정의가 가장 많은 컴파일 유닛(템플릿 인스턴스화 및 포함된 헤더 파일의 함수 포함)을 찾는 데 사용할 수 있어요:
쿼리
SELECT
unit_name,
count() AS c
FROM file('programs/clickhouse', DWARF)
WHERE tag = 'subprogram' AND NOT has(attr_name, 'declaration')
GROUP BY unit_name
ORDER BY c DESC
LIMIT 3
응답
┌─unit_name──────────────────────────────────────────────────┬─────c─┐
│ ./src/Core/Settings.cpp │ 28939 │
│ ./src/AggregateFunctions/AggregateFunctionSumMap.cpp │ 23327 │
│ ./src/AggregateFunctions/AggregateFunctionUniqCombined.cpp │ 22649 │
└────────────────────────────────────────────────────────────┴───────┘
3 rows in set. Elapsed: 1.487 sec. Processed 139.76 million rows, 1.12 GB (93.97 million rows/s., 752.77 MB/s.)
Peak memory usage: 271.92 MiB.