gpt4 book ai didi

windbg - 获取在其调用堆栈中包含某个 .NET 函数的线程?

转载 作者:行者123 更新时间:2023-12-01 23:17:27 25 4
gpt4 key购买 nike

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

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

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

有更好的方法吗?

最佳答案

相关命令

!findstack <module> 2查找堆栈上具有特定模块的线程,但恕我直言,它仅适用于 native 调用堆栈和模块,不适用于方法。

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

丑陋的内置解决方案

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

.shell -ci "!clrstack" find "Class.Method("

当然你可以将其与 ~*e 结合起来对所有线程执行此操作。

~*e ? $tid;.shell -ci "!clrstack" find "Program.Main("

PyKd 脚本

如果您不介意安装另一个 WinDbg 扩展,我推荐 PyKd以获得更方便、更安静的解决方案。创建文件findstack.py在 WinDbg 目录(或者可能是 WinDbg 的工作目录,不太确定,否则使用完整路径)中包含内容

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"

关于windbg - 获取在其调用堆栈中包含某个 .NET 函数的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31437450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com