调试器扩展SOS

SOS是一个调试器扩展,用于调试.NET应用程序。它提供了一组非常丰富的命令,这些命令使开发人员可以对CLR进行深入分析,并且有助于找出应用程序中各种复杂错误的原因。

 
由于SOS能够提供CLR内部工作机制的抽象视图,因此在使用SOS进行调试时,必须使用正确的版本。每个版本的.NET在发布时都带有相应的SOS,可以在以下位置找到:
 
%windir%\Microsoft.NET\\\sos.dll
 
其中,“Architecture”的值可以是Framework(32位)或者Framework64(64位),而version的值则表示所使用的.NET框架版本。
 
在使用SOS之前,必须先通过.load命令将其加载到调试器中。如果加载的版本不对,会提示如下信息:
The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll) f
ailed, Win32 error 0n193
    "%1 is not a valid Win32 application."
Please check your debugger configuration and/or network access.
 
 
在成功加载SOS之后,执行扩展命令!help,这个命令将显示SOS中包含的一组命令。
 
接下来通过!Threads命令可以显示出进程中的所有托管线程。如:
 
0:000> .load C:\Windows\Microsoft.NET\Framework64\v2.0.50727\sos.dll
0:000> !Threads
Failed to find runtime DLL (mscorwks.dll), 0x80004005
Extension commands need mscorwks.dll in order to have something to do.
0:000>
 
结果显示一个错误信息,表示没有找到mscorwks.dll。
 
当第一次加载.NET应用程序时,CLR将同时加载和初始化。负责实现运行时的库是mscorwks.dll。SOS返回的错误信息表示当前进程不是一个.NET进程,或者当前还没有加载运行时,因此这些调试器扩展命令不可用。
 
也可以不指定SOS的完整路径,可以使用调试命令.loadby。 .loadby 。
 
“.loadby sos.dll mscorwks”表示从mscorwks.dll所在的目录中加载SOS。
 
0:000> .loadby sos.dll mscorwks
Unable to find module 'mscorwks'
0:000>
 
如果遇到这个错误信息:“Unable to find module 'mscorwks'”,可以尝试使用命令如下:
 
0:000> sxe -c "" clrn
0:000> g
 
执行完之后再尝试使用“.loadby sos.dll mscorwks”,应该就正常了。
 
遇到如下错误信息,也可以尝试先使用命令"sxe -c "" clrn","g"来先加载运行时:
 
Failed to find runtime DLL (mscorwks.dll), 0x80004005
Extension commands need mscorwks.dll in order to have something to do.
 
使用!dumpdomain命令时出现如下错误信息:
 
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\W
indows\Microsoft.NET\Framework64\v2.0.50727\mscorwks.dll -
或者
0:000> !dumpdomain
PDB symbol for mscorwks.dll not loaded
 
需要先加载符号文件。
 
使用命令!sym noisy来开启符号文件加载信息的详细输出。
 
0:000> !sym noisy
noisy mode - symbol prompts off
0:000> !sym - prompts
noisy mode - symbol prompts on
0:000>
 
通过如下命令可以成功加载符号文件:
 
0:000> .sympath srv*c:\symstore.pri*http://msdl.microsoft.com/download/symbols
 
使用.reload /f命令可以加载应用程序中用到的所有模块。
 
加载完符号文件以及SOS扩展之后,使用!dumpdomain命令,如果还出现如下错误信息:
 
0:000> !dumpdomain
--------------------------------------
System Domain: 0000000000000000
Unable to get system domain info
 
请尝试关闭应用程序之后再打开调试器进行,应该之后会OK的。
原文地址:https://www.cnblogs.com/yumianhu/p/3710755.html