Linux-összeomlási memóriaképek

Ez a cikk bemutatja, hogyan hozhat létre és tekinthet meg különböző típusú Linux-összeomlási memóriaképfájlokat. A Linux-összeomlási memóriaképek megtekintéséhez a WinDbg 1.2402.24001.0-s vagy újabb verziója szükséges.

Ha linuxos (nem Windows) alapvető memóriaképet nyit meg a WinDbg-ben, az alapszintű hibakereső parancsoknak megfelelően kell működniük, de a Windows-struktúrákra hivatkozó bővítmények és Windows-specifikus parancsok nem fognak működni.

Összeomlási memóriaképfájlok támogatása

Linux kernelképek

A Linux kernel tömörített KDUMP-ok megnyitása és a halottkori hibakeresés és elemzés teljes privát DWARF szimbólumokkal a Windows hibakeresőben érhető el.

A WinDbg csak a ZLIB tömörített KDUMP-fájlokat támogatja. Az LZO és a Snappy tömörített KDUMP-ok nem támogatottak.

A Linux KDUMP-okkal kapcsolatos általános információkért lásd a KDump (Linux) Wikipedia-oldalát és a Core dump Wikipedia-oldalát.

ELF memóriadumpok

Az Open Enclave támogatásának részeként a WinDbg képes megnyitni az ELF magos memóriaképeit és bináris fájljait, valamint a TÖRPE szimbólumokat (a TÖRPE 5 nem támogatott) az Enklávékból és Linux-alkalmazásokból. További információ az Open Enclave hibakereséséről: Open Enclave hibakeresés.

Folyamatkiürítések

Egyszeri folyamatelkiírások támogatottak. Számos módja van a folyamathiba-lerakatok gyűjtésének, például a Linux Sysinternals ProcDump for Linux segédprogram használata. Egy másik lehetőség a GNU Hibakereső – GDBServer használata egy magos memóriakép létrehozásához. További információ a GDBServerről: https://en.wikipedia.org/wiki/Gdbserver. A távoli gdb-hibakeresés dokumentációja elérhető a Sourceware webhelyén – Távoli programok hibakeresése.

A Windows Hibakeresők standard sablontárát (STL) egy NatVis-fájl biztosítja, stl.natvis amely a Visual Studióval és a Windowssal együtt szállított STL számos verzióját ismeri. A NATVIS szolgáltatással kapcsolatos általános információkért tekintse meg a NatVis natív hibakereső objektumait. A Linux-összetevőkhöz (GCC-khez vagy LLDB-ekhez) használt STL-verziók nagyon eltérőek.

A NATVIS-vizualizáció és a Linuxra optimalizált DML-hivatkozás bejárásának engedélyezéséhez először távolítsa el az alapértelmezett natvis-fájlt, a .scriptunload fájltstl.natvis.

Ezután töltsd be a fájlt a gstl.natvis használatával. A .scriptlist használatával ellenőrizze, hogy aktív-e 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'

A DML használatával kapcsolatos további információkért lásd: A hibakereső kimenetének testreszabása DML használatával.

A DisplayGreeting alkalmazás egyetlen folyamatmag-kiírása

Ez a példa bemutatja, hogyan hozhat létre egyetlen folyamatmag-memóriaképet a gdb használatával. A GDBServer WinDbg-lel való használatáról és egy kódbemutatóról további információt a Linux élő távoli folyamat hibakeresésében talál. A DisplayGreeting példakódjához tekintse meg a C++ alkalmazás útmutatóját.

A kívánt folyamat megkeresése

A linuxos összes folyamatot listázhatjuk a ps -A paranccsal, vagy használhatjuk a -f lehetőséget a pgrep használatával, mivel tudjuk, hogy a DisplayGreeting alkalmazást keressük.

$ pgrep -f DisplayGreeting
9382

Ebben a példában az útmutató egy 9382-ből álló folyamatazonosítót jelenít meg.

Csatolás a gdb-vel történő feldolgozáshoz és magdömping létrehozása

A gdb használatával csatlakozzon a folyamathoz.

$ gdb -p 9382

A generate-core-file gdb parancs súgójának megjelenítése.

