Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makale, farklı Linux kilitlenme dökümü dosyalarının nasıl oluşturulacağı ve görüntüleneceği hakkında bilgi verir. Linux kilitlenme dökümlerini görüntülemek için WinDbg sürüm 1.2402.24001.0 veya üzeri gerekir.
WinDbg'de Linux (Windows olmayan) çekirdek dökümü açılırken, temel hata ayıklayıcı komutlarının tümü düzgün çalışmalıdır, ancak Windows yapılarına başvuran uzantılar ve Windows'a özgü komutlar çalışmaz.
Kilitlenme dökümü dosyaları desteklenir
Linux çekirdek dökümleri
Linux Çekirdeği sıkıştırılmış KDUMP'lerini açma ve tam özel CÜCE simgeleriyle son hata ayıklama ve analiz yapma, Windows hata ayıklayıcısında kullanılabilir.
WinDbg yalnızca ZLIB sıkıştırılmış KDUMP dosyalarını destekler. LZO ve Snappy sıkıştırılmış KDUMP dosyaları desteklenmemektedir.
Linux KDUMP'leri hakkında genel bilgi için bkz. KDump (Linux) Wikipedia sayfası ve Çekirdek dökümü.
ELF çekirdek bellek dökümü
Open Enclave'i desteklemenin bir parçası olarak, WinDbg hem Enklavlar hem de Linux uygulamalarından ELF çekirdek dökümlerini, ikili dosyalarını ve DWARF sembollerini (DWARF 5 desteklenmez) açabilir. Açık Kapanım hakkında daha fazla bilgi için bkz. Açık Kapanım hata ayıklaması.
İşlem dökümleri
Tek işlem dökümleri desteklenir. Linux Sysinternals ProcDump for Linux yardımcı programı da dahil olmak üzere işlem dökümü toplamanın çeşitli yolları vardır. Bir diğer seçenek de çekirdek dökümü oluşturmak için GNU Hata Ayıklayıcısı - GDBServer kullanmaktır. GDBServer hakkında daha fazla bilgi için bkz https://en.wikipedia.org/wiki/Gdbserver. . Uzak gdb hata ayıklama belgeleri Sourceware web sitesinde - Uzak Programlarda Hata Ayıklama'da kullanılabilir.
Linux NATVIS görselleştirmesini ve DML bağlantı geçişlerini etkinleştirme
Windows Hata Ayıklayıcıları'ndaki Standart Şablon Kitaplığı (STL) genişletilebilirliği, stl.natvis Visual Studio ve Windows ile birlikte gelen STL'nin birçok sürümünü anlayan bir NatVis dosyası tarafından sağlanır. NATVIS hakkında genel bilgi için bkz. NatVis'de Yerel Hata Ayıklayıcı Nesneleri. Linux bileşenleri (GCC'ler veya LLDB'ler) için kullanılan STL sürümleri çok farklıdır.
Linux için iyileştirilmiş NATVIS görselleştirmesini ve DML bağlantısı çapraz geçişini etkinleştirmek için önce varsayılan natvis dosyasını ( .scriptunload) kaldırınstl.natvis.
Ardından .scriptloadgstl.natvis dosyasını yükleyin. Etkin olduğunu onaylamak için gstl.natvis komutunu kullanın.
0: kd> .scriptlist
Command Loaded Scripts:
...
NatVis script from 'C:\Users\Bob\AppData\Local\dbg\UI\2402.24001.0\amd64\Visualizers\gstl.natvis'
DML ile çalışma hakkında daha fazla bilgi için bkz. DML Kullanarak Hata Ayıklayıcısı Çıkışını Özelleştirme.
DisplayGreeting uygulamasının tek işlem çekirdeği dökümü
Bu örnek, gdb kullanarak tek bir işlem çekirdeği dökümü oluşturmayı gösterir. WinDbg ile GDBServer kullanma ve kod kılavuzu hakkında daha fazla bilgi için bkz. Linux canlı uzaktan işlem hata ayıklama. DisplayGreeting için örnek kod için bkz. C++ uygulama kılavuzu.
İstenen işlemi bulma
Komutunu kullanarak ps -A Linux'taki tüm işlemleri listeleyebilir veya DisplayGreeting uygulamasını aradığımızı bildiğimiz için pgrep ile -f seçeneğini kullanabiliriz.
$ pgrep -f DisplayGreeting
9382
Bu örnekte izlenecek yolda 9382 işlem kimliği gösterilmektedir.
gdb ile işleme bağlanma ve çekirdek dökümü alma
İşleme eklemek için gdb kullanın.
$ gdb -p 9382
generate-core-file gdb komutu için yardım al.
(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>'.
Ardından (gdb) isteminde, varsayılan dosya adıyla bir işlem çekirdeği döküm dosyası oluşturun.
(gdb) generate-core-file
Saved corefile core.9382
(gdb) quit
Linux işlem çekirdeği dökümünü yükleme ve inceleme
Oluşturulan çekirdek dökümünü yüklemek için WinDbg'de Döküm dosyasını aç menü seçeneğini kullanın.
Kaynak ve simge yollarını hata ayıklayıcı oturumuna ekleme
Kaynak kodu ve değişkenleri görüntülemek için simgeleri ve kaynak yolunu ayarlayın. Sembol yolunu ayarlama hakkında genel bilgi için bkz. Sembolleri Kullanma. Linux simgeleri hakkında daha ayrıntılı bilgi için bkz. Linux sembolleri ve kaynakları.
Hata ayıklayıcı oturumuna sembol yolunu eklemek için kullanın .sympath . Bu WSL Linux Ubuntu örneğinde, Bob adlı bir kullanıcı için DisplayGreetings kodu ve sembolleri bu konumda kullanılabilir.
\\wsl$\Ubuntu\mnt\c\Users\Bob\
WSL'de bu dizin Windows işletim sistemi konumuyla eşlenir: C:\Users\Bob\ Bu nedenle bu iki komut kullanılır.
.sympath C:\Users\Bob\
.srcpath C:\Users\Bob\
Windows'da WSL dosya sistemine erişme hakkında daha fazla bilgi için bkz. WSL için Dosya İzinleri.
Ek Linux işletim sistemi simgelerinden yararlanmak için .sympath konumunu kullanarak DebugInfoD simgelerini ekleyin.
.sympath+ DebugInfoD*https://debuginfod.elfutils.org
Sembolleri .reload yeniden yüklemek için komutunu kullanın.
Kaynakların, bu tür yapıları döndürme özelliğine sahip olan DebugInfoD sunucularından otomatik olarak indirilmesi de ayrıca desteklenir. Bu özelliğin avantajlarından yararlanmak için .srcpath kullanarak elfutils sunucusunu ekleyin.
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org
İşlem dökümünü inceleme
Döküm dosyasının lm DisplayGreeting uygulamasını içerdiğini onaylamak için komutunu kullanın.
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
Hata ayıklama simgeleri önbelleğe yüklendiğinden ilk komut yürütme işleminin biraz zaman alabileceğini unutmayın. GDBServer tümleştirmesi nedeniyle, sembol sunucusu veya yerel arama yolunuz aracılığıyla sembolleri ve ikili dosyaları aramaya ek olarak, bu dosyalar yerel olarak bulunamazsa bu dosyaları uzak bir dosya sisteminden yükleyebilir. Bu işlem genellikle symsrv'den veya yerel bir arama yolundan simge almaktan daha yavaştır.
x DisplayGreeting'de kullanılabilen işlevleri görüntülemek için komutunu kullanın.
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)
Yerel değişken dx'i görüntülemek için komutunu kullanın.
0:000> dx greeting
...
Error: Unable to bind name 'greeting'
Döküm alındığında, selamlama parametresi henüz kullanılmadığından döküm dosyasında mevcut değildir.
dx komutunu, döküm dosyasında mevcut olan işlemleri incelemek için kullanın.
: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
İş parçacıkları ve modüller hakkındaki bilgileri görüntülemek için çıkışta oluşturulan DML bağlantısına tıklayın veya kilitlenme bilgi dökümü için buna benzer komutları yazın.
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
Döküm dosyası bilgilerini görüntülemek için ELF/CORE tanılama uzantılarını kullanma
Döküm dosyası bilgilerini görüntülemek için Linux tanılama uzantılarını kullanın - ELFBinComposition.dll . Örneğin, bunun bir ELF kullanıcı çekirdek dökümü olduğunu onaylamak ve diğer bilgileri görüntülemek için !dumpdebug kullanın.
0:000> !dumpdebug
Dump Diagnostics: Format = ELF User Core
********************************************************************************
File Mapping Size: 0x151d78 (1 Mb)
Highest Memory Offset: 0x14e5f0 (1 Mb)
...
NT_PRPSINFO verilerini görüntülemek için kullanın !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
Çekirdek KDump kilitlenme bilgi dökümleri
Linux'ta çökme döküm dosyası oluşturmanın birçok yolu vardır. Örneğin, Ubuntu Linux ile bir seçenek Çekirdek çökmesi dökümü bölümünde açıklanmıştır.
Diğer seçenekler arasında Kdump'un etkinleştirilmesi için kexectools kullanımı yer alır. Daha fazla bilgi için bkz . KDump (Linux). Kdump etkinleştirildiyse, systemctl status kdump kullanarak kdump'un etkin olduğunu ve çalıştığını doğrulayabilirsiniz.
Bir test sisteminde işletim sistemi çökmesi gerçekleştiğinde, çökme döküm dosyası oluşturulur.
Linux işletim sistemi kilitlenme dökümünü yükle ve incele
Oluşturulan kdump'ı yüklemek için Döküm dosyasını aç menü seçeneğini kullanın.
Önceki bölümde açıklandığı gibi, dosyayı yükleyerek LINUX için iyileştirilmiş NATVIS görselleştirmesini ve DML bağlantısı çapraz geçişini gstl.natvis etkinleştirin.
Linux çekirdek dökümünü analiz etmek için ELF Bin oluşturma komutlarını kullanma
Ek ELF Bin oluşturma komutlarını kullanabilmek için ELFBinComposition.dll yüklendiğini onaylamak için .chain komutunu kullanın.
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 yüklü değilse yüklemek için .load kullanın. Daha fazla bilgi için bkz . .load, .loadby (Uzantı DLL'sini Yükleme)
!ELFBinComposition.dumpdebug Yüklenen döküm dosyası hakkındaki bilgileri görüntülemek için komutunu kullanın. Bu örnekte, bir ELF kullanıcı çekirdeği döküm dosyası yüklendi.
0: kd> !ELFBinComposition.dumpdebug
Dump Diagnostics: Format = Kernel KDump
********************************************************************************
File Mapping Size: 0x3b34090 (59 Mb)
Highest Memory Offset: 0x3b34090 (59 Mb)
Hata ayıklanan Linux çekirdek dökümü (KDUMP) içindeki VMCOREINFO tablosunu görüntülemek için ELFBinComposition !vmcoreinfo kullanın.
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
...
Dosya dökümünün ilk bölümünü sıfırdan başlamak üzere çıkarmak için !kdumppagerange kullanın.
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 çıkışı çeşitli sayfa çerçevesi (PFN) değerlerini görüntüler. İlgilendiğimiz bir tanesini seçebilir ve !kdumppfn <PFN> kullanarak PFN ve verilerinin KDUMP içindeki yeri hakkında bilgi görüntüleyebiliriz.
0: kd> !kdumppfn 0x540e0
Page frame 0x540e0 = File offset [0x307430, 0x307b9f) 0x76f bytes as ZLIB...
Döküm dosyasını inceleme
Kilitlenme oluştuğunda hangi kodun çalıştığını araştırmak için k komutunu kullanarak çağrı yığınını görüntüleyin.
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 komutunu kullanarak döküm dosyasını inceleyin. Örneğin, bu komutu kullanarak ilk 30 işleme bakın.
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]
...
İlginizi çeken bir işlemdeki iş parçacıklarına bakmak için DML bağlantılarına tıklayın veya buna benzer komutları kullanın.
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
...
Aşağıda gösterildiği gibi her iş parçacığı için ek bilgiler sağlanır.
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 çekirdek dökümünü analiz etmek için LinuxKernel.js betiğini kullanma
LinuxKernel.js hata ayıklayıcısı uzantısı, Linux Çekirdek modu kilitlenmelerini açmak ve analiz etmek için kullanılan Linux kilitlenme yardımcı programındakilere benzer şekilde çalışmak üzere tasarlanmış bir komut kümesi içerir.
Betiği kullanmak için önce betiği yüklemelisiniz.
0: kd> .scriptload LinuxKernel.js
JavaScript script successfully loaded from 'C:\Users\Bob\AppData\Local\dbg\UI\Fast.20240423.1\amd64\winext\LinuxKernel.js'
Yükleme betikleriyle çalışma hakkında daha fazla bilgi için JavaScript Hata Ayıklayıcı Betiği'ne bakın.
!Dosya
Linux dosya yapısı hakkındaki bilgileri döküm dosyasında görüntülemek için !files öğesini kullanın. Kilitlenme dosyaları komutuna benzer.
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 sözdizimi:
!files [<arg>]
"[<arg>] olmadan - 'dosyalar' ile eşdeğerdir - geçerli işlem için dosya listesini verir"
[<arg>]:
pid - Verilen işlem kimliği için dosya listesini verir
64-bit num - Verilen adreste görevin dosya listesini verir
<task struct [*]> - Nesneye göre verilen görev yapısı için dosya listesini verir
<process object> - İşlem nesnesi tarafından temsil edilen görevin dosya listesini verir
!bağla
Linux dosya yapısı hakkındaki bilgileri döküm dosyasında görüntülemek için !mount öğesini kullanın.
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 sözdizimi:
Olmadan [<arg>]- 'bağlama' komutuna eşdeğer - bağlı dosya sistemlerini gösterir
[<arg>]:
pid - Verilen pid ile işlemin isim alanı için bağlı dosya sistemlerini verir
64-bit num - Belirtilen adresle verilen task_struct ad alanı için monte edilen dosya sistemlerini verir
<task struct [*]> - Verilen task_struct ad alanı için bağlı dosya sistemlerini verir
<process object> - İşlemin temsil ettiği görevin ad alanı için bağlı dosya sistemlerini verir
!net
Sistem ağ listesini görüntülemek için öğesini !net kullanın.
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 sözdizimi:
!net [<arg>]
Olmadan [<arg>]- 'net' ile eşdeğer - sistem ağ listesi verir
[<arg>]:
pid - Verilen pid ile işlemin ad alanı için net listesini verir
64-bit num - Belirtilen adres tarafından verilen task_struct ad alanının net listesini verir
<task struct [*]> - Verilen task_struct ad alanının net listesini verir
<process object> - İşlemin temsil ettiği görevin ad alanının net listesini verir
!runq
Çalıştırma kuyruğundaki görevlerle ilgili bilgileri görüntülemek için !runq öğesini kullanı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
!runq sözdizimi:
!runq
!runq'un komut parametresi yok.
Ek çekirdek dökümü komutları
!dev - Karakter ve blok cihazları için, atamalar, G/Ç bağlantı noktası kullanımı ve G/Ç bellek kullanımıyla ilgili cihaz verilerini görüntüler.
!log - Çekirdek log_buf içeriğini görüntüler.
!vm - Sanal bellek kullanımının özetini görüntüler.
!timer - Zamanlayıcı kuyruğu girdilerini görüntüler.
dx komutu ve Linux nesneleri
dx komutu kdumps'yi araştırmak için kullanılabilir. Kullanılabilen çeşitli alt nesneleri görmek için Sessions nesnesini görüntüleyin.
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 Kernel nesnesi, çekirdek günlüğünü görüntülemek için kullanılabilecek PrintKLog nesnesini içerir.
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
Bu dx komutu, günlükte belirli dizeler aramak için .Contains() kullanımını gösterir.
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»=.
Günlüğe kaydedilen son olayları göstermek için kullanın .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...
dx komutuyla LINQ sorgularını kullanma hakkında daha fazla bilgi için bkz. LINQ'yi hata ayıklayıcı nesneleriyle kullanma.
Linux tanılama uzantıları - ELFBinComposition.dll
Aşağıdaki Linux döküm dosyası tanılama uzantıları ELFBinComposition.dll'de mevcuttur.
Döküm dosyası komutları
Bu komutlar döküm dosyalarının çoğunda kullanılabilir.
!dumpdebug - Hata ayıklanan çekirdek dökümü için tanılamaları görüntüleyin. Bu, diğer çeşitli komutların çıkışını içerir.
!ntprstatus - Hata ayıklanan çekirdek dökümündeki NT_PRSTATUS kayıtlarını görüntüleyin.
!vmcoreinfo - Debug edilen çekirdek dökümü (KDUMP) içindeki VMCOREINFO tablosunu görüntüleyin.
ELF döküm komutları
Bu komutlar yalnızca BIR ELF çekirdek döküm dosyalarında kullanılabilir.
!corephdrs - Hata ayıklanan çekirdek dökümü için program başlık tablosunu görüntüleyin.
!ntprpsinfo - Hata ayıklamakta olduğunuz çekirdek dökümünden NT_PRPSINFO verilerini görüntüleyin.
!ntfile - Hata ayıklaması yapılan çekirdek dökümünden NT_FILE verilerini görüntüleyin.
!ntauxv - Hata ayıklanan çekirdek dökümünde NT_AUXV verilerini göster.
Çekirdek çökme dökümü dosyası komutları
Bu komutlar yalnızca çekirdek dökümü (KDUMP) dosyalarında kullanılabilir.
!kdumpdescs - KDUMP'de sayfa aralıklarının ve sayfa tanımlayıcılarının listesini görüntüleyin.
!kdumppagerange <n> - KDUMP'de n. sayfa gruplandırma hakkında bilgi görüntüleyin.
!kdumppfn <pfn> - Sayfa çerçevesi <pfn> ve verilerinin KDUMP içinde bulunduğu yer hakkındaki bilgileri görüntüleyin.
Diğer tanılama komutları
!cppex - Libstdc++'ın iç yapıları ve DWARF sembollerini kullanarak mevcut iş parçacığı için yakalanmamış ve "yeni" yakalanmış mevcut C++ özel durumları hakkındaki bilgileri görüntüler.
!cppfilt [-n] <mangled name> - C++ bozulmuş adını, c++filt aracıyla çalıştırılmış gibi çözümleyen. C==filtr aracı hakkında daha fazla bilgi için bkz. c++filt(1) — Linux el ile sayfası.
!rustdemangle <mangled name> - Bir Rust çarpık ismi çözümlemeyi sağlar. Pas simgesi adı mangling hakkında daha fazla bilgi için bkz . Rust Symbol Mangling - RFC 2603.