Linux 크래시 덤프
이 문서에서는 다양한 유형의 Linux 크래시 덤프 파일을 만들고 보는 방법을 설명합니다. Linux 크래시 덤프를 보려면 WinDbg 버전 1.2402.24001.0 이상이 필요합니다.
WinDbg에서 Linux(비 Windows) 코어 덤프를 열면 기본 디버거 명령이 모두 제대로 작동하지만 Windows 구조를 참조하는 확장 및 Windows 관련 명령은 작동하지 않습니다.
크래시 덤프 파일 지원
Linux 커널 덤프
Linux 커널 압축 KDUMP를 열고 전체 프라이빗 DWARF 기호를 사용하여 사후 평가 디버깅 및 분석을 수행하는 기능은 Windows 디버거에서 사용할 수 있습니다.
WinDbg는 ZLIB 압축 KDUMP 파일만 지원합니다. LZO 및 Snappy 압축 KDUMP는 지원되지 않습니다.
Linux KDUMPs에 대한 일반적인 내용은 KDump(Linux) Wikipedia 페이지 및 Core 덤프를 참조하세요.
ELF 코어 덤프
Open Enclave 지원의 일환으로 WinDbg는 Enclave 및 Linux 애플리케이션 모두에서 ELF 코어 덤프 및 이진 파일뿐만 아니라 DWARF 기호(DWARF 5는 지원되지 않음)를 열 수 있습니다. Open Enclave에 대한 자세한 내용은 Open Enclave 디버깅을 참조 하세요.
프로세스 덤프
단일 프로세스 덤프가 지원됩니다. Linux용 Linux Sysinternals ProcDump 유틸리티를 포함하여 프로세스 덤프를 수집하는 방법에는 여러 가지가 있습니다. 또 다른 옵션은 GNU 디버거 - GDBServer를 사용하여 코어 덤프를 생성하는 것입니다. GDBServer에 대한 자세한 내용은 다음을 참조하세요 https://en.wikipedia.org/wiki/Gdbserver. 원격 gdb 디버깅에 대한 설명서는 원본웨어 웹 사이트 - 원격 프로그램 디버깅에서 사용할 수 있습니다.
Linux NATVIS 시각화 및 DML 링크 순회 사용
Windows 디버거의 STL(표준 템플릿 라이브러리) 확장성은 Visual Studio 및 Windows와 함께 제공되는 여러 버전의 STL을 이해하는 NatVis 파일 stl.natvis
에서 제공됩니다. NATVIS에 대한 일반적인 내용은 NatVis의 네이티브 디버거 개체를 참조 하세요. Linux 구성 요소(GCC 또는 LLDB)에 사용되는 STL 버전은 매우 다릅니다.
Linux에 최적화된 NATVIS 시각화 및 DML 링크 순회를 사용하도록 설정하려면 먼저 기본 natvis 파일인 .scriptunload를 언로드stl.natvis
합니다.
그런 다음 파일을 .scriptload 합니다 gstl.natvis
. .scriptlist를 사용하여 활성 상태인지 gstl.natvis
확인합니다.
0: kd> .scriptlist
Command Loaded Scripts:
...
NatVis script from 'C:\Users\Bob\AppData\Local\dbg\UI\2402.24001.0\amd64\Visualizers\gstl.natvis'
DML 작업에 대한 자세한 내용은 DML을 사용하여 디버거 출력 사용자 지정을 참조 하세요.
DisplayGreeting 앱의 단일 프로세스 코어 덤프
이 예제에서는 gdb를 사용하여 단일 프로세스 코어 덤프를 만드는 방법을 보여줍니다. WinDbg와 함께 GDBServer를 사용하는 방법에 대한 자세한 내용 및 코드 연습은 Linux 라이브 원격 프로세스 디버깅을 참조 하세요. DisplayGreeting에 대한 예제 코드는 C++ 앱 연습을 참조 하세요.
원하는 프로세스 찾기
DisplayGreeting 앱을 찾고 있다는 것을 알고 있으므로 명령을 사용하여 ps -A
Linux의 모든 프로세스를 나열하거나 pgrep과 함께 -f 옵션을 사용할 수 있습니다.
$ pgrep -f DisplayGreeting
9382
이 예제 연습에서는 9382의 프로세스 ID를 보여 줍니다.
gdb를 사용하여 프로세스에 연결하고 코어 덤프 생성
gdb를 사용하여 프로세스에 연결합니다.
$ gdb -p 9382
gdb 명령에 대한 도움말을 generate-core-file
표시합니다.
(gdb) help generate-core-file
Save a core file with the current state of the debugged process.
Argument is optional filename. Default filename is 'core.<process_id>'.
그런 다음(gdb) 프롬프트에서 기본 파일 이름을 사용하여 프로세스 코어 덤프 파일을 생성합니다.
(gdb) generate-core-file
Saved corefile core.9382
(gdb) quit
Linux 프로세스 코어 덤프 로드 및 검사
WinDbg에서 덤프 파일 열기 메뉴 옵션을 사용하여 생성된 코어 덤프를 로드합니다.
디버거 세션에 원본 및 기호 경로 추가
소스 코드 및 변수를 보려면 기호 및 소스 경로를 설정합니다. 기호 경로 설정에 대한 일반적인 내용은 기호 사용을 참조 하세요. Linux 기호에 대한 자세한 내용은 Linux 기호 및 원본을 참조 하세요.
디버거 세션에 기호 경로를 추가하는 데 사용합니다 .sympath
. 이 WSL Linux Ubuntu 예제에서는 Bob이라는 사용자에 대해 DisplayGreetings 코드 및 기호를 이 위치에 사용할 수 있습니다.
\\wsl$\Ubuntu\mnt\c\Users\Bob\
WSL에서 이 디렉터리가 Windows OS 위치에 C:\Users\Bob\
매핑되므로 이 두 명령이 사용됩니다.
.sympath C:\Users\Bob\
.srcpath C:\Users\Bob\
Windows에서 WSL 파일 시스템에 액세스하는 방법에 대한 자세한 내용은 WSL에 대한 파일 권한을 참조하세요.
추가 Linux OS 기호를 활용하려면 .sympath 위치를 사용하여 DebugInfoD 기호를 추가합니다.
.sympath+ DebugInfoD*https://debuginfod.elfutils.org
.reload
명령을 사용하여 기호를 다시 로드합니다.
또한 해당 아티팩트 형식 반환을 지원하는 DebugInfoD 서버에서 원본의 자동 다운로드도 지원됩니다. 이 기능을 활용하려면 .srcpath를 사용하여 elfutils 서버를 추가합니다.
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org
프로세스 덤프 검사
명령을 lm
사용하여 덤프 파일에 DisplayGreeting 앱이 포함되어 있음을 확인합니다.
0:000> lm
start end module name
00005555`55554000 00005555`55558140 DisplayGreeting T (service symbols: DWARF Private Symbols) c:\users\bob\DisplayGreeting
00007fff`f7a54000 00007fff`f7a732e8 libgcc_s_so (deferred)
00007fff`f7a74000 00007fff`f7b5a108 libm_so (deferred)
00007fff`f7b5b000 00007fff`f7d82e50 libc_so T (service symbols: DWARF Private Symbols) C:\ProgramData\Dbg\sym\_.debug\elf-buildid-sym-a43bfc8428df6623cd498c9c0caeb91aec9be4f9\_.debug
00007fff`f7d83000 00007fff`f7fae8c0 libstdc___so (deferred)
00007fff`f7fc1000 00007fff`f7fc1000 linux_vdso_so (deferred)
00007fff`f7fc3000 00007fff`f7ffe2d8 ld_linux_x86_64_so T (service symbols: DWARF Private Symbols) C:\ProgramData\Dbg\sym\_.debug\elf-buildid-sym-9718d3757f00d2366056830aae09698dbd35e32c\_.debug
디버그 기호가 캐시에 로드되기 때문에 첫 번째 명령 실행에 약간의 시간이 걸릴 수 있습니다. 기호 서버 또는 로컬 검색 경로를 통해 기호 및 이진 파일을 찾는 것 외에도 GDBServer 통합으로 인해 로컬에서 찾을 수 없는 경우 원격 파일 시스템의 이러한 파일을 로드할 수 있습니다. 이 작업은 일반적으로 symsrv 또는 로컬 검색 경로에서 기호를 가져오는 것보다 느립니다.
이 x
명령을 사용하여 DisplayGreeting에서 사용할 수 있는 함수를 표시합니다.
0:000> x /D /f DisplayGreeting!*
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
*** WARNING: Unable to verify timestamp for DisplayGreeting
00005651`7935b331 DisplayGreeting!_GLOBAL__sub_I__Z17GetCppConGreetingPwm (void)
00005651`7935b2db DisplayGreeting!__static_initialization_and_destruction_0 (int, int)
00005651`7935b37b DisplayGreeting!std::__array_traits<wchar_t, 50>::_S_ptr (wchar_t (*)[50])
00005651`7935b368 DisplayGreeting!std::array<wchar_t, 50>::size (std::array<wchar_t, 50> *)
00005651`7935b34a DisplayGreeting!std::array<wchar_t, 50>::data (std::array<wchar_t, 50> *)
00005651`7935b225 DisplayGreeting!main (void)
00005651`7935b1e9 DisplayGreeting!GetCppConGreeting (wchar_t *, size_t)
명령을 dx
사용하여 지역 변수 인사말을 봅니다.
0:000> dx greeting
...
Error: Unable to bind name 'greeting'
덤프가 수행되었을 때 매개 변수 인사말이 아직 사용되지 않았기 때문에 덤프 파일에서 사용할 수 없습니다.
명령을 dx
사용하여 덤프 파일에서 사용할 수 있는 프로세스를 검사합니다.
:000> dx @$cursession.Processes.Take(30)
@$cursession.Processes.Take(30)
[0x24a6] : DisplayGreeting [Switch To]
Click on the `[Switch To]` DML link to switch to the 9382 process.
```dbgcmd
0:000> dx -s @$cursession.Processes.Take(30)[9382].SwitchTo()
0:000> dx -r1 @$cursession.Processes.Take(30)[9382]
@$cursession.Processes.Take(30)[9382] : DisplayGreeting [Switch To]
Name : DisplayGreeting
Id : 0x24a6
Index : 0x0
Handle : 0x24a6
Threads
Modules
Environment
Direct3D
Attributes
Devices
Io
Memory
TTD
GroupedStacks
스레드 및 모듈에 대한 정보를 보려면 출력에서 생성된 DML 링크를 클릭하거나 크래시 덤프에 대해 이와 유사한 명령을 입력합니다.
0:000> dx -r1 @$cursession.Processes.Take(30)[9382].Threads
@$cursession.Processes.Take(30)[9382].Threads
[0x24a6] [Switch To]
0:000> dx -r1 @$cursession.Processes.Take(30)[9382].Modules
@$cursession.Processes.Take(30)[9382].Modules
[0x0] : /mnt/c/Users/Bob/DisplayGreeting
[0x1] : /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
[0x2] : /usr/lib/x86_64-linux-gnu/libm.so.6
[0x3] : /usr/lib/x86_64-linux-gnu/libc.so.6
[0x4] : /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
[0x5] : /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
[0x6] : linux-vdso.so.1
ELF/CORE 진단 확장을 사용하여 덤프 파일 정보 표시
Linux 진단 확장 - ELFBinComposition.dll 사용하여 덤프 파일 정보를 표시합니다. 예를 들어 ELF 사용자 코어 덤프인지 확인하고 다른 정보를 표시하는 데 사용합니다 !dumpdebug
.
0:000> !dumpdebug
Dump Diagnostics: Format = ELF User Core
********************************************************************************
File Mapping Size: 0x151d78 (1 Mb)
Highest Memory Offset: 0x14e5f0 (1 Mb)
...
NT_PRPSINFO 데이터를 표시하는 데 사용합니다 !ntprpsinfo
.
0:000> !ntprpsinfo
NT_PRPSINFO (process info):
state: 0, sname: t, zomb: 0, nice: 0, flag: 0x4040000019999999
uid: 1000, gid: 1000, pid: 9382, ppid: 388, pgrp: 9382, sid: 388
fname: DisplayGreeting
psargs: ./DisplayGreeting
커널 KDump 크래시 덤프
Linux에서 크래시 덤프 파일을 만드는 방법에는 여러 가지가 있습니다. 예를 들어 Ubuntu Linux를 사용한 한 가지 옵션은 커널 크래시 덤프에 설명되어 있습니다.
다른 옵션으로는 kdump를 사용하도록 설정하는 kexectools 사용이 포함됩니다. 자세한 내용은 KDump(Linux)를 참조하세요. kdump를 사용하도록 설정하면 kdump가 활성 상태이고 .를 사용하여 systemctl status kdump
실행 중인지 확인할 수 있습니다.
테스트 시스템에서 OS 크래시가 트리거되면 크래시 덤프 파일이 만들어집니다.
Linux OS 크래시 덤프 로드 및 검사
덤프 파일 열기 메뉴 옵션을 사용하여 생성된 kdump를 로드합니다.
이전 섹션에서 설명한 대로 파일을 로드하여 Linux에 최적화된 NATVIS 시각화 및 DML 링크 순회를 gstl.natvis
사용하도록 설정합니다.
ELF Bin 컴퍼지션 명령을 사용하여 Linux 커널 덤프 분석
추가 ELF Bin 컴퍼지션 명령을 사용하려면 .chain 명령을 사용하여 ELFBinComposition.dll 로드되어 있는지 확인합니다.
0: kd> .chain
Extension DLL chain:
ELFBinComposition: image 10.0.27606.1000, API 0.0.0,
[path: C:\Users\Bob\AppData\Local\dbg\UI\Fast.20240423.1\amd64\winext\ELFBinComposition.dll]
...
ELFBinComposition이 로드되지 않은 경우 .load를 사용하여 로드합니다. 자세한 내용은 .load, .loadby(부하 확장 DLL)를 참조 하세요.
!ELFBinComposition.dumpdebug
이 명령을 사용하여 로드된 덤프 파일에 대한 정보를 표시합니다. 이 예제에서는 ELF 사용자 코어 덤프 파일이 로드되었습니다.
0: kd> !ELFBinComposition.dumpdebug
Dump Diagnostics: Format = Kernel KDump
********************************************************************************
File Mapping Size: 0x3b34090 (59 Mb)
Highest Memory Offset: 0x3b34090 (59 Mb)
ELFBinComposition !vmcoreinfo
을 사용하여 디버그 중인 Linux KDUMP(커널 코어 덤프)의 VMCOREINFO 테이블을 표시합니다.
0: kd> !vmcoreinfo
VMCOREINFO:
OSRELEASE=6.5.0-25-generic
BUILD-ID=8567ad7c7c2f78f3654f6cc90a9e1b3f9c3a4b32
PAGESIZE=4096
SYMBOL(init_uts_ns)=ffffded86e11b388
OFFSET(uts_namespace.name)=0
SYMBOL(node_online_map)=ffffded86dcceb40
SYMBOL(swapper_pg_dir)=ffffded86d143000
SYMBOL(_stext)=ffffded86ace0000
SYMBOL(vmap_area_list)=ffffded86de48140
SYMBOL(mem_section)=ffff0f2e1efe4600
LENGTH(mem_section)=8192
...
덤프 !kdumppagerange
파일의 첫 번째 부분을 덤프하려면 0부터 덤프합니다.
0: kd> !kdumppagerange 0
PFNs [0x540e0, 0x55643) -> Descs [0x0, 0x1563): File Offsets [0x307430, 0xeeb37a) 0xbe3f4a bytes across 5475 pages as ZLIB
PFNs [0x55643, 0x55650) -> Descs [0x1563, 0x1570): File Offsets [0x306430, 0x307430) 0x1000 bytes across 13 duplicate pages as Uncompressed
PFNs [0x55650, 0x556d6) -> Descs [0x1570, 0x15f6): File Offsets [0xeeb37a, 0xf0c405) 0x2108b bytes across 134 pages as ZLIB
PFNs [0x556d6, 0x556dc) -> Descs [0x15f6, 0x15fc): File Offsets [0xf0c405, 0xf12405) 0x6000 bytes across 6 pages as Uncompressed
PFNs [0x556dc, 0x55e98) -> Descs [0x15fc, 0x1db8): File Offsets [0xf12405, 0x1216d1b) 0x304916 bytes across 1980 pages as ZLIB
PFNs [0x55e98, 0x55ea4) -> Descs [0x1db8, 0x1dc4): File Offsets [0x1216d1b, 0x1222d1b) 0xc000 bytes across 12 pages as Uncompressed
PFNs [0x55ea4, 0x56542) -> Descs [0x1dc4, 0x2462): File Offsets [0x1222d1b, 0x14ba138) 0x29741d bytes across 1694 pages as ZLIB
PFNs [0x56542, 0x56543) -> Descs [0x2462, 0x2463): File Offsets [0x306430, 0x307430) 0x1000 bytes across 1 pages as Uncompressed
PFNs [0x56543, 0x56544) -> Descs [0x2463, 0x2464): File Offsets [0x14ba138, 0x14ba194) 0x5c bytes across 1 pages as ZLIB
PFNs [0x56544, 0x5654f) -> Descs [0x2464, 0x246f): File Offsets [0x306430, 0x307430) 0x1000 bytes across 11 duplicate pages as Uncompressed
!kdumppagerange의 출력은 다양한 PFN(페이지 프레임) 값을 표시합니다. 관심 중 하나를 선택하고 PFN에 대한 정보와 해당 데이터가 KDUMP 내에 있는 위치를 표시하는 데 사용할 !kdumppfn <PFN>
수 있습니다.
0: kd> !kdumppfn 0x540e0
Page frame 0x540e0 = File offset [0x307430, 0x307b9f) 0x76f bytes as ZLIB...
덤프 파일 검사
k
이 명령을 사용하여 호출 스택을 표시하여 충돌이 발생했을 때 실행 중인 코드를 조사합니다.
6: kd> k
# Child-SP RetAddr Call Site
00 ffff0000`0bc3bc90 ffff0000`085161f8 vmlinux!sysrq_handle_crash+0x24 [/usr/src/kernel/drivers/tty\sysrq.c @ 147]
01 ffff0000`0bc3bca0 ffff0000`08516824 vmlinux!__handle_sysrq+0x88 [/usr/src/kernel/drivers/tty\sysrq.c @ 583]
02 ffff0000`0bc3bcb0 ffff0000`08308990 vmlinux!write_sysrq_trigger+0xb4 [/usr/src/kernel/drivers/tty\sysrq.c @ 1110]
03 ffff0000`0bc3bcf0 ffff0000`08290070 vmlinux!proc_reg_write+0x80 [/usr/src/kernel/fs/proc\inode.c @ 245]
04 ffff0000`0bc3bd10 ffff0000`0829039c vmlinux!__vfs_write+0x60 [/usr/src/kernel/fs\read_write.c @ 490]
05 ffff0000`0bc3bd50 ffff0000`08290704 vmlinux!vfs_write+0xac [/usr/src/kernel/fs\read_write.c @ 550]
06 ffff0000`0bc3be00 ffff0000`082907a4 vmlinux!ksys_write+0x74 [/usr/src/kernel/fs\read_write.c @ 599]
07 (Inline Function) --------`-------- vmlinux!__do_sys_write+0xc [/usr/src/kernel/fs\read_write.c @ 608]
08 (Inline Function) --------`-------- vmlinux!__se_sys_write+0xc [/usr/src/kernel/fs\read_write.c @ 608]
09 ffff0000`0bc3be40 ffff0000`08095904 vmlinux!__arm64_sys_write+0x24 [/usr/src/kernel/fs\read_write.c @ 608]
0a ffff0000`0bc3be90 ffff0000`080834c8 vmlinux!el0_svc_handler+0x94
0b ffff0000`0bc3beb0 00000000`00000000 vmlinux!el0_svc+0x8
dx
명령을 사용하여 덤프 파일을 검사합니다. 예를 들어 이 명령을 사용하여 처음 30개의 프로세스를 확인합니다.
6: kd> dx @$cursession.Processes.Take(30)
@$cursession.Processes.Take(30)
[0x0] : swapper/0 [Switch To]
[0x1] : systemd [Switch To]
[0x2] : kthreadd [Switch To]
[0x3] : rcu_gp [Switch To]
[0x4] : rcu_par_gp [Switch To]
[0x5] : kworker/0:0 [Switch To]
[0x6] : kworker/0:0H [Switch To]
[0x7] : kworker/u16:0 [Switch To]
[0x8] : mm_percpu_wq [Switch To]
[0x9] : ksoftirqd/0 [Switch To]
[0xa] : rcu_sched [Switch To]
[0xb] : rcu_bh [Switch To]
[0xc] : migration/0 [Switch To]
...
DML 링크를 클릭하거나 이 링크와 유사한 명령을 사용하여 관심 있는 프로세스에 대한 스레드를 확인합니다.
6: kd> dx @$cursession.Processes[0x1a].Threads
@$cursession.Processes[0x1a].Threads
[0x1a] [Switch To]
6: kd> dx @$cursession.Processes[0x1a].Threads[0x1a]
@$cursession.Processes[0x1a].Threads[0x1a] [Switch To]
KernelObject [Type: thread_struct]
Id : 0x1a
Stack
Registers
Environment
Analysis
WaitChain
Scheduling
IRPs
...
아래와 같이 각 스레드에 대한 추가 정보를 사용할 수 있습니다.
6: kd> dx @$cursession.Processes[0x1a].Threads[0x1a].KernelObject
@$cursession.Processes[0x1a].Threads[0x1a].KernelObject [Type: thread_struct]
[+0x000] cpu_context [Type: cpu_context]
[+0x070] uw [Type: <unnamed-tag>]
[+0x290] fpsimd_cpu : 0x100 [Type: unsigned int]
[+0x298] sve_state : 0x0 [Type: void *]
[+0x2a0] sve_vl : 0x0 [Type: unsigned int]
[+0x2a4] sve_vl_onexec : 0x0 [Type: unsigned int]
[+0x2a8] fault_address : 0x0 [Type: long unsigned int]
[+0x2b0] fault_code : 0x0 [Type: long unsigned int]
[+0x2b8] debug [Type: debug_info]
6: kd> dx -s @$cursession.Processes[0x1a].Threads[0x1a].SwitchTo()
Process ffff8008`0f894380 has invalid page directories
LinuxKernel.js 스크립트를 사용하여 Linux 커널 덤프 분석
LinuxKernel.js 디버거 확장에는 Linux 커널 모드 크래시를 열고 분석하는 데 사용되는 Linux 크래시 유틸리티와 유사하게 작동하도록 설계된 명령 집합이 포함되어 있습니다.
스크립트를 사용하려면 먼저 스크립트를 로드합니다.
0: kd> .scriptload LinuxKernel.js
JavaScript script successfully loaded from 'C:\Users\Bob\AppData\Local\dbg\UI\Fast.20240423.1\amd64\winext\LinuxKernel.js'
스크립트 로드 작업에 대한 자세한 내용은 JavaScript 디버거 스크립팅을 참조 하세요.
!파일
덤프 파일에서 !files
Linux 파일 구조에 대한 정보를 표시하는 데 사용합니다. 크래시 파일 명령과 유사합니다.
6: kd> !files
@$files() : Files for process 'sh' (pid 545) root dir = '/' working dir = '/home/root'
[0x0] : /dev/ttyS0 [Type: file]
[0x1] : /proc/sysrq-trigger [Type: file]
[0x2] : /dev/ttyS0 [Type: file]
[0xa] : /dev/ttyS0 [Type: file]
[0xff] : /dev/ttyS0 [Type: file]
!files
구문:
!files [<arg>]
Without [<arg>]
- 'files'에 해당 - 현재 프로세스 파일 목록을 제공합니다.
[<arg>]
:
pid
- 지정된 프로세스 ID에 대한 파일 목록을 제공합니다.
64-bit num
- 지정된 주소에서 작업에 대한 파일 목록을 제공합니다.
<task struct [*]>
- 지정된 작업 구조체에 대한 파일 목록을 개체별로 제공합니다.
<process object>
- 프로세스 개체가 나타내는 작업에 대한 파일 목록을 제공합니다.
!오르다
덤프 파일에서 !mount
Linux 파일 구조에 대한 정보를 표시하는 데 사용합니다.
6: kd> !mount
@$mount()
[0x0] : (rootfs) rootfs at / [Type: mount]
[0x1] : (squashfs) /dev/mapper/nested_rootfs at / [Type: mount]
[0x2] : (sysfs) sysfs at /sys [Type: mount]
[0x3] : (proc) proc at /proc [Type: mount]
[0x4] : (devtmpfs) devtmpfs at /dev [Type: mount]
[0x5] : (securityfs) securityfs at /kernel/security [Type: mount]
!mount
구문:
Without [<arg>]
- 'mount' 명령에 해당 - 탑재된 파일 시스템을 표시합니다.
[<arg>]
:
pid
- 지정된 pid를 사용하여 프로세스의 네임스페이스에 탑재된 파일 시스템을 제공합니다.
64-bit num
- 주소로 지정된 task_struct 네임스페이스에 탑재된 파일 시스템을 제공합니다.
<task struct [*]>
- 지정된 task_struct 네임스페이스에 대해 탑재된 파일 시스템을 제공합니다.
<process object>
- 프로세스에서 나타내는 작업의 네임스페이스에 대해 탑재된 파일 시스템을 제공합니다.
!그물
!net
시스템 네트워크 목록을 표시하려면 이 값을 사용합니다.
6: kd> !net
@$net()
[0x0] : lo (127.0.0.1) [Type: net_device]
[0x1] : enP8p1s0f0np0 (192.168.3.19) [Type: net_device]
[0x2] : enP8p1s0f1np0 [Type: net_device]
!net
구문:
!net [<arg>]
Without [<arg>]
- 'net'에 해당 - 시스템 네트워크 목록 제공
[<arg>]
:
pid
- 지정된 pid를 사용하여 프로세스의 네임스페이스에 대한 net 목록을 제공합니다.
64-bit num
- 주소로 지정된 task_struct 네임스페이스에 대한 net 목록을 제공합니다.
<task struct [*]>
- 지정된 task_struct 네임스페이스에 대한 net 목록을 제공합니다.
<process object>
- 프로세스에서 나타내는 작업의 네임스페이스에 대한 net 목록을 제공합니다.
!runq
이 !runq
명령을 사용하여 실행 큐의 작업에 대한 정보를 표시합니다.
0: kd> !runq
@$runq()
[0x0] : CPU 0 run queue [current = 'bash' (17ca)]
Cpu : 0x0
RunQueue [Type: rq]
CurrentTask : bash [Type: task_struct]
RTTasks
CfsTasks
[0x16b3] : kworker/0:7 [Type: task_struct]
[0x1] : CPU 1 run queue [current = 'swapper/1' (0)]
Cpu : 0x1
RunQueue [Type: rq]
CurrentTask : swapper/1 [Type: task_struct]
RTTasks
CfsTasks
!runq
구문:
!runq
!runq에는 명령 매개 변수가 없습니다.
추가 커널 덤프 명령
!dev
- 문자 및 블록 디바이스, 할당, I/O 포트 사용량, I/O 메모리 사용량과 관련된 디바이스 데이터를 표시합니다.
!log
- 커널 log_buf 내용을 표시합니다.
!vm
- 가상 메모리 사용량 요약을 표시합니다.
!timer
- 타이머 큐 항목을 표시합니다.
dx 명령 및 Linux 개체
dx 명령을 사용하여 kdump를 조사할 수 있습니다. 사용 가능한 다양한 자식 개체를 보려면 Sessions 개체를 표시합니다.
0: kd> dx -r3 Debugger.Sessions[0]
Debugger.Sessions[0] : Target Composition Target
Processes
[0x0] : swapper/0 [Switch To]
KernelObject : swapper/0 [Type: task_struct]
Name : swapper/0
Id : 0x0
Index : 0x0
Threads
Modules
Environment
Direct3D
Attributes
Devices
Io
Memory
GroupedStacks
...
저주 커널 개체에는 커널 로그를 보는 데 사용할 수 있는 PrintKLog 개체가 포함되어 있습니다.
6: kd> dx @$cursession.Kernel.PrintKLog.Take(4)
@$cursession.Kernel.PrintKLog.Take(4)
[0x0] : [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]
[0x1] : [ 0.000000] Linux version 4.19.90-microsoft-standard (oe-user@oe-host) (gcc version 8.2.0 (GCC)) #1 SMP Fri Mar 27 14:25:24 UTC 2020..
[0x2] : [ 0.000002] sched_clock: 64 bits at 125MHz, resolution 8ns, wraps every 4398046511100ns
[0x3] : [ 0.000003] 17.250901928 MSFT: kernel boot start
이 dx 명령은 로그에서 .Contains()
특정 문자열을 찾는 데 사용하는 방법을 보여 줍니다.
6: kd> dx @$cursession.Kernel.PrintKLog.Where(le => le.ToLower().Contains("oops") || le.ToLower().Contains("crash"))
@$cursession.Kernel.PrintKLog.Where(le => le.ToLower().Contains("oops") || le.ToLower().Contains("crash"))
[0x0] : [ 0.000493] crashkernel reserved: 0x00000000dc600000 - 0x00000000fc600000 (512 MB)
[0x1] : [ 0.078790] Kernel command line: console=ttyS0,115200n8 earlycon=uart8250,mmio32,0x68A10000 crashkernel=512M enforcing=0 ipe.enforce=0
[0x2] : [ 26.621228] sysrq: SysRq : Trigger a crash
[0x3] : [ 26.621254] Internal error: Oops: 96000044 [#1] SMP
[0x4] : [ 26.656655] pc : sysrq_handle_crash+0x24/0x30
[0x5] : [ 26.753494] sysrq_handle_crash+0x24/0x30
[0x6] : [ 26.801441] Starting crashdump kernel...8J»=.
마지막으로 기록된 이벤트를 표시하는 데 사용합니다 .Reverse()
.
2: kd> dx @$cursession.Kernel.PrintKLog.Reverse().Take(5).Reverse()
@$cursession.Kernel.PrintKLog.Reverse().Take(5).Reverse()
[0x0] : [3147944.378367] kthread+0x118/0x2a4
[0x1] : [3147944.381876] ret_from_fork+0x10/0x18
[0x2] : [3147944.385747] Code: 78002507 36000042 39000107 d65f03c0 (cb0803e4)
[0x3] : [3147944.392221] SMP: stopping secondary CPUs
[0x4] : [3147944.397539] Starting crashdump kernel...
dx 명령과 함께 LINQ 쿼리를 사용하는 방법에 대한 자세한 내용은 디버거 개체와 함께 LINQ 사용을 참조 하세요.
Linux 진단 확장 - ELFBinComposition.dll
다음 Linux 덤프 파일 진단 확장명은 ELFBinComposition.dll 사용할 수 있습니다.
덤프 파일 명령
이러한 명령은 대부분의 덤프 파일에서 사용할 수 있습니다.
!dumpdebug
- 디버깅 중인 코어 덤프에 대한 진단을 표시합니다. 여기에는 다양한 다른 명령의 출력이 포함됩니다.
!ntprstatus
- 디버그 중인 코어 덤프의 NT_PRSTATUS 레코드를 표시합니다.
!vmcoreinfo
- 디버그 중인 KDUMP(커널 코어 덤프)의 VMCOREINFO 테이블을 표시합니다.
ELF 덤프 명령
이러한 명령은 ELF 코어 덤프 파일에서만 사용할 수 있습니다.
!corephdrs
- 디버깅 중인 코어 덤프에 대한 프로그램 헤더 테이블을 표시합니다.
!ntprpsinfo
- 디버그 중인 코어 덤프의 NT_PRPSINFO 데이터를 표시합니다.
!ntfile
- 디버그 중인 코어 덤프의 NT_FILE 데이터를 표시합니다.
!ntauxv
- 디버그 중인 코어 덤프의 NT_AUXV 데이터를 표시합니다.
커널 크래시 덤프 파일 명령
이러한 명령은 KDUMP(커널 코어 덤프) 파일에서만 사용할 수 있습니다.
!kdumpdescs
- KDUMP에 페이지 범위 및 페이지 설명자 목록을 표시합니다.
!kdumppagerange <n>
- KDUMP에서 페이지의 n번째 그룹화에 대한 정보를 표시합니다.
!kdumppfn <pfn>
- 페이지 프레임 <pfn>
및 해당 데이터가 KDUMP 내에 있는 위치에 대한 정보를 표시합니다.
기타 진단 명령
!cppex
- libstdc++의 내부 구조와 DWARF 기호를 사용하여 현재 스레드에 대한 현재 진행 중인 C++ 예외에 대한 정보를 표시합니다(catch되지 않고 "just").
!cppfilt [-n] <mangled name>
- c++filt 도구를 통해 실행된 것처럼 C++ 망가진 이름을 Demangles합니다. C==filtr 도구에 대한 자세한 내용은 c++filt(1) - Linux 수동 페이지를 참조 하세요.
!rustdemangle <mangled name>
- Rust가 망가진 이름을 데망글합니다. 녹 기호 이름 맨글링에 대한 자세한 내용은 Rust Symbol Mangling - RFC 2603을 참조하세요.