Поделиться через


Аварийные дампы Linux

В этой статье описывается создание и просмотр различных типов файлов аварийного дампа Linux. Для просмотра аварийных дампов Linux требуется WinDbg версии 1.2402.24001.0 или более поздней.

При открытии основного дампа Linux (не windows) в WinDbg базовые команды отладчика должны работать правильно, но расширения и команды, относящиеся к Windows, не будут работать.

Поддерживаемые файлы аварийного дампа

Дампы ядра Linux

Открытие сжатых KDUMPs ядра Linux и выполнение послеморозной отладки и анализа с полными частными символами DWARF доступно в отладчике Windows.

WinDbg поддерживает только сжатые файлы KDUMP ZLIB. LZO и Snappy сжатые KDUMPs не поддерживаются.

Общие сведения о KDUMPs Linux см . на странице Википедии KDump (Linux) и дамп Ядра.

Дампы ядра ELF

В рамках поддержки Open Enclave WinDbg может открывать дампы и двоичные файлы ELF, а также символы DWARF (КАРЛИК 5 не поддерживаются) как из анклавов, так и приложений Linux. Дополнительные сведения о open Enclave см. в разделе "Отладка Open Enclave".

Дампы процесса

Поддерживаются однопроцессные дампы. Существует несколько способов сбора дампа процесса, включая служебную программу Sysinternals ProcDump для Linux . Другим вариантом является использование отладчика GNU — GDBServer для создания основного дампа. Дополнительные сведения о GDBServer см. в статье https://en.wikipedia.org/wiki/Gdbserver. Документация по удаленной отладке gdb доступна на веб-сайте исходного поверх — отладка удаленных программ.

Расширяемость стандартной библиотеки шаблонов (STL) в отладчиках Windows предоставляется файлом NatVis, который понимает множество версий STL, stl.natvis которые поставляются с Visual Studio и Windows. Общие сведения о NATVIS см. в разделе "Собственные объекты отладчика" в NatVis. Версии STL, используемые для компонентов Linux (GCC или LLDB), отличаются.

Чтобы включить визуализацию NATVIS и обход канала DML, оптимизированный для Linux, сначала выгрузите файл natvis по умолчанию, скриптunloadstl.natvis.

Затем .scriptload the gstl.natvis file. Используйте .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. Дополнительные сведения об использовании GDBServer с WinDbg и пошаговом руководстве по коду см . в статье об отладке удаленного процесса Linux. Пример кода для DisplayGreeting см . в пошаговом руководстве по приложению C++.

Поиск требуемого процесса

Мы можем либо перечислить все процессы в Linux с помощью ps -A команды, либо использовать параметр -f с pgrep, так как мы знаем, что мы ищем приложение DisplayGreeting.

$ pgrep -f DisplayGreeting
9382

В этом пошаговом руководстве показано идентификатор процесса 9382.

Присоединение к процессу с помощью gdb и создание основного дампа

Используйте gdb для присоединения к процессу.

$ gdb -p 9382

Отображение справки по команде generate-core-file 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>'.

Затем в запросе (gdb) создайте файл дампа ядра процесса с именем файла по умолчанию.

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

Загрузка и проверка дампа ядра процесса Linux

Используйте параметр меню "Открыть файл дампа" в WinDbg, чтобы загрузить созданный основной дамб.

Добавление путей к источнику и символам в сеанс отладчика

Чтобы просмотреть исходный код и переменные, задайте символы и путь к источнику. Общие сведения о настройке пути символов см. в разделе "Использование символов". Дополнительные сведения о символах Linux см. в разделе "Символы и источники Linux".

Используйте .sympath для добавления пути символа в сеанс отладчика. В этом примере Ubuntu WSL для Linux код и символы DisplayGreetings доступны для пользователя с именем Bob.

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

В WSL этот каталог сопоставляется с расположением ОС Windows: C:\Users\Bob\ поэтому используются две команды.

.sympath C:\Users\Bob\

.srcpath C:\Users\Bob\

Дополнительные сведения о доступе к файловой системе WSL в Windows см. в разделе "Разрешения файлов" для WSL.

Чтобы воспользоваться дополнительными символами ОС Linux, добавьте символы DebugInfoD с помощью расположения Sympath.

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

.reload Используйте команду для перезагрузки символов.

Также поддерживается автоматическая загрузка источников с серверов DebugInfoD, которые поддерживают возврат этого типа артефакта. Чтобы воспользоваться этой возможностью, добавьте сервер elfutils с помощью Srcpath.

.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 для отображения сведений о файле дампа. Например, используйте !dumpdebug для подтверждения того, что это дамп ядра пользователя ELF, а также отображение других сведений.

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

Используется !ntprpsinfo для отображения 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

