Windbg 获取调用堆栈中包含某个.NET函数的线程?

Windbg 获取调用堆栈中包含某个.NET函数的线程?,windbg,crash-dumps,sosex,Windbg,Crash Dumps,Sosex,我有一个73线程的用户模式转储。其中一些是管理的,一些是本地的。 我想找到托管线程,它的调用堆栈包含一个特定的托管函数 我在调试器中加载了SOSEX扩展 现在我做~*e!mk转储所有托管线程,然后手动浏览它们以查找我需要的内容-太长太累了 有更好的方法吗?相关命令 有!findstack 2查找堆栈上具有特定模块的线程,但它仅适用于本机调用堆栈和模块,而不适用于方法 然后是!uniqstack,这可能有助于缩小线程范围,以防许多线程具有相同的调用堆栈。这也是一个本机命令 丑陋的内置解决方案 我在

我有一个73线程的用户模式转储。其中一些是管理的,一些是本地的。 我想找到托管线程,它的调用堆栈包含一个特定的托管函数

我在调试器中加载了SOSEX扩展

现在我做
~*e!mk
转储所有托管线程,然后手动浏览它们以查找我需要的内容-太长太累了

有更好的方法吗?

相关命令 有
!findstack 2
查找堆栈上具有特定模块的线程,但它仅适用于本机调用堆栈和模块,而不适用于方法

然后是
!uniqstack
,这可能有助于缩小线程范围,以防许多线程具有相同的调用堆栈。这也是一个本机命令

丑陋的内置解决方案 我在这种情况下所做的是一个丑陋的解决办法,但我还没有找到更好的办法:

.shell -ci "!clrstack" find "Class.Method("
当然,您可以将其与
~*e
结合使用,以对所有线程执行此操作

~*e ? $tid;.shell -ci "!clrstack" find "Program.Main("
PyKd脚本 如果您不介意安装另一个WinDbg扩展,我建议您使用更方便、更安静的解决方案。在WinDbg目录(或者可能是WinDbg的工作目录,不太确定,否则使用完整路径)中创建一个包含内容的文件
findstack.py

from pykd import * 
if "Class.Method(" in dbgCommand("!clrstack"):
    print(hex(expr("$tid")))
在WinDbg中,按如下方式运行脚本:

.load E:\path to\x86\pykd.pyd
*** Actually it's a DLL and I prefer renaming it
*** .load E:\path to\x86\pykd.dll
~*e !py findstack.py
当然,您可以参数化脚本,例如

from pykd import *
import sys
if (len(sys.argv) < 4):
    print "find <command> <search term> <success command>."
    quit()

if sys.argv[2] in dbgCommand(sys.argv[1]):
    print(dbgCommand(sys.argv[3]))

您使用哪个版本的扩展?我使用Anaconda2.1.0中的Python2.7.8测试了0.2.0.27。。。在带有.NET 4 x86应用程序的WinDbg 6.2.9200中。到目前为止,我没有版本问题。我已经从Anaconda和pykd-0.2.0.29-x64-python-2.7-setup.exe安装了64位python 2.7.10。我正在运行64位版本的WinDbg——“C:\ProgramFiles(x86)\Windows Kits\8.1\Debuggers\x64\WinDbg.exe”。到目前为止,加载pykd.pyd会立即终止WinDbg进程:-(@mark:的确,x64版本似乎已损坏。我的WinDbg没有崩溃,但它表示,
调用LoadLibrary…失败,Win32错误0n193,%1不是有效的Win32应用程序
~*e !py find.py "!clrstack" "Program.Main(" "? $tid"