(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>'.

Ezután a (gdb) parancssorban hozzon létre egy folyamatmag-memóriaképfájlt az alapértelmezett fájlnévvel.

(gdb) generate-core-file
Saved corefile core.9382
(gdb) quit

A Linux folyamatmag-dump betöltése és vizsgálata

A létrehozott magkép betöltéséhez használja a WinDbg Memóriadump megnyitása menüt.

Forrás- és szimbólumútvonalak hozzáadása a hibakereső munkamenethez

A forráskód és a változók megtekintéséhez állítsa be a szimbólumokat és a forrás elérési útját. A szimbólumok elérési útjának beállításával kapcsolatos általános információkért lásd a Szimbólumok használata című témakört. A Linux-szimbólumokkal kapcsolatos részletesebb információkért lásd a Linux-szimbólumokat és -forrásokat.

A szimbólum elérési útjának a hibakereső munkamenethez való hozzáadásához használható .sympath . Ebben a WSL Linux Ubuntu-példában a DisplayGreetings kód és szimbólumok érhetők el ezen a helyen egy Bob nevű felhasználó számára.

\\wsl$\Ubuntu\mnt\c\Users\Bob\

A WSL-ben ez a könyvtár megfelel a Windows operációs rendszer helyének: C:\Users\Bob\ Tehát ezt a két parancsot használja a rendszer.

.sympath C:\Users\Bob\

.srcpath C:\Users\Bob\

A WSL fájlrendszer windowsos eléréséről további információt a WSL fájlengedélyei című témakörben talál.

Ha további Linux operációsrendszer-szimbólumokat szeretne használni, adja hozzá a DebugInfoD szimbólumokat a .sympath hely használatával.

.sympath+ DebugInfoD*https://debuginfod.elfutils.org

.reload A parancs használatával töltse be újra a szimbólumokat.

Emellett támogatott a források automatikus letöltése a DebugInfoD-kiszolgálókról, amelyek támogatják az adott összetevőtípus visszaadását. A funkció előnyeinek kihasználásához adja hozzá a elfutils kiszolgálót a .srcpath használatával.

.srcpath+ DebugInfoD*https://debuginfod.elfutils.org

A folyamatkép vizsgálata

A lm parancs segítségével ellenőrizze, hogy a memóriaképfájl tartalmazza-e a DisplayGreeting alkalmazást.

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

Vegye figyelembe, hogy az első parancs végrehajtása eltarthat egy kis ideig, mivel a hibakeresési szimbólumok betöltve vannak a gyorsítótárba. Amellett, hogy szimbólumokat és bináris fájlokat keres a szimbólumkiszolgálón vagy a helyi keresési útvonalon keresztül, a GDBServer integrációja miatt ezeket a fájlokat egy távoli fájlrendszerből is betöltheti, ha nem találhatók helyileg. Ez a művelet általában lassabb, mint a szimszrv vagy egy helyi keresési útvonal szimbólumainak beszerzése.

x A parancs használatával megjelenítheti a DisplayGreetingben elérhető függvényeket.

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 A parancs használatával megtekintheti a helyi változó üdvözletét.

0:000> dx greeting
...
Error: Unable to bind name 'greeting'

Mivel az üdvözlés paraméter még nem volt használatban a mentés elkészítésekor, nem érhető el a mentés fájljában.

A dx parancsot használja a memóriaképfájlban elérhető folyamatok vizsgálatához.

: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   

A szálakra és modulokra vonatkozó információk megtekintéséhez kattintson a kimenetben létrehozott DML-hivatkozásra, vagy írja be az összeomlási memóriaképhez hasonló parancsokat.

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

A memóriaképfájl adatainak megjelenítéséhez használja az ELF/CORE diagnosztikai bővítményeket

Használja a Linux diagnosztikai bővítményeket – ELFBinComposition.dll a dömpfájl adatainak megjelenítéséhez. Például használja a !dumpdebug parancsot annak megerősítésére, hogy ez egy ELF felhasználói magkép, és más információkat is megjeleníthet.

0:000> !dumpdebug
Dump Diagnostics: Format = ELF User Core
********************************************************************************
File Mapping Size:           0x151d78 (1 Mb)
Highest Memory Offset:       0x14e5f0 (1 Mb)
...

A NT_PRPSINFO adatok megjelenítésére használható !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

Kernel KDump összeomlásmentések

Linuxon sokféleképpen hozhat létre összeomlási memóriaképfájlt. Az Ubuntu Linuxot tartalmazó egyik lehetőséget például a Kernel összeomlási memóriaképe ismerteti.

Más lehetőségek közé tartozik a kexec-tools használata a Kdump engedélyezéséhez. További információ: KDump (Linux). Ha a kdump engedélyezve van, ellenőrizheti, hogy a kdump aktív és fut-e a systemctl status kdump használatával.

Miután az operációs rendszer összeomlása kiváltva lett egy tesztrendszeren, létrejön a rendszerösszeomlási naplófájl.

A Linux operációs rendszer összeomlási memóriaképének betöltése és vizsgálata

A létrehozott kdump betöltéséhez használja a Memóriaképfájl megnyitása menüt.

Az előző szakaszban leírtak szerint engedélyezze a NATVIS-vizualizációt és a Linuxra optimalizált DML-hivatkozás bejárását a gstl.natvis fájl betöltésével.

Linux kernel memóriakiírásának elemzése ELF Bin összeállítási parancsokkal

Ha további ELF Bin-összeállítási parancsokat szeretne használni, a .chain paranccsal győződjön meg arról, hogy a ELFBinComposition.dll be van töltve.

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]
...