Аварийные дампы ядра KDump

В Linux существует множество способов создания файла аварийного дампа. Например, один из вариантов с Ubuntu Linux описан в аварийном дампе ядра.

Другие варианты включают использование kexectools для включения Kdump. Дополнительные сведения см. в разделе KDump (Linux). Если kdump включен, можно убедиться, что kdump активен и работает с помощью systemctl status kdump.

После запуска сбоя ОС в тестовой системе создается файл аварийного дампа.

Загрузка и проверка аварийного дампа ОС Linux

Используйте параметр меню "Открыть файл дампа", чтобы загрузить созданный kdump.

Как описано в предыдущем разделе, включите визуализацию NATVIS и обход канала DML, оптимизированный для Linux, загрузив gstl.natvis файл.

Использование команд композиции bin ELF для анализа дампа ядра Linux

Чтобы иметь возможность использовать дополнительные команды композиции bin ELF, используйте команду цепочки для подтверждения загрузки 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 , чтобы отобразить таблицу VMCOREINFO из отладчика ядра Ядра Linux (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
...

!kdumppagerange Используйте для дампа первой части файла дампа, начиная с нуля.

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). Мы можем выбрать один из интересующих вас элементов и использовать !kdumppfn <PFN> его для отображения сведений о PFN и местах его данных в KDUMP.

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

Без [<arg>]— эквивалент "files" — предоставляет текущий список файлов процесса

[<arg>]:

pid — предоставляет список файлов для заданного идентификатора процесса.

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 синтаксис:

Без [<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>]

Без [<arg>]— эквивалент "net" — предоставляет системный список сети

[<arg>]:

pid — предоставляет чистый список для пространства имен процесса с заданным pid

64-bit num — предоставляет чистый список для пространства имен task_struct, заданного по адресу.

<task struct [*]> — предоставляет чистый список для пространства имен заданного task_struct

<process object> — предоставляет чистый список для пространства имен задачи, представленной процессом.

!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 — Отображает данные устройства, касающиеся символов и блокировок устройств, назначений, использования портов ввода-вывода, использования памяти ввода-вывода.

!log — отображает содержимое ядра log_buf.

!vm — Отображает сводку по использованию виртуальной памяти.

!timer — отображает записи очереди таймера.

Команды dx и объекты Linux

Команда dx может использоваться для исследования kdumps. Отображение объекта Session для просмотра различных дочерних объектов, доступных.

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

Объект ядра cursession содержит объект 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...

Дополнительные сведения об использовании запросов LINQ с командой DX см. в разделе "Использование LINQ С объектами отладчика".

Расширения диагностики Linux — ELFBinComposition.dll

В ELFBinComposition.dll доступны следующие расширения диагностики файлов дампа Linux.

Команды файла дампа

Эти команды можно использовать в большинстве файлов дампа.

!dumpdebug— отображение диагностика для отлаживаемого основного дампа. Сюда входят выходные данные различных других команд.

!ntprstatus — Отображение записей NT_PRSTATUS из отлаживаемого основного дампа.

!vmcoreinfo — Отображение таблицы VMCOREINFO из отлаживаемого дампа ядра ядра (KDUMP).

Команды дампа ELF

Эти команды можно использовать только в файлах дампа ядра ELF.

!corephdrs — Отображает таблицу заголовков программы для отлаживаемого дампа ядра.

!ntprpsinfo — отображение NT_PRPSINFO данных из отлаживаемого основного дампа.

!ntfile — отображение NT_FILE данных из отлаживаемого основного дампа.

!ntauxv — отображение NT_AUXV данных из отлаживаемого основного дампа.

Команды файла аварийного дампа ядра

Эти команды можно использовать только в файлах дампа ядра ядра (KDUMP).

!kdumpdescs — Отображение списка диапазонов страниц и дескрипторов страницы в KDUMP.

!kdumppagerange <n> — Отображение сведений о группе n-th страниц в KDUMP.

!kdumppfn <pfn> — отображение сведений о кадре <pfn> страницы и его данных в KDUMP.

Другие команды диагностики

!cppex — Отображает сведения о текущих встроенных (не пойманных и просто) исключениях C++ для текущего потока с использованием внутренних структур libstdc++и символов DWARF.

!cppfilt [-n] <mangled name> — Деманглирует имя C++, как если бы оно выполнялось через средство c++filt. Дополнительные сведения о средстве C==filtr см . на странице c++filt(1) — страница вручную для Linux.

!rustdemangle <mangled name> - Деманглирует имя Rust с мангленым именем. Дополнительные сведения о имене символов rust см. в статье Rust Symbol Mangling — RFC 2603.

См. также

Символы и источники Linux

Отладка удаленного процесса Linux