如何在加载.NET 2或.NET 4时设置断点?

时间:2014-01-12 21:41:58

标签: windbg

有时我正在调试.NET应用程序,但我不知道他们是否会使用.NET 2或.NET 4.我想在.NET加载时中断,所以我做

sxe -c ".echo .NET4 loaded" ld clr
sxe -c ".echo .NET2 loaded" ld mscorwks

不幸的是,只有一个这样的断点,在上面的示例中,mscorwks会覆盖clr,而在.NET4的情况下,它不会遇到断点。

有没有办法打破多个不同的加载事件?

我真的不想摆弄我的非工作难以理解的尝试

sxe -c".foreach /ps 5 /pS 99 (token {.lastevent}) {.if ($spat(\"[0-9a-z.:\\]*\\clr.dll\",\"${token}\")) {.echo clr;} .elsif ($spat(\".*\mscorwks.dll\",\"${token}\")) {.echo mscorwks} .else {}}" ld

2 个答案:

答案 0 :(得分:1)

您可以设置两个断点

bu mscorwks!EEStartup

bu clr!EEStartup

(例如bu clr!EEStartup“.echo在clr加载时打破调试器”) 只有其中一个可以工作

答案 1 :(得分:0)

Using pykd,我提出了以下解决方案:

首先,使用以下内容编写Python脚本(在我的示例中为loadModule.py):

from pykd import *
import sys

event = lastEvent()
if event != eventType.LoadModule:
    sys.exit()

# get module load event details in string format
details = dbgCommand(".lastevent")

# remove the debugger time
details = details.split("\n")[0]

# get everything behind "Load module"
details = details.split("Load module ")[1]

# remove address
details = details.split(" at ")[0]

# remove full path
details = details.split("\\")[-1]

# remove extension
details = ".".join(details.split(".")[0:-1])

# compare case-insensitive
details = details.upper()

if details in [x.upper() for x in sys.argv[1:]]:
    breakin()

然后在load事件上设置断点,如下所示:

sxe -c "!py loadModule.py clr mscorwks coreclr;g" ld

这将在每个模块加载事件上执行Python脚本。如果找到模块,脚本会进入调试器(Python脚本中的breakin()),否则它会继续(g在WinDbg中)。

您可以使用任意数量的模块。比较是不区分大小写的。

请注意,这可能不是最优雅的解决方案。似乎还有另一种方法:继承eventHandler :: onModuleLoad。