有时我正在调试.NET应用程序,但不知道它们将使用.NET 2还是.NET4。我想在加载.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
使用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()
然后在加载事件上设置一个断点,如下所示:
sxe -c "!py loadModule.py clr mscorwks coreclr;g" ld
这将在每个模块加载事件上执行Python脚本。如果找到该模块,则该脚本会进入调试器(Python脚本中的breakin()),否则它将继续(在WinDbg中为g)。
您可以使用任意数量的模块。比较不区分大小写。
请注意,这可能不是最优雅的解决方案。似乎还有另一种方式:继承eventHandler :: onModuleLoad。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句