获取在其调用堆栈中包含特定 .NET 函数的线程?
Get the threads which contain a certain .NET function in their call stack?
我有一个包含 73 个线程的用户模式转储。其中有些是托管的,有些是本地的。
我想找到托管线程,其中调用堆栈包含某个托管函数。
我在调试器中加载了 SOSEX 扩展。
现在我 ~*e !mk
转储所有托管线程,然后手动浏览它们以查找我需要的内容 - 太长且令人厌烦。
有没有更好的方法?
相关命令
!findstack <module> 2
可以找到在堆栈上具有特定模块的线程,但恕我直言,它仅适用于本机调用堆栈和模块,不适用于方法。
然后是 !uniqstack
,这可能有助于缩小线程范围,以防许多线程具有相同的调用堆栈。这也是一个本地命令。
丑陋的内置解决方案
我在这种情况下所做的是一个丑陋的解决方法,但我还没有找到更好的方法:
.shell -ci "!clrstack" find "Class.Method("
当然,您可以将此与 ~*e
结合使用,以对所有线程执行此操作。
~*e ? $tid;.shell -ci "!clrstack" find "Program.Main("
PyKd 脚本
如果您不介意安装另一个 WinDbg 扩展,我推荐 PyKd 以获得更方便和安静的解决方案。在 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]))
然后用参数调用它
~*e !py find.py "!clrstack" "Program.Main(" "? $tid"
我有一个包含 73 个线程的用户模式转储。其中有些是托管的,有些是本地的。 我想找到托管线程,其中调用堆栈包含某个托管函数。
我在调试器中加载了 SOSEX 扩展。
现在我 ~*e !mk
转储所有托管线程,然后手动浏览它们以查找我需要的内容 - 太长且令人厌烦。
有没有更好的方法?
相关命令
!findstack <module> 2
可以找到在堆栈上具有特定模块的线程,但恕我直言,它仅适用于本机调用堆栈和模块,不适用于方法。
然后是 !uniqstack
,这可能有助于缩小线程范围,以防许多线程具有相同的调用堆栈。这也是一个本地命令。
丑陋的内置解决方案
我在这种情况下所做的是一个丑陋的解决方法,但我还没有找到更好的方法:
.shell -ci "!clrstack" find "Class.Method("
当然,您可以将此与 ~*e
结合使用,以对所有线程执行此操作。
~*e ? $tid;.shell -ci "!clrstack" find "Program.Main("
PyKd 脚本
如果您不介意安装另一个 WinDbg 扩展,我推荐 PyKd 以获得更方便和安静的解决方案。在 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]))
然后用参数调用它
~*e !py find.py "!clrstack" "Program.Main(" "? $tid"