WinDBG:.loadby clr在扩展字符串中提供"语法错误"

时间:2016-04-13 23:24:49

标签: c# windbg

我是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

思想?

3 个答案:

答案 0 :(得分:3)

.loadby命令是一个快捷方式,它避免了必须键入sos.dll文件的完整路径名。它使用第二个参数clr.dll的路径来确定sos.dll的存储位置。只有在已加载clr.dll的情况下才能使用。

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

所以你必须输入全名:

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

您的描述有点令人困惑,因为有三个部分需要考虑:

  1. “正在运行的加载.NET代码的32位应用程序”
  2. “打开Silverlight”
  3. “调用WebBrowser非托管ActiveX控件”
  4. 关于1,运行.NET可执行文件

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

    WinDbg将停在“初始断点”,这是调试器第一次可以控制进程。此时,可执行文件尚未运行。对于.NET,这也意味着尚未加载.NET。

    您可以等到.NET加载,方法是设置一个断点来加载clr模块,如下所示:

    sxe ld clr
    

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

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

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

    关于2,Silverlight

    对于Silverlight,.NET模块不是clr而是coreclr,因此需要将命令更改为

    .loadby sos coreclr
    

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

    关于3,非托管ActiveX控件

    这与.NET无关,所以SOS在这里没有帮助(除了获得.NET代码和本机代码之间的关系)。

    您提到“IE证书错误”。如果这又是另一个进程(|xs),也可以附加到它(命令和以前一样)。