我在WinDbg预览中加载扩展时遇到了一些麻烦。可以找到分机代码here。
目前,当我运行.extpath
时,我会获得默认路径并将扩展名保存在C:\Users\user\AppData\Local\Dbg\EngineExtensions32
中,但是每当我执行.chain时,dll永远不会加载扩展名,而尝试手动加载扩展名会导致错误[C0 ]。
如何获得此扩展程序才能正确加载?
作为对许多应用程序的附带说明,当我使用WinDbg将它们附加到它们并尝试加载sos.dll时,我仅获得以下输出,而在网上找不到的任何内容,例如The engine has been disconnected unexpectedly
或this,纠正此问题:this
如何使WinDbg每次启动时自动加载CLR SOS dll?
您正在寻求有关2个问题的帮助,因此有两个答案。在此站点上,我们一次更喜欢一个问题。
.cordll -u -ve -l
CLRDLL: No CLR image loaded (i.e. mscorwks.dll)
CLR DLL status: No load attempts
中有一个注释:
尽管我相信我已解决了该问题,但可能有必要将扩展名复制到WinDBG所在的文件夹中。
我可以重现您的问题,当我将所有编译工件复制到WinDbg目录中时,此问题确实已修复。
由于几个原因,加载SOS并不容易:
-z
附加py PID,-p
附加按进程名称或提供可执行文件的名称。-pn
,clr
或coreclr
所在的位置加载SOS。更糟糕的是,在某些情况下,.NET DLL甚至命名不正确(例如mscorwks
)有了这些知识,您现在可以构建一个小脚本,然后使用mscorwks_64800000
参数将该脚本传递给WinDbg。但是首先让我们确定需要做什么。
首先,我们可以简单地尝试所有.NET版本。如果加载了.NET,其中两个将失败,其中一个可能成功。这三个命令是
-c
现在,当加载.NET时,我们需要这样做。这对于崩溃转储或已经运行.NET的进程很好。这不适用于从头开始的过程。
因此,对于简单的情况,我们有一个类似的命令行
.loadby sos clr
.loadby sos coreclr
.loadby sos mscorwks
启动新流程的过程变得更加复杂。通常,您可以这样做]
windbg.exe -c ".loadby sos clr;.loadby sos coreclr;.loadby sos mscorwks" -z crash.dmp
windbg.exe -c ".loadby sos clr;.loadby sos coreclr;.loadby sos mscorwks" -p PID
windbg.exe -c ".loadby sos clr;.loadby sos coreclr;.loadby sos mscorwks" -pn name
以在加载CLR DLL之前加载SOS。不幸的是,一次只能有一个sxe -c".loadby sos clr;g" ld clr
断点,并且只能指定一个模块。但是,我们可以通过设置三个未解决的断点来解决此问题:
ld
请注意,这里的引号会导致难以避免的转义问题。不能使用双引号(bu clr!EEStartup ".loadby sos clr;g"
bu mscorwks!EEStartup ".loadby sos mscorwks;g"
bu coreclr!EEStartup ".loadby sos coreclr;g"
),脱字符号(""
)或我们从命令行知道的其他方式来解决这些问题。这就是为什么我们需要编写脚本。命令行是
^"
其中windbg -c "$$<loadsos.dbg;g" notepad.exe
是使用给定名称运行脚本的命令。然后,该文件包含所需的命令
$$<