Bagikan melalui


Dampak Tabrakan Linux

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.

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.

Lihat juga

Simbol dan sumber Linux

Penelusuran kesalahan proses jarak jauh langsung Linux