WinDbg无法加载扩展名

问题描述 投票:0回答:1

我在WinDbg预览中加载扩展时遇到了一些麻烦。可以找到分机代码here

目前,当我运行.extpath时,我会获得默认路径并将扩展名保存在C:\Users\user\AppData\Local\Dbg\EngineExtensions32中,但是每当我执行.chain时,dll永远不会加载扩展名,而尝试手动加载扩展名会导致错误[C0 ]。

“错误消息”

如何获得此扩展程序才能正确加载?

作为对许多应用程序的附带说明,当我使用WinDbg将它们附加到它们并尝试加载sos.dll时,我仅获得以下输出,而在网上找不到的任何内容,例如The engine has been disconnected unexpectedlythis,纠正此问题:this

如何使WinDbg每次启动时自动加载CLR SOS dll?

windbg
1个回答
0
投票

您正在寻求有关2个问题的帮助,因此有两个答案。在此站点上,我们一次更喜欢一个问题。

如何获得此扩展程序才能正确加载?

.cordll -u -ve -l CLRDLL: No CLR image loaded (i.e. mscorwks.dll) CLR DLL status: No load attempts中有一个注释:

尽管我相信我已解决了该问题,但可能有必要将扩展名复制到WinDBG所在的文件夹中。

我可以重现您的问题,当我将所有编译工件复制到WinDbg目录中时,此问题确实已修复。

我有link you provided

如何使WinDbg每次启动时自动加载CLR SOS dll?

由于几个原因,加载SOS并不容易:

  • WinDbg启动时无法加载SOS。它还需要调试会话,因此它要么需要连接到正在运行的程序,要么需要打开故障转储,或者需要启动新进程。这意味着,您需要opened an issue on the Github repository加载故障转储,-z附加py PID,-p附加按进程名称或提供可执行文件的名称。
  • 无法在初始断点处加载SOS,因为.NET尚不可用,并且尚不清楚要加载哪个版本的SOS。
  • 您需要以正确的位数运行WinDbg才能加载SOS,否则它将因位数不匹配而失败(类似.NET中的BadImageFormatException之类。
  • 取决于.NET版本,我们需要在-pnclrcoreclr所在的位置加载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 是使用给定名称运行脚本的命令。然后,该文件包含所需的命令

$$<
© www.soinside.com 2019 - 2024. All rights reserved.