!findstack 是否有任何等效命令来过滤托管代码?

Is there any equivalent command for !findstack to filter the managed code?

我发现 !findstack 可以用来过滤非托管代码,但是它无法过滤托管代码,所以是否有任何等效的命令 !findstack 来过滤托管代码?

我不知道有这样的现成函数,所以我在这里看到两个选项:

  • fiddle围绕一些WinDbg内部命令(半年后你几乎看不懂)
  • 使用 PyKd 并在 Python
  • 中编写一个不错的脚本

方法 a)

这可能类似于:

~*e .foreach(word {!clrstack}) {.if ($spat("${word}", "?*RunMessageLoop?*") == 1) {.printf "Found!\n"}}

方法 b)

将以下内容放入名为 clrfindstack.py

的文件中
from pykd import *
import sys

if len(sys.argv) == 1: # script name only
    print "Please provide a search string as argument"
    exit()
threads = getNumberThreads()
for thread in range(0, threads):
    dbgCommand("~"+str(thread)+"s")  # select the thread
    stack = dbgCommand("!clrstack")  # run !clrstack
    if sys.argv[1] in stack: # [0] is the script name
        print "Found", sys.argv[1], "in thread", thread, "(Use ~"+str(thread)+"s to select it)"

然后运行它

0:000> !py c:\tmp\clrfindstack.py
Please provide a search string as argument
0:000> !py c:\tmp\clrfindstack.py RunMessageLoop
Found RunMessageLoop in thread 0 (Use ~0s to select it)

该实现可能不是很 pythonic,但可以完成它的工作。