我是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
思想?
答案 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)
您的描述有点令人困惑,因为有三个部分需要考虑:
我将假设这是一个.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
方法的开头设置断点。
对于Silverlight,.NET模块不是clr
而是coreclr
,因此需要将命令更改为
.loadby sos coreclr
如果Silverlight作为单独的进程(sllauncher.exe
)运行,您可能希望附加到该进程(尝试.tlist
和.attach
)或调试子进程({{1} })确保你捕获那里的问题。使用.childdbg 1
(其中x是进程号)在进程之间切换。
这与.NET无关,所以SOS在这里没有帮助(除了获得.NET代码和本机代码之间的关系)。
您提到“IE证书错误”。如果这又是另一个进程(|xs
),也可以附加到它(命令和以前一样)。