Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menjelaskan cara membuat dan melihat berbagai jenis file crash dump Linux. Melihat crash dump Linux memerlukan WinDbg versi 1.2402.24001.0 atau lebih tinggi.
Saat membuka cadangan inti Linux (non-Windows) di WinDbg, perintah debugger dasar semuanya harus berfungsi dengan baik, tetapi ekstensi dan perintah khusus Windows yang mereferensikan struktur Windows, tidak akan berfungsi.
Dukungan untuk berkas pembuangan memori
Cadangan kernel Linux
Membuka KDUMP terkompresi dari Kernel Linux serta melakukan debugging dan analisis pasca-mortem menggunakan simbol DWARF privat secara penuh kini dapat dilakukan melalui debugger Windows.
WinDbg hanya mendukung file KDUMP terkompresi ZLIB. LZO dan KDUMP terkompresi Snappy tidak didukung.
Untuk informasi umum tentang Linux KDUMPs, lihat halaman Wikipedia KDump (Linux), dan Core dump.
Cadangan inti ELF
Sebagai bagian dari dukungan Open Enclave, WinDbg dapat membuka core dump dan biner ELF serta simbol DWARF (DWARF 5 tidak didukung) dari Enklave dan aplikasi Linux. Untuk informasi selengkapnya tentang Open Enclave, lihat Membuka penelusuran kesalahan Enklave.
Proses pencadangan
Pembuangan proses tunggal didukung. Ada sejumlah cara untuk mengumpulkan dump proses, termasuk utilitas Sysinternals ProcDump untuk Linux. Opsi lain adalah menggunakan GNU Debugger - GDBServer, untuk menghasilkan cadangan inti. Untuk informasi selengkapnya tentang GDBServer, lihat https://en.wikipedia.org/wiki/Gdbserver. Dokumentasi untuk debugging gdb jarak jauh tersedia di situs web Sourceware - Debugging Remote Programs.
Mengaktifkan visualisasi LINUX NATVIS dan traversal tautan DML
Ekstensibilitas Pustaka Templat Standar (STL) di Windows Debuggers disediakan oleh file NatVis, stl.natvis yang memahami banyak versi STL yang dikirim dengan Visual Studio dan Windows. Untuk informasi umum tentang NATVIS, lihat Objek Debugger Asli di NatVis. Versi STL yang digunakan untuk komponen Linux (GCC atau LLDB) sangat berbeda.
Untuk mengaktifkan visualisasi NATVIS dan traversal tautan DML yang dioptimalkan untuk Linux, pertama-tama memuat keluar file natvis default, .scriptunloadstl.natvis.
Kemudian muat file .scriptloadgstl.natvis. Gunakan .scriptlist untuk mengonfirmasi bahwa gstl.natvis aktif.
0: kd> .scriptlist
Command Loaded Scripts:
...
NatVis script from 'C:\Users\Bob\AppData\Local\dbg\UI\2402.24001.0\amd64\Visualizers\gstl.natvis'
Untuk informasi selengkapnya tentang bekerja dengan DML, lihat Menyesuaikan Output Debugger Menggunakan DML.
Cadangan inti proses tunggal dari aplikasi DisplayGreeting
Contoh ini menunjukkan cara membuat cadangan inti proses tunggal menggunakan gdb. Untuk informasi selengkapnya tentang menggunakan GDBServer dengan WinDbg, dan penjelasan kode, lihat Debugging proses langsung pada sistem Linux secara jarak jauh. Untuk contoh kode untuk DisplayGreeting, lihat panduan aplikasi C++.
Temukan proses yang diinginkan
Kita dapat mencantumkan semua proses di Linux menggunakan ps -A perintah , atau menggunakan opsi -f dengan pgrep, seperti yang kita tahu bahwa kita mencari aplikasi DisplayGreeting.
$ pgrep -f DisplayGreeting
9382
Dalam contoh panduan ini, ini menunjukkan ID proses 9382.
Lampirkan ke proses dengan gdb dan hasilkan cadangan inti
Gunakan gdb untuk melampirkan ke proses.
$ gdb -p 9382
Tampilkan bantuan untuk generate-core-file perintah gdb.
(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>'.
Kemudian pada prompt (gdb), buat file cadangan inti proses dengan nama file default.
(gdb) generate-core-file
Saved corefile core.9382
(gdb) quit
Memuat dan memeriksa dump inti proses Linux
Gunakan opsi menu Buka file cadangan di WinDbg untuk memuat cadangan inti yang dihasilkan.
Menambahkan jalur sumber dan simbol ke sesi debugger
Untuk melihat kode sumber dan variabel, atur simbol dan jalur sumber. Untuk informasi umum tentang mengatur jalur simbol, lihat Menggunakan Simbol. Untuk informasi lebih rinci tentang simbol Linux, lihat simbol dan sumber Linux.
Gunakan .sympath untuk menambahkan jalur simbol ke sesi debugger. Dalam contoh WSL Linux Ubuntu ini, kode dan simbol DisplayGreetings tersedia di lokasi ini, untuk pengguna bernama Bob.
\\wsl$\Ubuntu\mnt\c\Users\Bob\
Di WSL, direktori ini memetakan ke lokasi OS Windows: C:\Users\Bob\ Jadi kedua perintah ini digunakan.
.sympath C:\Users\Bob\
.srcpath C:\Users\Bob\
Untuk informasi selengkapnya tentang mengakses sistem file WSL di Windows, lihat Izin File untuk WSL.
Untuk mendapatkan manfaat dari simbol OS Linux tambahan, tambahkan simbol DebugInfoD menggunakan lokasi .sympath.
.sympath+ DebugInfoD*https://debuginfod.elfutils.org
.reload Gunakan perintah untuk memuat ulang simbol.
Juga didukung adalah pengunduhan otomatis sumber dari server DebugInfoD, yang mendukung pengembalian jenis artefak tersebut. Untuk memanfaatkan kemampuan ini, tambahkan server elfutils menggunakan .srcpath.
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org
Memeriksa proses dump
lm Gunakan perintah untuk mengonfirmasi bahwa file cadangan berisi aplikasi 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
Perhatikan bahwa eksekusi perintah pertama mungkin memakan waktu sedikit, karena simbol debug dimuat ke dalam cache. Selain mencari simbol dan biner melalui server simbol atau jalur pencarian lokal Anda, karena integrasi GDBServer, itu dapat memuat file-file ini dari sistem file jarak jauh jika tidak dapat ditemukan secara lokal. Operasi ini biasanya lebih lambat daripada memperoleh simbol dari symsrv atau jalur pencarian lokal.
x Gunakan perintah untuk menampilkan fungsi yang tersedia di 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)
Gunakan perintah dx untuk melihat variabel lokal greeting.
0:000> dx greeting
...
Error: Unable to bind name 'greeting'
Karena sapaan parameter belum digunakan ketika cadangan diambil, itu tidak tersedia dalam file cadangan.
dx Gunakan perintah untuk memeriksa proses yang tersedia dalam file cadangan.
: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
Untuk melihat informasi tentang thread dan modul, klik pada tautan DML yang dihasilkan dalam output, atau ketik perintah yang serupa untuk crash dump Anda.
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
Gunakan ekstensi diagnostik ELF/CORE untuk menampilkan informasi file cadangan
Gunakan ekstensi diagnostik Linux - ELFBinComposition.dll untuk menampilkan informasi file cadangan. Misalnya, gunakan !dumpdebug untuk mengonfirmasi bahwa ini adalah dump inti pengguna ELF, dan menampilkan informasi lainnya.
0:000> !dumpdebug
Dump Diagnostics: Format = ELF User Core
********************************************************************************
File Mapping Size: 0x151d78 (1 Mb)
Highest Memory Offset: 0x14e5f0 (1 Mb)
...
Gunakan !ntprpsinfo untuk menampilkan data NT_PRPSINFO.
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
Kernel KDump crash dumps
Ada banyak cara untuk membuat file crash dump di Linux. Misalnya, satu opsi dengan Ubuntu Linux dijelaskan dalam crash dump Kernel.
Opsi lain termasuk penggunaan kexectools untuk mengaktifkan Kdump. Untuk informasi selengkapnya, lihat KDump (Linux). Jika kdump diaktifkan, Anda dapat memverifikasi bahwa kdump aktif dan berjalan menggunakan systemctl status kdump.
Setelah crash OS dipicu pada sistem pengujian, file crash dump dibuat.
Memuat dan memeriksa crash dump OS Linux
Gunakan opsi menu Buka file cadangan untuk memuat kdump yang dihasilkan.
Seperti yang dijelaskan di bagian sebelumnya, aktifkan visualisasi NATVIS dan traversal tautan DML yang dioptimalkan untuk Linux, dengan memuat gstl.natvis file.
Gunakan perintah komposisi Bin ELF untuk menganalisis cadangan kernel Linux
Agar dapat menggunakan perintah komposisi Bin ELF tambahan, gunakan perintah .chain untuk mengonfirmasi bahwa ELFBinComposition.dll dimuat.
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]
...
Jika ELFBinComposition tidak dimuat, gunakan .load untuk memuatnya. Untuk informasi selengkapnya, lihat .load, .loadby (LOAD Extension DLL)
!ELFBinComposition.dumpdebug Gunakan perintah untuk menampilkan informasi tentang file cadangan yang dimuat. Dalam contoh ini, file cadangan inti pengguna ELF telah dimuat.
0: kd> !ELFBinComposition.dumpdebug
Dump Diagnostics: Format = Kernel KDump
********************************************************************************
File Mapping Size: 0x3b34090 (59 Mb)
Highest Memory Offset: 0x3b34090 (59 Mb)
Gunakan ELFBinComposition !vmcoreinfo untuk menampilkan tabel VMCOREINFO dari linux kernel core dump (KDUMP) yang sedang di-debug.
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
...
Gunakan !kdumppagerange untuk mendump bagian pertama dari file dump, mulai dari nol.
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
Output dari !kdumppagerange menampilkan berbagai nilai bingkai halaman (PFN). Kita dapat memilih satu yang menarik dan menggunakan !kdumppfn <PFN> untuk menampilkan informasi tentang PFN dan letak datanya di dalam KDUMP.
0: kd> !kdumppfn 0x540e0
Page frame 0x540e0 = File offset [0x307430, 0x307b9f) 0x76f bytes as ZLIB...
Memeriksa file cadangan
k Gunakan perintah untuk menampilkan tumpukan panggilan untuk menyelidiki kode apa yang berjalan saat crash terjadi.
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
Gunakan perintah dx untuk memeriksa berkas limpahan. Misalnya, lihat 30 proses pertama menggunakan perintah ini.
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]
...
Klik tautan DML, atau gunakan perintah yang mirip dengan ini, untuk melihat thread pada proses yang diminati.
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
...
Informasi tambahan untuk setiap utas tersedia, seperti yang ditunjukkan di bawah ini.
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
Gunakan skrip LinuxKernel.js untuk menganalisis cadangan kernel Linux
Ekstensi debugger LinuxKernel.js berisi sekumpulan perintah yang dirancang untuk berfungsi mirip dengan yang ditemukan di utilitas crash Linux yang digunakan untuk membuka dan menganalisis crash mode Kernel Linux.
Untuk menggunakan skrip, muat skrip terlebih dahulu.
0: kd> .scriptload LinuxKernel.js
JavaScript script successfully loaded from 'C:\Users\Bob\AppData\Local\dbg\UI\Fast.20240423.1\amd64\winext\LinuxKernel.js'
Untuk informasi selengkapnya tentang bekerja dengan pemuatan skrip, lihat JavaScript Debugger Scripting.
!File
!files Gunakan untuk menampilkan informasi tentang struktur file Linux dalam file cadangan. Ini mirip dengan perintah crash file.
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 sintaksis:
!files [<arg>]
Tanpa [<arg>]- Setara dengan 'file' - memberikan daftar file proses saat ini
[<arg>]:
pid - Memberikan daftar file untuk id proses yang diberikan
64-bit num - Memberikan daftar file untuk tugas di alamat yang diberikan
<task struct [*]> - Menampilkan daftar berkas untuk struct tugas yang diberikan berdasarkan objek
<process object> - Memberikan daftar file untuk tugas yang diwakili oleh objek proses
!pasang
!mount Gunakan untuk menampilkan informasi tentang struktur file Linux dalam file cadangan.
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 sintaksis:
Tanpa [<arg>]- Setara dengan perintah 'mount' - menunjukkan sistem file yang dipasang
[<arg>]:
pid - Menampilkan sistem file yang terpasang untuk namespace dari proses dengan pid yang diberikan
64-bit num - Memberikan sistem file yang dipasang untuk namespace task_struct yang diberikan oleh alamat
<task struct [*]> - Memberikan sistem file yang dipasang untuk namespace dari task_struct yang diberikan
<process object> - Menampilkan sistem file yang sudah di-mount untuk namespace tugas yang diwakili oleh proses
!net
!net Gunakan untuk menampilkan daftar jaringan sistem.
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 sintaksis:
!net [<arg>]
Tanpa [<arg>]- Setara dengan 'net' - memberikan daftar jaringan sistem
[<arg>]:
pid - Memberikan daftar bersih untuk namespace proses dengan pid yang diberikan
64-bit num - Memberikan daftar bersih untuk namespace task_struct yang diberikan oleh alamat
<task struct [*]> - Memberikan daftar untuk namespace dari task_struct yang ditentukan
<process object> - Memberikan netlist untuk namespace dari tugas yang diwakili oleh proses
!runq
Gunakan !runq untuk menampilkan informasi tentang tugas pada antrean pelaksanaan.
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 sintaksis:
!runq
!runq tidak memiliki parameter perintah apa pun.
Perintah pembuangan kernel tambahan
!dev - Menampilkan data perangkat mengenai karakter dan perangkat blok, penugasan, penggunaan port I/O, penggunaan memori I/O.
!log - Menampilkan konten log_buf kernel.
!vm - Menampilkan ringkasan penggunaan memori virtual.
!timer - Menampilkan entri antrian penghitung waktu.
perintah dx dan objek Linux
Perintah dx dapat digunakan untuk menyelidiki kdump. Tampilkan objek Sesi untuk melihat berbagai objek turunan yang tersedia.
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
...
Objek Kernel cursession berisi objek PrintKLog yang dapat digunakan untuk melihat log kernel.
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
Perintah dx ini menunjukkan penggunaan .Contains() untuk mencari string tertentu dalam log.
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»=.
Gunakan .Reverse() untuk menampilkan peristiwa terakhir yang dicatat.
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...
Untuk informasi selengkapnya tentang menggunakan kueri LINQ dengan perintah dx, lihat Menggunakan LINQ dengan objek debugger.
Ekstensi diagnostik Linux - ELFBinComposition.dll
Ekstensi diagnostik file cadangan Linux berikut tersedia di ELFBinComposition.dll.
Perintah file cadangan
Perintah ini dapat digunakan pada sebagian besar file cadangan.
!dumpdebug - Tampilkan diagnostik untuk core dump yang sedang di-debug. Ini termasuk output dari berbagai perintah lainnya.
!ntprstatus - Tampilkan rekaman NT_PRSTATUS dari core dump yang sedang di-debug.
!vmcoreinfo - Tampilkan tabel VMCOREINFO dari kernel core dump (KDUMP) yang sedang di-debug.
Perintah pembuangan ELF
Perintah ini hanya dapat digunakan pada file cadangan inti ELF.
!corephdrs - Tampilkan tabel header program untuk core dump yang sedang di-debug.
!ntprpsinfo - Tampilkan data NT_PRPSINFO dari core dump yang sedang di-debug.
!ntfile - Tampilkan data NT_FILE dari core dump yang sedang di-debug.
!ntauxv - Tampilkan data NT_AUXV dari core dump yang sedang di-debug.
Perintah untuk file dump crash kernel
Perintah ini hanya dapat digunakan pada file kernel core dump (KDUMP).
!kdumpdescs - Tampilkan daftar rentang halaman & deskriptor halaman dalam KDUMP.
!kdumppagerange <n> - Tampilkan informasi tentang pengelompokan halaman ke-n di KDUMP.
!kdumppfn <pfn> - Tampilkan informasi tentang bingkai <pfn> halaman dan di mana datanya berada dalam KDUMP.
Perintah diagnostik lainnya
!cppex - Menampilkan informasi tentang pengecualian C++ yang sedang berlangsung saat ini (tidak tertangkap dan "baru saja" tertangkap) untuk utas saat ini, menggunakan struktur internal libstdc++ dan simbol DWARF.
!cppfilt [-n] <mangled name> - Memperbaiki nama C++ yang ter-mangle seperti dijalankan melalui alat c++filt. Untuk informasi selengkapnya tentang alat C==filtr, lihat c++filt(1) — Halaman manual Linux.
!rustdemangle <mangled name> - Demangles nama rust mangled. Untuk informasi selengkapnya tentang mangling nama simbol Rust, lihat Rust Symbol Mangling - RFC 2603.