WinDBG:.loadby clr 给出 "Syntax error in extension string"

WinDBG: .loadby clr gives "Syntax error in extension string"

我是 WinDBG 新手。在 Windows 7 Pro 64 位上,我需要调试一个 运行 32 位应用程序,它加载 .NET 代码,打开 Silverlight,调用 WebBrowser 非托管 ActiveX 控件,然后导致 IE 证书错误。我需要调试该证书错误——也就是说,非托管 ActiveX 部分。这是我的步骤:

> launch WinDBG.exe x86
> Click File -> Open Executable -> (open MYPROG.EXE)
> .load psscor2
> .loadby sos clr
Unable to find module 'clr'

> .loadby sos
Syntax error in extension string

想法?

您收到该错误是因为 CLR 尚未加载到进程中。在您尝试以这种方式加载 SOS 之前,请确保托管代码具有 运行,否则只需为您的 CLR 版本使用 SOS.dll 的完整路径。

您的描述有点混乱,因为要考虑三个部分:

  1. "a running 32-bit application that loads .NET code"
  2. "opens Silverlight"
  3. "calls WebBrowser unmanaged ActiveX control"

关于 1,运行安装 .NET 可执行文件

我假设这是一个 .NET 应用程序,因此先加载 .NET 框架,然后再加载应用程序 运行。从你写这句话的方式来看,人们还可以认为它是一个 C++(本机)应用程序,它 运行s 然后加载 .NET as a hosting process(我认为这不太可能)。

WinDbg 将在 "initial breakpoint" 处停止,这是调试器第一次可以控制进程。此时,可执行文件还没有运行。对于 .NET,这也意味着尚未加载 .NET。

您可以通过为加载 clr 模块设置断点来等待 .NET 加载,如下所示:

sxe ld clr

遇到该断点时,.loadby sos clr 将起作用,因为它可以找到 CLR 模块,确定其路径,然后从同一目录加载 SOS。您得到的语法错误是因为命令 .loadby 需要第二个参数来搜索相关模块。

除此之外,您可以使用 .load 和完整路径加载 SOS。只要确保加载正确的版本即可。

请注意,在 .NET 也已初始化之前,某些命令可能无法运行,即托管堆可以正常运行。对于 "normal" .NET 应用程序,您可以在 Main 方法的开头设置断点。

关于 2,Silverlight

对于Silverlight,.NET模块不是clr而是coreclr,所以命令需要改为

.loadby sos coreclr

如果 Silverlight 运行作为一个单独的进程 (sllauncher.exe),您可能想要附加到该进程(尝试 .tlist.attach)或调试子进程 (.childdbg 1) 以确保捕获那里的问题。使用 |xs 在进程之间切换(其中 x 是进程号)。

关于 3,非托管 ActiveX 控件

这与 .NET 不再有任何关系,因此 SOS 在这里无济于事(除了获取 .NET 代码与本机代码之间的关系)。

你提到一个"an IE certificate error"。如果那又是另一个进程(iexplore.exe),也附加到它(像以前一样的命令)。

.loadby命令是一个快捷方式,它避免了输入sos.dll文件的完整路径名。它使用第二个参数 clr.dll 的路径来确定 sos.dll 的存储位置。仅当 clr.dll 已加载时才有效。

这不是你的情况,Silverlight 无疑会在稍后初始化。而且它不使用 clr.dll,它使用 .NETCore 版本的 CLR,coreclr.dll。另请注意,Silverlight 有自己的 sos.dll

版本

因此您必须输入全名:

   .load "C:\Program Files (x86)\Microsoft Silverlight.1.41212.0\sos.dll"

如有必要,将 5.1.41212.0 替换为您计算机上的 Silverlight 版本。