Аварийные дампы 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 доступна на веб-сайте исходного поверх — отладка удаленных программ.
Включение визуализации NATVIS Linux и обхода ссылок DML
Расширяемость стандартной библиотеки шаблонов (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.