Linux 기호 및 원본
이 문서에서는 WinDbg가 표준 Linux 기호 및 원본을 지원하는 방법을 설명합니다. Linux에서 디버깅을 지원하려면 WinDbg 버전 1.2402.24001.0 이상이 필요합니다.
DebugInfoD 기호 서버
창 디버거는 Linux용 빌드 아티팩트 자동 다운로드에 DebugInfoD 표준을 사용합니다. 마찬가지로 DebugInfoD는 Microsoft의 기호 서버와 원본 서버 기술의 조합입니다. 빌드 ID에 따라 세 가지 아티팩트 형식(ELF(실행 파일), 디버그 정보(DWARF) 및 소스(코드)를 자동으로 다운로드할 수 있습니다. 이제 다양한 Linux 배포판에서 일부 아티팩트 형식을 제공하는 자체 DebugInfoD 서버를 호스트합니다. 다양한 DebugInfoD 서버가 ELFUTILS https://debuginfod.elfutils.org에 나열됩니다.
DebugInfoD에 대한 일반 정보는 여기에서 확인할 수 있습니다.
태그는 DebugInfoD*
각 서버 URL이 형식이 https://domain.com
지정되고 로 구분 *
된 하나 이상의 DebugInfoD 서버를 가리킬 수 있습니다. 서버는 원본 경로에 나열된 순서와 동일한 순서로 검색되고 파일은 일치하는 첫 번째 URL에서 검색됩니다.
예를 들어 다음과 같이 기호 경로를 설정할 수 있습니다.
.sympath+ DebugInfoD*https://debuginfod.elfutils.org
!sym noisy
명령을 사용하여 기호 로드에 대한 정보를 표시합니다. 자세한 내용은 !sym을 참조 하세요.
소스 경로 명령(.srcpath, .lsrcpath(원본 경로 설정))은 태그를 통해 DebugInfoD*
DebugInfoD 서버에서 파일 검색을 지원하며, 이를 통해 소스 코드 아티팩트의 검색을 허용합니다. 예를 들어 다음과 같이 원본 경로를 설정할 수 있습니다.
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org
자세한 내용은 소스 코드 확장 액세스를 참조 하세요.
DWARF 기호
DWARF는 널리 사용되는 표준화된 디버깅 데이터 형식입니다. DWARF는 원래 ELF(실행 파일 및 연결 가능 형식)와 함께 설계되었지만 개체 파일 형식과는 독립적입니다. 자세한 내용은 버전 5 표준을 참조 https://en.wikipedia.org/wiki/DWARF 하세요. DWARF 버전 5를 참조하세요.
개체 덤프 명령을 사용하여 DWARF 기호 버전을 확인합니다. 이 예제에서는 버전 5입니다.
bob@BOB:/mnt/c/Users/BOB$ objdump -g DisplayGreeting | grep -A 2 'Compilation Unit @'
Compilation Unit @ offset 0x0:
Length: 0x285c (32-bit)
Version: 5
WinDbg DWARF 지원
WinDbg는 DWARF 및 ELF의 다음과 같은 사용을 지원합니다.
Linux 사용자 모드 - Linux ELF Core 덤프(
-z <core dump>
)를 열고 전체 프라이빗 DWARF 기호를 사용하여 사후 디버깅 및 분석을 수행합니다.Linux 커널 모드 - ELF VMCORE(Linux 커널) 덤프를 열고 전체 프라이빗 DWARF 기호를 사용하여 사후 디버깅 및 분석을 수행합니다.
Linux 커널 모드 - Linux 커널 압축 KDUMP를 열고 전체 프라이빗 DWARF 기호를 사용하여 사후 분석 디버깅 및 분석을 수행합니다(WinDbg는 ZLIB 압축 KDUMP 파일만 지원합니다. LZO 및 Snappy 압축 KDUMP는 지원되지 않습니다.)
ELF 이미지(
-z <ELF image>
)를 열고 내용, 디스어셈블리 등을 검사합니다.기타 시나리오 - 혼합 PE/ELF 환경에서 ELF 이미지 및 DWARF 기호 이해(예: Windows에 로드된 Open Enclave 구성 요소 디버깅) 자세한 내용은 Enclave 열기 디버깅을 참조 하세요.)
WinDbg GDBServer Linux 지원
GNU 디버거인 GDBServer는 Linux에서 WinDbg 연결을 지원하는 데 사용됩니다. GDBServer에 대한 자세한 내용은 다음을 참조하세요 https://en.wikipedia.org/wiki/Gdbserver. 원격 gdb 디버깅에 대한 설명서를 볼 수 있는 한 곳은 다음과 같습니다. https://sourceware.org/gdb/current/onlinedocs/gdb#Remote-Debugging
WinDbg 및 코드 연습에서 GDBServer를 사용하는 방법에 대한 자세한 내용은 Linux 라이브 원격 프로세스 디버깅을 참조 하세요. 이 예제에서는 WSL(Linux용 Windows 하위 시스템)에서 실행되는 Ubuntu를 사용하지만 다른 Linux 구현도 사용할 수 있습니다.
DWARF 구현
DWARF 기호는 원본 이미지(디버그 이진)에 포함되거나 별도의 ELF 이미지(디버그 패키지)로 제거됩니다.
Linux DWARF 스택 워크가 성공하려면 Linux 프로세스에 로드된 모듈에 대한 원래 이진 이미지를 찾을 수 있어야 합니다.
DWARF 기호/ELF 이미지(제거 여부)는 디버거의 동조 또는 기호 서버(GNU 빌드 ID 해시를 통해 .NET Core에 따라 인덱싱됨)를 통해 찾을 수 있습니다.
DWARF 기호는 Linux 스타일 디버그 패키지 설치를 통해 찾을 수 있습니다. 기호 경로에 이름이 지정된 .build-id
디렉터리에 의해 지정됩니다. 이 아래에는 GNU 빌드 ID 해시의 첫 번째 바이트에 따라 이름이 지정된 디렉터리도 있습니다. 이러한 각 디렉터리에는 .debug라는 <remaining 18 bytes of GNU Build ID hash>
파일이 있습니다.
디버거가 DWARF 기호를 열면 형식 자체에 필요한 조회 테이블이 포함되지 않으므로 초기 인덱싱 단계를 수행합니다. 큰 DWARF 기호 집합(예: Linux 커널에 대한 프라이빗 DWARF 정보)의 경우 10-30초가 걸릴 수 있습니다.
알려진 리포지토리/커밋에서 자동 원본 검색을 위한 !addsourcemap
알려진 리포지토리에서 빌드된 구성 요소를 디버깅하고 커밋하는 경우 확장 !addsourcemap
이 있습니다. 디버거 명령을 사용하면 지정된 모듈 및 경로에 대해 알려진 URL에서 원본을 자동으로 검색하도록 디버거에 알릴 수 있습니다. 확장의 사용법은 다음과 같습니다.
!addsourcemap <module> <local spec> <remote spec>
여기서
<module>
는 관심 있는 모듈의 이름입니다.
<local spec>
는 URL을 통해 조회되는 해당 모듈 내의 원본 경로입니다. 이 경로는 와일드카드로 끝나야 합니다.
<remote spec>
는 일치하는 <local spec>
파일을 조회할 URL입니다. 이 경로는 와일드카드로 끝나야 하며 와일드카드가 특정 원본 경로와 일치하는 방식으로 <local spec>
바뀝 있습니다.
소스맵을 설정하려면 lm을 사용하여 모듈이 있는지 확인합니다(로드된 모듈 나열). 그런 다음 원본의 원격 위치를 확인합니다.
다음은 vmlinux 모듈을 GitHub에서 사용할 수 있는 특정 빌드로 설정하는 예제입니다.
0:000> !addsourcemap vmlinux /build/linux/* https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
Source map /build/linux/* -> https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/ successfully added
sourcemap 명령이 실행된 후에는 .reload 명령을 사용하여 프레임을 앞뒤로 전환하거나 다시 로드하는 등 소스 로드를 트리거하는 여러 가지 작업이 수행됩니다. 그런 다음 GitHub에서 자동 원본 끌어오기가 발생합니다.
!sourcemaps
명령을 !sourcemaps
사용하여 기존 원본 맵을 나열합니다.
0:000> !sourcemaps
Source maps for vmlinux.6:
/build/linux/* -> https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
!removesourcemaps
명령을 !removesourcemaps
사용하여 기존 원본 맵을 제거합니다.
0:000> !removesourcemaps vmlinux /build/linux/* https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
1 source maps successfully removed
DWARF 기호 문제 해결
Linux/Android 덤프(또는 DWARF 기호를 사용하는 다른 대상)를 디버깅하는 경우 기호의 원시 콘텐츠를 확인하여 지역 변수, 형식 정의 또는 함수 정의가 잘못된 이유를 이해할 수 있습니다. 이를 위해 디버거에는 DWARF 기호의 원시 콘텐츠를 덤프하는 몇 가지 기본 제공 확장 명령이 있습니다. 또한 readelf 및 dumpdwarf와 같은 Linux 유틸리티를 사용하여 기호 내부 정보를 표시합니다.
readelf 명령
Linux 명령 프롬프트에서 readelf 명령을 사용하여 Linux 라이브 원격 프로세스 디버깅에서 만든 샘플 DisplayGreeting 프로그램에 대해 만들어진 디버그 빌드 ID를 표시합니다. 이 예제에서는 aba822dd158b997b09903d4165f3dbfd37f5e5c1의 빌드 ID가 반환됩니다.
Bob@BOB6:/mnt/c/Users/Bob$ readelf -n DisplayGreeting
Displaying notes found in: .note.gnu.property
Owner Data size Description
GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0
Properties: x86 feature: IBT, SHSTK
x86 ISA needed: x86-64-baseline
Displaying notes found in: .note.gnu.build-id
Owner Data size Description
GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)
Build ID: aba822dd158b997b09903d4165f3dbfd37f5e5c1
Displaying notes found in: .note.ABI-tag
Owner Data size Description
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
OS: Linux, ABI: 3.2.0
Readelf를 grep와 함께 사용하여 기호 버전을 반환할 수 있습니다.
readelf --debug-dump=info DisplayGreeting | grep -A 2 'Compilation Unit @'
Compilation Unit @ offset 0x0:
Length: 0x285c (32-bit)
Version: 5
dwarfdump
Dwarfdump linux 명령은 특정 옵션의 요청에 따라 DWARF 섹션을 인쇄하거나 확인합니다. dwarfdump -h를 사용하여 많은 옵션을 봅니다.
bob@BOB6:/mnt/c/Users/BOB$ dwarfdump -h
Ubuntu에서 dwarfdump를 사용하는 방법에 대한 자세한 내용은 dwarfdump를 참조하세요.
!diesym
이 디버거 명령은 지정된 식에 있는 모든 기호(주소, 함수 이름 등)에 대해 선택적으로 지정된 재귀 수준으로 DIE(또는 DIE 하위 트리)를 표시합니다. 지정된 주소에 포함된 기호(일반적으로 작동하지만 데이터 등일 수 있음)에 대한 DIE를 찾고 기호에서 dwarfdump 또는 llvm-dwarfdump를 실행하고 DIE를 찾는 것과 유사하게 DIE의 진단 덤프를 수행합니다.
!diesym [options] <expression>
-r#
: N 수준을 재귀적으로 덤프합니다. 일반적으로 이것은 하나이며 DIE 자체만 덤프됩니다.
<expression>
- DIE를 찾는 주소는 식에 의해 지정됩니다. 플랫 16진수 주소이거나0x<blah>
고유한 함수 이름일 수 있습니다.
데이터 모델의 표준 평가에서 평가할 수 있어야 합니다. dx 명령을 사용하여 모델 식의 유효성을 검사합니다. dx 명령 사용에 대한 자세한 내용은 dx(디버거 개체 모델 식 표시)를 참조하세요.
0:000> dx DisplayGreeting!GetCppConGreeting
DisplayGreeting!GetCppConGreeting : DisplayGreeting!GetCppConGreeting+0x0 [Type: GetCppConGreeting]
샘플 DisplayGreeting 프로그램 GetCppConGreeting 함수에 대한 DIE 기호 정보를 표시합니다.
0:000> !diesym DisplayGreeting!GetCppConGreeting
0x2816: DW_TAG_subprogram [^^^]
DW_AT_external (true)
DW_AT_name 'GetCppConGreeting'
DW_AT_decl_file 1 ('/mnt/c/Users/BOB/DisplayGreeting.cpp')
DW_AT_decl_line 0x7
DW_AT_decl_column 0x6
DW_AT_linkage_name '_Z17GetCppConGreetingPwm'
DW_AT_low_pc 0x11E9
DW_AT_high_pc +0x3c (== 0x1225)
DW_AT_frame_base DW_OP_call_frame_cfa
DW_AT_call_all_tail_calls (true)
-r2 옵션을 사용하여 추가 수준의 DIE 기호 정보를 표시합니다.
0:000> !diesym -r2 DisplayGreeting!GetCppConGreeting
0x2816: DW_TAG_subprogram [^^^]
DW_AT_external (true)
DW_AT_name 'GetCppConGreeting'
DW_AT_decl_file 1 ('/mnt/c/Users/BOB/DisplayGreeting.cpp')
DW_AT_decl_line 0x7
DW_AT_decl_column 0x6
DW_AT_linkage_name '_Z17GetCppConGreetingPwm'
DW_AT_low_pc 0x11E9
DW_AT_high_pc +0x3c (== 0x1225)
DW_AT_frame_base DW_OP_call_frame_cfa
DW_AT_call_all_tail_calls (true)
0x2834: DW_TAG_formal_parameter [^^^]
DW_AT_name 'buffer'
DW_AT_decl_file 1 ('/mnt/c/Users/BOB/DisplayGreeting.cpp')
DW_AT_decl_line 0x7
DW_AT_decl_column 0x21
DW_AT_type (CU + 0x12f7 == 0x12f7)
DW_AT_location DW_OP_fbreg(-40)
!죽다
!die
는 선택적으로 지정된 재귀 수준을 사용하여 DWARF 디버그 섹션 내의 지정된 오프셋 식에 있는 모든 DIE에 대한 DIE(또는 DIE 하위 트리)를 표시합니다.
!die [-r#] [-t] -m <module base expression> <offset expression>
-r#
: N 수준을 재귀적으로 덤프합니다.
-t
: DIE가 .debug_info 내의 컴파일 단위 대신 .debug_types 형식 단위 내에 있는 경우 -t 스위치를 지정해야 합니다.
-m <module base expression>
쿼리하는 모듈의 기본 주소를 제공하는 값을 제공합니다.
DIE <offset expression>
오프셋의 크기입니다.
Linux 프롬프트에서 -r과 함께 Dwarfdump를 사용하여 DWARF 파일의 .debug_aranges 섹션을 인쇄하여 DIE 오프셋을 찾습니다.
bob@BOB6:/mnt/c/Users/BOB$ dwarfdump -r DisplayGreeting
.debug_aranges
COMPILE_UNIT<header overall offset = 0x00000000>:
< 0><0x0000000c> DW_TAG_compile_unit
DW_AT_producer GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection
DW_AT_language DW_LANG_C_plus_plus_14
DW_AT_name DisplayGreeting.cpp
DW_AT_comp_dir /mnt/c/Users/BOB
DW_AT_ranges 0x0000000c
Offset of rnglists entries: 0x0000000c
[ 0] start,end 0x000011e9 0x0000134a
[ 1] start,end 0x0000134a 0x00001368
[ 2] start,end 0x00001368 0x0000137b
[ 3] start,end 0x0000137b 0x0000138d
[ 4] end of list
DW_AT_low_pc 0x00000000
DW_AT_stmt_list 0x00000000
arange starts at 0x000011e9, length of 0x00000161, cu_die_offset = 0x0000000c
arange starts at 0x0000134a, length of 0x0000001e, cu_die_offset = 0x0000000c
arange starts at 0x00001368, length of 0x00000013, cu_die_offset = 0x0000000c
arange starts at 0x0000137b, length of 0x00000012, cu_die_offset = 0x0000000c
의 DW_AT_ranges 값을 확인합니다 0x0000000c
. 디버거에서 해당 오프셋 값과 DisplayGreeting의 모듈 이름을 사용하여 DIE 기호 정보를 표시합니다.
0:000> !die -m DisplayGreeting 0x0000000c
0xc: DW_TAG_compile_unit [^^^]
DW_AT_producer 'GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection'
DW_AT_language 0x21
DW_AT_name
DW_AT_comp_dir
DW_AT_ranges
[0x11e9 - 0x134a)
[0x134a - 0x1368)
[0x1368 - 0x137b)
[0x137b - 0x138d)
DW_AT_low_pc 0x0
DW_AT_stmt_list
!dieancestry
이 !dieancestry
명령은 트리 아래로 이동하는 대신 포함된 컴파일 또는 형식 단위를 향해 DIE 트리를 안내한다는 점을 제외하면 유사 !die
하게 동작합니다.
!dieancestry [-r#] [-t] -m <module base expression> <offset expression>
-r#
: N 수준을 재귀적으로 덤프합니다.
-m <module base expression>
쿼리하는 모듈의 기본 주소를 제공하는 값을 제공합니다.
DIE <offset expression>
오프셋의 크기입니다.
예시:
0:000> !dieancestry -m DisplayGreeting 0x0000000c
0xc: DW_TAG_compile_unit [^^^]
DW_AT_producer 'GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection'
DW_AT_language 0x21
DW_AT_name
DW_AT_comp_dir
DW_AT_ranges
[0x11e9 - 0x134a)
[0x134a - 0x1368)
[0x1368 - 0x137b)
[0x137b - 0x138d)
DW_AT_low_pc 0x0
DW_AT_stmt_list
부모 또는 형제와 같은 링크를 클릭하면 DWARF 기호 트리를 추가로 통과할 수 있습니다.
0:000> !die -r2 -m 0x555555554000 0xc
0xc: DW_TAG_compile_unit [^^^]
DW_AT_producer 'GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection'
DW_AT_language 0x21
DW_AT_name
DW_AT_comp_dir
DW_AT_ranges
[0x11e9 - 0x134a)
[0x134a - 0x1368)
[0x1368 - 0x137b)
[0x137b - 0x138d)
DW_AT_low_pc 0x0
DW_AT_stmt_list
0x2a: DW_TAG_namespace [^^^]
DW_AT_name 'std'
DW_AT_decl_file 9 ('/usr/include/c++/11/bits/exception_ptr.h')
DW_AT_decl_line 0x116
DW_AT_decl_column 0xb
DW_AT_sibling (CU + 0xf01 == 0xf01)
0xf01: DW_TAG_base_type [^^^]
DW_AT_byte_size 0x1
DW_AT_encoding DW_ATE_boolean (2)
DW_AT_name 'bool'
0xf08: DW_TAG_base_type [^^^]
DW_AT_byte_size 0x8
DW_AT_encoding DW_ATE_unsigned (7)
DW_AT_name 'long unsigned int'
...
모든 출력이 표시되지는 않습니다.
!dwunwind
!dwunwind
는 PE 이미지에 대한 .fnent(함수 데이터 표시) 와 다소 비슷합니다. 식에서 지정한 주소에 대한 DWARF 해제 규칙을 표시합니다. 또한 사용 가능한 경우 해제 정보를 표시하는 readelf --unwind 명령과 비슷합니다.
!dwunwind <expression>
다음은 DisplayGreeting 프로그램에서 GetCppConGreeting 함수에 대한 해제 규칙을 표시하는 예제입니다.
0:000> !dwunwind DisplayGreeting!GetCppConGreeting
DW_FRAME_SAME_VAL: 0('rax'), 1('rdx'), 2('rcx'), 3('rbx'), 4('rsi'), 5('rdi'), 6('rbp'), 7('rsp'), 8('r8'), 9('r9'), 10('r10'), 11('r11'), 12('r12'), 13('r13'), 14('r14'), 15('r15')
0('CFA'): DW_EXPR_OFFSET 7('rsp') + 8
16('<Return Address>'): DW_EXPR_OFFSET 12290('CFA') + -8
그러면 명령 포인터 레지스터의 해제 스택이 표시됩니다.
0:000> !dwunwind @rip
DW_FRAME_SAME_VAL: 0('rax'), 1('rdx'), 2('rcx'), 4('rsi'), 5('rdi'), 7('rsp'), 8('r8'), 9('r9'), 10('r10'), 11('r11'), 14('r14'), 15('r15')
0('CFA'): DW_EXPR_OFFSET 7('rsp') + 208
3('rbx'): DW_EXPR_OFFSET 12290('CFA') + -40
6('rbp'): DW_EXPR_OFFSET 12290('CFA') + -32
12('r12'): DW_EXPR_OFFSET 12290('CFA') + -24
13('r13'): DW_EXPR_OFFSET 12290('CFA') + -16
16('<Return Address>'): DW_EXPR_OFFSET 12290('CFA') + -8
다음은 프로그램 카운터 예제입니다.
0:000> !dwunwind @pc
DW_FRAME_SAME_VAL: 0('x0'), 1('x1'), 2('x2'), 3('x3'), 4('x4'), 5('x5'), 6('x6'), 7('x7'), 8('x8'), 9('x9'), 10('x10'), 11('x11'), 12('x12'), 13('x13'), 14('x14'), 15('x15'), 16('x16'), 17('x17'), 18('x18'), 31('sp'), 32('pc')
0('CFA'): DW_EXPR_OFFSET 31('sp') + 208
19('x19'): DW_EXPR_OFFSET 1436('CFA') + -192
20('x20'): DW_EXPR_OFFSET 1436('CFA') + -184
21('x21'): DW_EXPR_OFFSET 1436('CFA') + -176
22('x22'): DW_EXPR_OFFSET 1436('CFA') + -168
23('x23'): DW_EXPR_OFFSET 1436('CFA') + -160
24('x24'): DW_EXPR_OFFSET 1436('CFA') + -152
25('x25'): DW_EXPR_OFFSET 1436('CFA') + -144
26('x26'): DW_EXPR_OFFSET 1436('CFA') + -136
27('x27'): DW_EXPR_OFFSET 1436('CFA') + -128
28('x28'): DW_EXPR_OFFSET 1436('CFA') + -120
29('fp'): DW_EXPR_OFFSET 1436('CFA') + -208
30('lr'): DW_EXPR_OFFSET 1436('CFA') + -200
!dietree
기호에서 dwarfdump 또는 llvm-dwarfdump를 실행하고 DIE를 찾는 것과 유사한 지정된 재귀 수준에서 지정된 모듈에 대한 DIE 트리를 덤프합니다.
!dietree [OPTIONS] -m <module base> <offset expression>
-r#
: 재귀 수준 지정
-t
: 덤프 .debug_types .debug_info
DIE를 포함하는 모듈에 대한 모듈 베이스는 옵션에 의해 -m <expression>
지정되어야 합니다.
DIE <offset expression>
오프셋의 크기입니다.
예시:
0:000> !dietree -m DisplayGreeting 0x0000000c
0xc: DW_TAG_compile_unit [^^^]
DW_AT_producer 'GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection'
DW_AT_language 0x21
DW_AT_name
DW_AT_comp_dir
DW_AT_ranges
[0x11e9 - 0x134a)
[0x134a - 0x1368)
[0x1368 - 0x137b)
[0x137b - 0x138d)
DW_AT_low_pc 0x0
DW_AT_stmt_list
-r2 옵션을 사용하여 dietree에 추가 값을 표시합니다.
0:000> !dietree -r2 -m DisplayGreeting 0x0000000c
0xc: DW_TAG_compile_unit [^^^]
DW_AT_producer 'GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection'
DW_AT_language 0x21
DW_AT_name
DW_AT_comp_dir
DW_AT_ranges
[0x11e9 - 0x134a)
[0x134a - 0x1368)
[0x1368 - 0x137b)
[0x137b - 0x138d)
DW_AT_low_pc 0x0
DW_AT_stmt_list
0x2a: DW_TAG_namespace [^^^]
DW_AT_name 'std'
DW_AT_decl_file 9 ('/usr/include/c++/11/bits/exception_ptr.h')
DW_AT_decl_line 0x116
DW_AT_decl_column 0xb
DW_AT_sibling (CU + 0xf01 == 0xf01)
0xf01: DW_TAG_base_type [^^^]
DW_AT_byte_size 0x1
DW_AT_encoding DW_ATE_boolean (2)
DW_AT_name 'bool'
0xf08: DW_TAG_base_type [^^^]
DW_AT_byte_size 0x8
DW_AT_encoding DW_ATE_unsigned (7)
DW_AT_name 'long unsigned int'
0xf0f: DW_TAG_base_type [^^^]
DW_AT_byte_size 0x1
DW_AT_encoding DW_ATE_unsigned_char (8)
DW_AT_name 'unsigned char'
...
모든 출력이 표시되지는 않습니다. 예를 들어 형제에 대한 링크는 DWARF 기호 트리의 추가 통과를 허용하도록 클릭할 수 있습니다.
!dielocal
"name"이라는 지역 변수에 대한 DIE를 찾고 기호에서 dwarfdump 또는 llvm-dwarfdump를 실행하고 DIE를 찾는 것과 유사한 DIE의 진단 덤프를 수행합니다.
!dielocal [options] <name>
-r#
: N 수준을 재귀적으로 덤프합니다. 일반적으로 이것은 하나이며 DIE 자체만 덤프됩니다.
<name>
: "name"이라는 지역 변수입니다.
예시:
0:000> !dielocal greeting
0x2806: DW_TAG_variable [^^^]
DW_AT_name 'greeting'
DW_AT_decl_file 1 ('/mnt/c/Users/BOB/DisplayGreeting.cpp')
DW_AT_decl_line 0xf
DW_AT_decl_column 0x1d
DW_AT_type (CU + 0xb18 == 0xb18)
DW_AT_location DW_OP_fbreg(-240)