Windows内核调试Devstudio的spindump

Windows内核调试Devstudio的spindump,windows,visual-studio,kernel,windbg,Windows,Visual Studio,Kernel,Windbg,因此,在OSX上运行死锁、互斥、锁反转等时,spindump工具非常有用。它只是转储系统上的所有线程堆栈(userland和kernel),并且可以清楚地看到哪些线程被阻塞 现在使用Devstudio在第二个VM上进行内核调试,我遇到了死锁。我知道我可以使用“!进程0”转储所有进程。我相信我可以切换到进程,转储线程(?),然后选择一个带有“!thread”和“k”的线程来查看堆栈。但是实际上有成千上万的线程,当然有一种方法可以不用手动操作就将它们全部转储 “!process 0 7”运行约40分

因此,在OSX上运行死锁、互斥、锁反转等时,
spindump
工具非常有用。它只是转储系统上的所有线程堆栈(userland和kernel),并且可以清楚地看到哪些线程被阻塞

现在使用Devstudio在第二个VM上进行内核调试,我遇到了死锁。我知道我可以使用“!进程0”转储所有进程。我相信我可以切换到进程,转储线程(?),然后选择一个带有“!thread”和“k”的线程来查看堆栈。但是实际上有成千上万的线程,当然有一种方法可以不用手动操作就将它们全部转储

“!process 0 7”运行约40分钟,设置所有堆栈中都没有我的函数

spindump输出看起来像

线程0x8ab 1000样本(1-1000)优先级81(基数81)
*1000调用u延续+23(kernel.development+1927415)
*1000弧_回收_螺纹+2391(zfs+131367中的弧c:5095,11)
*1000名雇员+206(spl条件c:172,14在spl+8125中)
*1000 msleep+98(kernel.development+7434066)
*1000_sleep+219(kernel.development+7432603)
*1000 lck_mtx_sleep_截止日期+147(kernel.development+2362339)
*1000线程\u块\u原因+286(kernel.development+2407438)


因此,这里没有什么神奇之处,只是它可以遍历所有线程。

使用!具有0,1,2的堆栈

引用自windbg chm文件

The !stacks extension gives a brief summary of the state of every thread. You   
can use this extension instead of the !process extension to get a quick overview    
of the system, especially when debugging multithread issues such as resource    
conflicts or deadlocks.

The !findstack user-mode extension also displays information about particular stacks.

Here is an example of the simplest !stacks display:

kd> !stacks 0
Proc.Thread  .Thread  ThreadState  Blocker
                                     [System]
   4.000050  827eea10  Blocked    +0xfe0343a5

                                     [smss.exe]

                                     [csrss.exe]
  b0.0000a8  82723b70  Blocked    ntoskrnl!_KiSystemService+0xc4
  b0.0000c8  82719620  Blocked    ntoskrnl!_KiSystemService+0xc4
  b0.0000d0  827d5d50  Blocked    ntoskrnl!_KiSystemService+0xc4
.....
编辑

!!堆栈是一个耗时的操作 速度与所使用的运输工具有关
vm到vm有自己的开销 通过网络调试或 预win 10上的1394比波特率为115200的com端口或管道安静更快

我不确定你的虚拟机是什么,但如果你在vbox上,那么你可以试试vmkd

有没有办法回答你的评论

您可以运行此命令来记录和grep输出

.logopen z:\foo.txt!堆栈0。logclose

这将在所需路径中打开日志文件,并将所有输出重定向到日志文件,并在命令完成后关闭日志文件

还要记住!stacks接受通配符筛选器字符串,以便只能筛选具有已知符号的堆栈


“!process 0 0”并查找系统进程地址,然后“!process 0x7”似乎至少列出了内核中的线程,堆栈中有my函数。我的虚拟机需要12分钟。你想解决什么问题?对我来说,您似乎知道存在死锁,但不知道死锁是在内核还是在用户模式下,也不知道哪个应用程序受到影响。在我看来,您似乎想要一个通用的解决一切死锁工具。如果发现Microsoft Office与Adobe Reader处于死锁状态,您会怎么做?那么下一步是什么呢?我知道会出现死锁,因为等待新vnode的线程会永远等待,所以我需要查看堆栈,以了解谁持有互斥锁,这样我才能找出它不返回的原因。是的,大多数堆栈都在内核中,但有些可以是userland(调用内核的cmdline工具)。是的,spinlock非常接近于一个通用的死锁工具,但就我而言,我正在开发一个文件系统驱动程序。啊,谢谢。奇怪的是,我怎么没发现有人提起!stacks,也不是docs,还有我的冲浪。我猜这只是意味着我不擅长谷歌搜索下一步是将输出文件转换成txt文件,这样我就可以对其进行grep或其他操作,因为“中间窗口”中的搜索功能是有史以来最糟糕的事情:)不过,即使只是“!stacks 0”也需要12分钟才能将其转储到我的小型VM中。这就是你的专业windows开发人员的工作方式,只是一堆耐心吗?(两个虚拟机,使用TCP over localhost调试)…logopen z:\foo.bar;!堆栈0。logcloseoh搜索字符串绝对有用。谢谢一旦我有了我的堆栈列表,就很快找到了。原子移植错误,c11采用PTR,但win32不采用。这是非常有益的,谢谢大家。
kd> .logopen c:\stacks.txt ; !stacks 0  Etw; .logclose
Opened log file 'c:\stacks.txt'

Proc.Thread  .Thread  Ticks   ThreadState Blocker

Max cache size is       : 1048576 bytes (0x400 KB) 
Total memory in cache   : 0 bytes (0 KB) 
Number of regions cached: 0
0 full reads broken into 0 partial reads
    counts: 0 cached/0 uncached, 0.00% cached
    bytes : 0 cached/0 uncached, 0.00% cached
** Prototype PTEs are implicitly decoded
                            [82965600 Idle]
                            [840dcc40 System]
   4.000078  8410ed48 0000081 Blocked    nt!EtwpLogger+0xd0
   4.000080  8410e4d8 0000081 Blocked    nt!EtwpLogger+0xd0
   4.000084  84142020 0000081 Blocked    nt!EtwpLogger+0xd0
   4.000088  84142d48 0000081 Blocked    nt!EtwpLogger+0xd0
   4.000090  8416c630 000001d Blocked    nt!EtwpLogger+0xd0
   4.000094  8496ea88 0000bf3 Blocked    nt!EtwpLogger+0xd0
   4.0000a0  84079a88 000004a Blocked    nt!EtwpLogger+0xd0
   4.000194  85144d48 000445c Blocked    nt!EtwpLogger+0xd0
   4.000308  851b9d48 0004035 Blocked    nt!EtwpLogger+0xd0
   4.00032c  851d3d48 0002d48 Blocked    nt!EtwpLogger+0xd0
   4.00034c  852e8d48 0003e4a Blocked    nt!EtwpLogger+0xd0
   4.000350  84973d48 0003df4 Blocked    nt!EtwpLogger+0xd0
   4.000354  84f0dd48 0003de4 Blocked    nt!EtwpLogger+0xd0
   4.000444  854c7970 0002158 Blocked    nt!EtwpLogger+0xd0

                            [84f0b930 smss.exe]

                            [8409eb38 csrss.exe]

                            [84f34d40 wininit.exe]

                            [84f4d030 csrss.exe]

                            [850f8d40 winlogon.exe]

                            [8515bb38 services.exe]

                            [85161d40 lsass.exe]

                            [85163d40 lsm.exe]