有时我正在调试.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
答案 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。