!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,但可以完成它的工作。
我发现 !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,但可以完成它的工作。