Ha az ELFBinComposition nincs betöltve, használja a .load-ot a betöltéshez. További információ: .load, .loadby (Load Extension DLL)

!ELFBinComposition.dumpdebug A parancs használatával megjelenítheti a betöltött memóriaképfájl adatait. Ebben a példában egy ELF felhasználói mag memóriaképfájl lett betöltve.

0: kd> !ELFBinComposition.dumpdebug
Dump Diagnostics: Format = Kernel KDump
********************************************************************************
File Mapping Size:           0x3b34090 (59 Mb)
Highest Memory Offset:       0x3b34090 (59 Mb)

Az ELFBinComposition !vmcoreinfo használatával megjelenítheti a VMCOREINFO táblát a hibakeresés alatt álló Linux kernelmag-memóriaképből (KDUMP).

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
...

Használja a !kdumppagerange-t a memóriaképfájl első részének kiírásához, nullától kezdődően.

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

A !kdumppagerange kimenete különböző lapkeret -értékeket (PFN) jelenít meg. Kiválaszthatunk egy érdekeset, és a !kdumppfn <PFN> használatával megjeleníthetjük a PFN-ről és az adatok KDUMP-beli helyzetéről szóló információkat.

0: kd> !kdumppfn 0x540e0
    Page frame 0x540e0 = File offset [0x307430, 0x307b9f) 0x76f bytes as ZLIB...

A memóriaképfájl vizsgálata

k A parancs használatával megjelenítheti a hívási vermet annak vizsgálatához, hogy melyik kód futott az összeomláskor.

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 A parancs használatával vizsgálja meg a memóriaképfájlt. Tekintse meg például az első 30 folyamatot ezzel a paranccsal.

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]
...

Kattintson a DML-hivatkozásokra, vagy használja az ehhez hasonló parancsokat egy érdekes folyamat szálainak megtekintéséhez.

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            
...

Az egyes szálakról további információk érhetők el az alábbiakban látható módon.

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

Linux-kernel-memóriakép elemzése a LinuxKernel.js szkripttel

A LinuxKernel.js hibakereső bővítmény olyan parancsokat tartalmaz, amelyek hasonlóan működnek, mint a Linux összeomlási segédprogramban található parancsok, amelyek a Linux Kernel mód összeomlásainak megnyitására és elemzésére szolgálnak.

A szkript használatához először töltse be a szkriptet.

0: kd> .scriptload LinuxKernel.js
JavaScript script successfully loaded from 'C:\Users\Bob\AppData\Local\dbg\UI\Fast.20240423.1\amd64\winext\LinuxKernel.js'

A szkriptek betöltésével kapcsolatos további információkért lásd: JavaScript Debugger Scripting.

Fájlok!

Az !files használatával jelenítse meg a dump fájlban a Linux fájlrendszerével kapcsolatos információkat. Hasonló az összeomlási fájlokhoz kapcsolódó parancshoz.

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 szintaxis:

!files [<arg>]

Nélkül [<arg>] - Egyenértékű a "fájlok:" - megadja az aktuális folyamat fájllistáját

[<arg>]:

pid - Megadja a megadott folyamatazonosító fájllistáját

64-bit num - Megadja a feladat fájllistáját a megadott címen

<task struct [*]> – Megadja az adott feladatszerkezet fájllistáját objektum szerint

<process object> – Megadja a folyamatobjektum által képviselt feladat fájllistáját

!felszerel

Az !mount használatával jelenítse meg a dump fájlban a Linux fájlrendszerével kapcsolatos információkat.

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 szintaxis:

Anélkül [<arg>]– Egyenértékű a "csatlakoztatás" paranccsal – csatlakoztatott fájlrendszereket jelenít meg

[<arg>]:

pid - Megadja a csatolt fájlrendszereket a folyamat névterének az adott pid-vel

64-bit num - A cím alapján megadott task_struct névterehez tartozó csatlakoztatott fájlrendszereket adja meg

<task struct [*]> - Megjeleníti a csatolt fájlrendszereket az adott task_struct névteréhez

