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_unit DIE를 루트로 하는 DIE 트리입니다.
  • 각 DIE는 tagattributes 목록을 갖습니다.
  • 각 attribute는 namevalue를 갖습니다(또한 값이 어떻게 인코딩되는지 지정하는 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와 평행한 조상들의 오프셋
  • 특성 배열에서 편의를 위해 복제된 몇 가지 공통 특성:
    • name
    • linkage_name - 맹글링된 완전한 이름; 일반적으로 함수만 가짐(모든 함수는 아님)
    • decl_file - 이 엔티티가 선언된 소스 코드 파일의 이름
    • decl_line - 이 엔티티가 선언된 소스 코드의 줄 번호
  • 특성을 설명하는 평행 배열:
    • attr_name - 특성의 이름; 관례적인 "DW_AT_" 접두사는 생략됨
    • attr_form - 특성이 어떻게 인코딩되고 해석되는지; 관례적인 DW_FORM_ 접두사는 생략됨
    • attr_int - 특성의 정수 값; 특성에 숫자 값이 없으면 0
    • attr_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.

형식 설정 (Format settings)

더 알아보기 (Learn more)