Windows内核调试Devstudio的spindump
因此,在OSX上运行死锁、互斥、锁反转等时,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分
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]