Volcados de memoria de Linux
En este artículo se describe cómo crear y ver diferentes tipos de archivos de volcado de memoria de Linux. La visualización de volcados de memoria de Linux requiere WinDbg versión 1.2402.24001.0 o posterior.
Al abrir un volcado de núcleo de Linux (que no es de Windows) en WinDbg, todos los comandos básicos del depurador deben funcionar correctamente, pero las extensiones y los comandos específicos de Windows que hacen referencia a las estructuras de Windows, no funcionarán.
Archivos de volcado de memoria admitidos
Volcados de kernel de Linux
La apertura de KDUMPs comprimidos por kernel de Linux y la depuración y análisis posteriores al análisis con símbolos ENANO privados completos está disponible en el depurador de Windows.
WinDbg solo admite archivos KDUMP comprimidos ZLIB. Los KDUMPs comprimidos LZO y Snappy no son compatibles.
Para obtener información general sobre KDUMPs de Linux, consulte la página de Wikipedia de KDump (Linux) y el volcado de memoria principal.
Volcados de memoria principal de ELF
Como parte de la compatibilidad con Open Enclave, WinDbg puede abrir volcados de núcleo y archivos binarios elF, así como símbolos ENANOs (NO se admite ENANO 5) tanto de enclaves como de aplicaciones Linux. Para obtener más información sobre Open Enclave, consulte Depuración de Open Enclave.
Volcados de proceso
Se admiten volcados de memoria de proceso únicos. Hay varias maneras de recopilar un volcado de proceso, incluida la utilidad ProcDump para Linux Sysinternals ProcDump para Linux . Otra opción es usar el depurador GNU - GDBServer para generar un volcado de memoria principal. Para más información sobre GDBServer, consulte https://en.wikipedia.org/wiki/Gdbserver. La documentación para la depuración remota de gdb está disponible en el sitio web de Sourceware: Depuración de programas remotos.
Habilitación de la visualización natVIS de Linux y el recorrido de vínculos DML
La extensibilidad de la biblioteca de plantillas estándar (STL) en los depuradores de Windows se proporciona mediante un archivo NatVis, stl.natvis
que comprende muchas versiones del STL que se incluyen con Visual Studio y Windows. Para obtener información general sobre NATVIS, vea Objetos de depurador nativo en NatVis. Las versiones de STL que se usan para los componentes de Linux (GCC o LLDB) son muy diferentes.
Para habilitar la visualización de NATVIS y el recorrido de vínculos DML optimizados para Linux, descargue primero el archivo natvis predeterminado, .scriptunload stl.natvis
.
A continuación, .scriptload el gstl.natvis
archivo. Use .scriptlist para confirmar que gstl.natvis
está activo.
0: kd> .scriptlist
Command Loaded Scripts:
...
NatVis script from 'C:\Users\Bob\AppData\Local\dbg\UI\2402.24001.0\amd64\Visualizers\gstl.natvis'
Para obtener más información sobre cómo trabajar con DML, vea Personalización de la salida del depurador mediante DML.
Volcado de núcleo de proceso único de la aplicación DisplayGreeting
En este ejemplo se muestra cómo crear un único volcado de memoria principal de proceso mediante gdb. Para obtener más información sobre el uso de GDBServer con WinDbg y un tutorial de código, consulte Depuración de procesos remotos en directo de Linux. Para obtener el código de ejemplo de DisplayGreeting, consulte tutorial de la aplicación de C++.
Buscar el proceso deseado
Podemos enumerar todos los procesos de Linux mediante el ps -A
comando o usar la opción -f con pgrep, como sabemos que estamos buscando la aplicación DisplayGreeting.
$ pgrep -f DisplayGreeting
9382
En este tutorial de ejemplo, se muestra un identificador de proceso de 9382.
Asociación al proceso con gdb y generación de un volcado de memoria principal
Use gdb para asociar al proceso.
$ gdb -p 9382
Mostrar ayuda para el generate-core-file
comando 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>'.
A continuación, en el símbolo del sistema (gdb), genere un archivo de volcado de núcleo de proceso con el nombre de archivo predeterminado.
(gdb) generate-core-file
Saved corefile core.9382
(gdb) quit
Carga y examen del volcado de memoria principal del proceso de Linux
Use la opción de menú Abrir archivo de volcado de memoria en WinDbg para cargar el volcado de núcleo generado.
Adición de las rutas de acceso de origen y símbolo a la sesión del depurador
Para ver el código fuente y las variables, establezca los símbolos y la ruta de acceso de origen. Para obtener información general sobre cómo establecer la ruta de acceso de símbolos, consulte Uso de símbolos. Para obtener información más detallada sobre los símbolos de Linux, consulte Símbolos y orígenes de Linux.
Use .sympath
para agregar la ruta de acceso de símbolos a la sesión del depurador. En este ejemplo de Ubuntu de WSL Linux, el código y los símbolos displayGreetings están disponibles en esta ubicación, para un usuario llamado Bob.
\\wsl$\Ubuntu\mnt\c\Users\Bob\
En WSL, este directorio se asigna a la ubicación del sistema operativo Windows de: C:\Users\Bob\
Por lo tanto, se usan estos dos comandos.
.sympath C:\Users\Bob\
.srcpath C:\Users\Bob\
Para obtener más información sobre el acceso al sistema de archivos WSL en Windows, vea Permisos de archivo para WSL.
Para beneficiarse de símbolos adicionales del sistema operativo Linux, agregue los símbolos DebugInfoD mediante la ubicación .sympath.
.sympath+ DebugInfoD*https://debuginfod.elfutils.org
Use el .reload
comando para volver a cargar los símbolos.
También se admite la descarga automática de orígenes de servidores DebugInfoD, que admiten la devolución de ese tipo de artefacto. Para aprovechar esta funcionalidad, agregue el servidor elfutils mediante .srcpath.
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org
Examen del volcado de memoria del proceso
Use el lm
comando para confirmar que el archivo de volcado contiene la aplicación 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
Tenga en cuenta que la primera ejecución de comandos puede tardar un poco de tiempo, ya que los símbolos de depuración se cargan en la memoria caché. Además de buscar símbolos y archivos binarios a través del servidor de símbolos o la ruta de acceso de búsqueda local, debido a la integración de GDBServer, puede cargar estos archivos desde un sistema de archivos remoto si no se encuentran localmente. Esta operación suele ser más lenta que adquirir símbolos de symsrv o una ruta de búsqueda local.
Use el x
comando para mostrar las funciones disponibles en 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)
Use el dx
comando para ver el saludo de la variable local.
0:000> dx greeting
...
Error: Unable to bind name 'greeting'
Como el saludo de parámetro aún no se usó cuando se tomó el volcado de memoria, no está disponible en el archivo de volcado de memoria.
Use el dx
comando para examinar los procesos que están disponibles en el archivo de volcado de memoria.
: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
Para ver información sobre los subprocesos y módulos, haga clic en el vínculo DML generado en la salida o escriba comandos similares a este para el volcado de memoria.
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
Usar las extensiones de diagnóstico ELF/CORE para mostrar la información del archivo de volcado de memoria
Use las extensiones de diagnóstico de Linux: ELFBinComposition.dll para mostrar información del archivo de volcado. Por ejemplo, use !dumpdebug
para confirmar que se trata de un volcado principal de usuario elF y mostrar otra información.
0:000> !dumpdebug
Dump Diagnostics: Format = ELF User Core
********************************************************************************
File Mapping Size: 0x151d78 (1 Mb)
Highest Memory Offset: 0x14e5f0 (1 Mb)
...
Use !ntprpsinfo
para mostrar los datos de 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
Volcados de memoria de KDump de kernel
Hay muchas maneras de crear un archivo de volcado de memoria en Linux. Por ejemplo, una opción con Ubuntu Linux se describe en El volcado de memoria del kernel.
Otras opciones incluyen el uso de kexectools para habilitar Kdump. Para obtener más información, consulte KDump (Linux). Si kdump está habilitado, puede comprobar que kdump está activo y en ejecución mediante systemctl status kdump
.
Una vez que se desencadena el bloqueo del sistema operativo en un sistema de prueba, se crea el archivo de volcado de memoria.
Cargar y examinar el volcado de memoria del sistema operativo Linux
Use la opción de menú Abrir archivo de volcado para cargar el kdump generado.
Como se describe en la sección anterior, habilite la visualización de NATVIS y el recorrido de vínculos DML optimizados para Linux mediante la carga del gstl.natvis
archivo.
Uso de los comandos de composición bin de ELF para analizar un volcado de kernel de Linux
Para poder usar comandos adicionales de composición bin de ELF, use el comando .chain para confirmar que el ELFBinComposition.dll está cargado.
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]
...
Si ELFBinComposition no está cargado, use .load para cargarlo. Para obtener más información, vea .load, .loadby (Dll de extensión de carga)
Use el !ELFBinComposition.dumpdebug
comando para mostrar información sobre el archivo de volcado de memoria cargado. En este ejemplo, se ha cargado un archivo de volcado principal de usuario ELF.
0: kd> !ELFBinComposition.dumpdebug
Dump Diagnostics: Format = Kernel KDump
********************************************************************************
File Mapping Size: 0x3b34090 (59 Mb)
Highest Memory Offset: 0x3b34090 (59 Mb)
Use ELFBinComposition !vmcoreinfo
para mostrar la tabla VMCOREINFO del volcado de núcleo del kernel de Linux (KDUMP) que se está depurando.
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
Use para volcar la primera parte del archivo de volcado, empezando por cero.
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
La salida de !kdumppagerange muestra varios valores de marco de página (PFN). Podemos seleccionar uno de los intereses y usar para !kdumppfn <PFN>
mostrar información sobre el PFN y dónde se encuentran sus datos dentro de KDUMP.
0: kd> !kdumppfn 0x540e0
Page frame 0x540e0 = File offset [0x307430, 0x307b9f) 0x76f bytes as ZLIB...
Examen del archivo de volcado de memoria
Use el k
comando para mostrar la pila de llamadas para investigar qué código se estaba ejecutando cuando se produjo el bloqueo.
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
Use el dx
comando para examinar el archivo de volcado de memoria. Por ejemplo, examine los primeros 30 procesos mediante este comando.
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]
...
Haga clic en los vínculos DML o use comandos similares a este para ver los subprocesos en un proceso de interés.
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
...
Hay disponible información adicional para cada subproceso, como se muestra a continuación.
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
Uso del script de LinuxKernel.js para analizar un volcado de kernel de Linux
La extensión del depurador de LinuxKernel.js contiene un conjunto de comandos diseñados para funcionar de forma similar a las que se encuentran en la utilidad de bloqueo de Linux que se usa para abrir y analizar bloqueos del modo kernel de Linux.
Para usar el script, cargue primero el script.
0: kd> .scriptload LinuxKernel.js
JavaScript script successfully loaded from 'C:\Users\Bob\AppData\Local\dbg\UI\Fast.20240423.1\amd64\winext\LinuxKernel.js'
Para obtener más información sobre cómo trabajar con scripts de carga, consulte Scripting del depurador de JavaScript.
!Archivos
!files
Use para mostrar información sobre la estructura de archivos de Linux en el archivo de volcado de memoria. Es similar al comando de archivos de bloqueo.
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]
Sintaxis !files
:
!files [<arg>]
Sin: [<arg>]
equivalente a 'archivos': proporciona la lista de archivos de proceso actual.
[<arg>]
:
pid
: proporciona la lista de archivos para el identificador de proceso especificado.
64-bit num
: proporciona la lista de archivos para la tarea en la dirección especificada.
<task struct [*]>
: proporciona la lista de archivos para la estructura de tarea especificada por objeto.
<process object>
: proporciona la lista de archivos para la tarea representada por el objeto de proceso.
!montar
!mount
Use para mostrar información sobre la estructura de archivos de Linux en el archivo de volcado de memoria.
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]
Sintaxis !mount
:
Sin [<arg>]
: equivalente al comando 'mount': muestra los sistemas de archivos montados
[<arg>]
:
pid
: proporciona los sistemas de archivos montados para el espacio de nombres del proceso con el pid especificado.
64-bit num
: proporciona los sistemas de archivos montados para el espacio de nombres de la task_struct dada por dirección.
<task struct [*]>
: proporciona los sistemas de archivos montados para el espacio de nombres del task_struct especificado.
<process object>
: proporciona los sistemas de archivos montados para el espacio de nombres de la tarea representada por el proceso.
!red
!net
Use para mostrar la lista de red del sistema.
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]
Sintaxis !net
:
!net [<arg>]
Sin [<arg>]
: equivalente a 'net': proporciona la lista de red del sistema.
[<arg>]
:
pid
: proporciona la lista net para el espacio de nombres del proceso con el pid especificado.
64-bit num
: proporciona la lista net para el espacio de nombres de la task_struct dada por dirección.
<task struct [*]>
: proporciona la lista net para el espacio de nombres del task_struct especificado.
<process object>
: proporciona la lista de red para el espacio de nombres de la tarea representada por el proceso.
!runq
!runq
Use para mostrar información sobre las tareas de la cola de ejecución.
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
Sintaxis !runq
:
!runq
!runq no tiene ningún parámetro de comando.
Comandos de volcado de kernel adicionales
!dev
- Muestra los datos del dispositivo relacionados con el carácter y el bloque del dispositivo, las asignaciones, el uso de puertos de E/S, el uso de memoria de E/S.
!log
: muestra el contenido del kernel log_buf.
!vm
- Muestra un resumen del uso de memoria virtual.
!timer
: muestra las entradas de la cola del temporizador.
Comando dx y objetos de Linux
El comando dx se puede usar para investigar kdumps. Muestra el objeto Sessions para ver los distintos objetos secundarios que están disponibles.
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
...
El objeto kernel de cursession contiene el objeto PrintKLog que se puede usar para ver el registro del 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
Este comando dx muestra el uso de .Contains()
para buscar cadenas específicas en el registro.
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»=.
Use .Reverse()
para mostrar los últimos eventos registrados.
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...
Para obtener más información sobre el uso de consultas LINQ con el comando dx, vea Uso de LINQ con los objetos del depurador.
Extensiones de diagnóstico de Linux: ELFBinComposition.dll
Las siguientes extensiones de diagnóstico de archivos de volcado de memoria de Linux están disponibles en el ELFBinComposition.dll.
Comandos de archivo de volcado de memoria
Estos comandos se pueden usar en la mayoría de los archivos de volcado de memoria.
!dumpdebug
- Mostrar diagnósticos para el volcado de memoria principal que se está depurando. Esto incluye la salida de otros comandos.
!ntprstatus
: muestra los registros NT_PRSTATUS del volcado de memoria principal que se está depurando.
!vmcoreinfo
: muestra la tabla VMCOREINFO del volcado de núcleo del kernel (KDUMP) que se está depurando.
Comandos de volcado de ELF
Estos comandos solo se pueden usar en archivos de volcado de núcleo de ELF.
!corephdrs
: muestra la tabla de encabezados del programa para el volcado de memoria principal que se está depurando.
!ntprpsinfo
: muestra los datos NT_PRPSINFO del volcado de memoria principal que se está depurando.
!ntfile
: muestra los datos NT_FILE del volcado de memoria principal que se está depurando.
!ntauxv
: muestra los datos NT_AUXV del volcado de memoria principal que se está depurando.
Comandos de archivo de volcado de memoria del kernel
Estos comandos solo se pueden usar en archivos de volcado de núcleo de kernel (KDUMP).
!kdumpdescs
- Mostrar la lista de intervalos de páginas y descriptores de página en un KDUMP.
!kdumppagerange <n>
- Mostrar información sobre la agrupación n-ésima de páginas en KDUMP.
!kdumppfn <pfn>
- Mostrar información sobre el marco <pfn>
de página y dónde están sus datos dentro de KDUMP.
Otros comandos de diagnóstico
!cppex
- Muestra información sobre las excepciones de C++ actuales en curso (no detectadas y "just") para el subproceso actual, usando las estructuras internas de libstdc++y los símbolos ENANO.
!cppfilt [-n] <mangled name>
- Desmangle un nombre de C++ mangled como si se ejecutara a través de la herramienta c++filt. Para obtener más información sobre la herramienta C==filtr, consulte c++filt(1): página manual de Linux.
!rustdemangle <mangled name>
- Demangle un nombre mangled de Rust. Para obtener más información sobre la mangling de nombres de símbolos de rust, vea Mangling de símbolos de Rust - RFC 2603.