<process object> - Megjeleníti a csatlakoztatott fájlrendszereket a folyamat által meghatározott feladat névterében.

!net

A rendszer hálózati listájának megjelenítéséhez használja a !net elemet.

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 szintaxis:

!net [<arg>]

Nélkül [<arg>]- Egyenértékű a "net" - ad rendszer hálózati listát

[<arg>]:

pid - Megadja a folyamat névterének nettó listáját az adott pid használatával

64-bit num - Megadja a cím alapján megadott task_struct névterének nettó listáját

<task struct [*]> - Megadja az adott task_struct névterének nettó listáját

<process object> - Megadja a folyamat által képviselt tevékenység névterének nettó listáját

!runq

A parancs használatával !runq megjelenítheti a futtatási várólistán lévő feladatokkal kapcsolatos információkat.

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 szintaxis:

!runq

A!runq nem rendelkezik parancsparaméterekkel.

További kernelkép-parancsok

!dev – Megjeleníti az eszköz karakter- és blokkadatait, hozzárendeléseit, I/O-porthasználatát, I/O-memóriahasználatát.

!log – Megjeleníti a kernel log_buf tartalmát.

!vm – Megjeleníti a virtuális memória használatának összegzését.

!timer – Megjeleníti az időzítő sor bejegyzéseit.

dx parancs és Linux-objektumok

A dx parancs használható a kdumps vizsgálatára. A Munkamenetek objektum megjelenítése a különböző elérhető gyermekobjektumok megtekintéséhez.

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   
...

A cursession Kernel objektum tartalmazza a PrintKLog objektumot, amely a kernelnapló megtekintésére használható.

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

Ez a dx parancs bemutatja, hogyan lehet a .Contains() segítségével megkeresni a konkrét sztringeket a naplóban.

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»=.

Az utolsó naplózott események megjelenítésére használható .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...

További információ a LINQ-lekérdezések dx paranccsal való használatáról: LINQ használata hibakereső objektumokkal.

Linux diagnosztikai bővítmények – ELFBinComposition.dll

A következő Linux memóriadump diagnosztikai bővítmények érhetők el a ELFBinComposition.dll.

Fájlmentési parancsok

Ezek a parancsok a legtöbb memóriaképfájlban használhatók.

!dumpdebug - Megjeleníti a hibakeresés alatt álló mag memóriakép diagnosztikáit. Ez magában foglalja a különböző más parancsok kimenetét is.

!ntprstatus - Megjeleníti az NT_PRSTATUS rekordokat a hibakeresés alatt álló magkép fájlból.

!vmcoreinfo - Megjeleníti a VMCOREINFO táblát a hibakeresés alatt álló kernelmag-memóriaképből (KDUMP).

ELF kiíratási parancsok

Ezek a parancsok csak ELF formátumú rendszermag-memóriaképfájlokon használhatók.

!corephdrs – Megjeleníti a hibakeresés alatt álló magfájl fejléc táblázatát.

!ntprpsinfo - Megjeleníti az NT_PRPSINFO adatokat a magkép hibakeresés alatt lévő részéből.

!ntfile - Megjeleníti a NT_FILE adatokat a hibakeresés alatt álló alapvető memóriaképből.

!ntauxv - Megjeleníti az NT_AUXV adatokat a hibakeresett magfájlból.

Kernel összeomlási memóriaképének fájlparancsai

Ezek a parancsok csak kernelmag-memóriaképek (KDUMP) fájljain használhatók.

!kdumpdescs - Az oldaltartományok és oldalleírók listájának megjelenítése KDUMP-ban.

!kdumppagerange <n> – A KDUMP lapjainak n-edik csoportosításával kapcsolatos információk megjelenítése.

!kdumppfn <pfn> – Megjelenítheti az oldalkerettel <pfn> kapcsolatos információkat, és hogy az adatok hol találhatók a KDUMP-ben.

Egyéb diagnosztikai parancsok

!cppex - Megjeleníti az aktuális szálon lévő C++ kivételek adatait, amelyek nincsenek vagy éppen csak lettek kezelve, a libstdc++ belső struktúrái és a DWARF szimbólumok használatával.

!cppfilt [-n] <mangled name> - Visszafejt egy C++ mangled nevet, mintha a c++filt eszközön futna. További információ a C==filtr eszközről: c++filt(1) – Linux manuális oldal.

!rustdemangle <mangled name> - Visszaalakítja a Rust eltorzított nevet. További információ a Rust szimbólumnevek eltorzításáról: Rust Symbol Mangling - RFC 2603.

Lásd még

Linux-szimbólumok és -források

Linux élő távoli folyamat hibakeresési