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的。