查看文章 |
最新版本的MSDN Library中文版中已有此工具的文档,之前的版本都只有英文版本。 SOS 调试扩展 (SOS.dll) 通过提供有关内部公共语言运行库 (CLR) 环境的信息,帮助您在 WinDbg.exe 调试器和 Visual Studio 中调试托管程序。 ![command] [options] 命令 如果尚未加载指定的模块和方法,则此命令将在创建断点之前等待已加载并实时编译模块的通知。 -p 选项显示托管函数的参数。 -l 选项将显示有关帧中的局部变量的信息。 SOS 调试扩展无法检索本地名称,因此本地名称的输出采用 <local address> = <value> 格式。 -a (all) 选项是一个表示 -l 和 -p 的组合的快捷方式。 在基于 x64 和 IA-64 的平台上,SOS 调试扩展不显示过渡帧。 - 或 - DA [-start <startIndex>] [-length <length>] [-detail] [-nofields] array object address> -start 选项指定开始显示元素的起始索引。 -length 选项指定要显示的元素数量。 -detail 选项使用 DumpObj 和 DumpVC 格式显示元素的详细信息。 -nofields 选项可阻止显示数组。 此选项只有在指定了 -detail 选项之后才可用。 DumpAssembly 命令将列出多个模块(如果存在)。 可以使用 DumpDomain 命令获取程序集的地址。 DumpClass 命令显示静态字段值,但不显示非静态字段值。 使用 DumpMT、DumpObj, Name2EE 或 Token2EE 命令获取 EEClass 结构的地址。 如果 DumpHeap 命令检测到垃圾回收器堆中存在过多碎片,将会显示警告。 -stat 选项将输出限制为统计类型摘要。 -min 选项忽略小于 size 参数指定的大小(单位为字节)的对象。 -max 选项忽略大于 size 参数指定的大小(单位为字节)的对象。 -thinlock 选项报告 ThinLocks。 有关更多信息,请参见 SyncBlk 命令。 -mt 选项仅列出与指定的 MethodTable 结构对应的那些对象。 -type 选项仅列出其类型名称属于指定字符串的子串的那些对象。 start 参数从指定的地址处开始列出。 end 参数在指定的地址处停止列出。 请注意,发出的动态 IL 与从程序集加载的 IL 不同。 动态 IL 引用托管对象数组中的对象而不是引用元数据标记。 公共语言运行库提供了内存中压力日志,可帮助您诊断压力故障。 该日志可让您不必使用锁和 I/O 即可诊断故障。若要启用压力日志,请在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework 下设置下列注册表项: (DWORD) StressLog = 1 (DWORD) LogFacility = 0xffffffff (DWORD) StressLogSize = 65536 可以使用 IP2MD 命令从托管函数中获取 MethodDesc 结构地址。 每个托管对象都包含一个方法表指针。 可以使用 DumpDomain 或 DumpAssembly 命令检索模块的地址。 - 或 - DO <object address> 可以使用 DumpStackObjects 命令检索对象的地址。 请注意,可以对 CLASS 类型的字段运行 DumpObj 命令,因为这些字段也是对象。 -EE 选项使 DumpStack 命令仅显示托管函数。 使用 top 和 bottom 参数可限制 x86 平台上显示的堆栈帧。 在 x86 平台上,DumpStack 命令将创建详细的堆栈跟踪。 在基于 x64 和 IA-64 的平台上,DumpStack 命令将模拟执行调试器的 K 命令。 在基于 x64 和 IA-64 的平台上,将忽略 top 和 bottom 参数。 - 或 - DSO [-verify] [top stack [bottom stack]] -verify 选项验证对象字段的每个非静态 CLASS 字段。 将 DumpStackObject 命令与堆栈跟踪命令(如 K 命令和 CLRStack 命令)一起使用,以确定局部变量和参数的值。 MethodTable 参数使 DumpVC 命令可以正确解释字段。 值类不使用方法表作为它的第一个字段。 -gc 和 -loader 选项将此命令的输出限制为垃圾回收器或加载程序数据结构。 有关垃圾回收器的信息列出了托管堆中每个段的范围。 如果指针落在由 EEHeap -gc 给出的段范围内,则该指针是一个对象指针。 将 -EE 选项直接传递给 DumpStack 命令。 -short 参数将输出限制为以下类型的线程: 已获取锁的线程。 己停止运行以允许垃圾回收的线程。 当前在托管代码中的线程。 显示指定方法中的异常处理块。 此命令显示子句块(try 块)和处理程序块(catch 块)的代码地址和偏移量。 -detail 选项显示有关等待清理的任何 SyncBlocks 的附加信息以及有关等待清理的任何 RuntimeCallableWrappers (RCW) 的额外信息。 这两种数据结构都由终结器线程进行缓存和清理。 传递 -perdomain 选项将按应用程序域排列统计信息。 使用 GCHandles 命令可查找由垃圾回收器句柄泄漏导致的内存泄漏。 例如,当代码由于强垃圾回收器句柄仍指向一个大型数组而保留该数组时,若不释放句柄就将其放弃,则会发生内存泄漏。 GCRoot 命令将检查整个托管堆和句柄表以查找其他对象内的句柄和堆栈上的句柄。 然后,在每个堆栈中搜索对象的指针,同时还搜索终结器队列。 此命令无法确定堆栈根是有效的还是已丢弃。 使用 CLRStack 和 U 命令可对本地或参数值所属的帧进行反汇编,以便确定堆栈根是否仍在使用中。 -nostacks 选项将搜索限制为垃圾回收器句柄和 Freachable 对象。 faq 参数显示常见问题的答案。 防止在使用小型转储时运行不安全的命令。 传递 0 以禁用此功能或传递 1 以启用此功能。 默认情况下,MinidumpMode 值设置为 0。 使用 .dump /m 命令或 .dump 命令创建的小型转储具有有限的特定于 CLR 的数据,只允许您正确运行 SOS 命令的一个子集。 有些命令可能会因意外错误而失败,出错原因在于所需的内存区域未被映射或仅被部分映射。 此选项可防止您对小型转储运行不安全的命令。 - 或 - Name2EE <module name>!<type or method name> 在进程中必须加载指定的模块。 若要获取正确的类型名称,请使用 MSIL 反汇编程序 (Ildasm.exe) 浏览模块。 也可以将 * 作为 module name 作为参数来传递以搜索所有已加载的托管模块。 module name 参数也可以是模块调试器的名称,如 mscorlib 或 image00400000。 此命令支持 Windows 调试器语法:<module>!<type>。 类型必须是完全限定的。 - 或 - PE [-nested] [<Exception object address>] -nested 选项显示有关嵌套异常对象的详细信息。 可以使用此命令设置 _stackTrace 字段的格式化并查看该字段,该字段是一个二进制数组。 -derived 选项用于捕获指定异常以及从指定异常派生的每个异常。 SyncBlock 结构是一个容器,用于存放无需为每个对象创建的额外信息。 它可以存放 COM Interop 数据、哈希代码和用于线程安全操作的锁定信息。 可以为 module name 参数传递 * 以在每个已加载的托管模块中查找该标记映射到的内容。 也可以传递某个模块的调试器名称,如 mscorlib 或 image00400000。 Threads 命令显示调试器的简写 ID、公共语言运行库线程 ID 和操作系统线程 ID。另外,Threads 命令还会显示一个“Domain”(域)列以指示正在执行线程的应用程序域、一个“APT”列以显示 COM 单元模式以及一个“Exception”(异常)列以显示线程中所引发的最后一个异常。 -live 选项显示与活动线程关联的线程。 -special 选项显示由 CLR 创建的所有特殊线程。 特殊线程包括垃圾回收 (GC) 线程(在并行 GC 和服务器 GC 中)、调试器帮助程序线程、终结器线程、AppDomain 卸载线程和线程池计时器线程。 可以从以下网址下载 CLR 探查器:http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&familyid=90548130-4468-4bbc-9673-d6acabd5d13b -gcinfo 选项导致 U 命令显示方法的 GCInfo 结构。 -ehinfo 选项显示方法的异常信息。 也可以使用 EHInfo 命令获取此信息。 错误构造的平台调用可能导致堆损坏。 备注 SOS 调试扩展允许您查看有关在公共语言运行库内运行的代码的信息。 例如,可以使用 SOS 调试扩展显示有关托管堆的信息、查找堆损坏情况、显示运行库所使用的内部数据类型以及查看有关在运行库内运行的所有托管代码的信息。 加载 SOS 调试扩展 .loadby sos 必须首先在解决方案的项目设置中启用非托管调试,才能加载 SOS 调试扩展。 对于某些语言,默认情况下将禁用非托管调试。 注意 若要在 Visual Studio 2005 中显示“即时”窗口,请依次单击“调试”菜单、“窗口”菜单,然后单击“即时”选项。也可以通过选择 Ctrl-Alt-I 打开 Visual Studio 中的“即时”窗口。 WinDbg.exe 和 Visual Studio 使用与当前使用的 Mscorwks.dll 版本对应的 SOS.dll 版本。 在 .NET Framework 1.1 和 2.0 版中,SOS.dll 安装在与 Mscorwks.dll 相同的目录中。 默认情况下,应使用与当前版本的 Mscorwks.dll 匹配的 SOS.dll 版本。 若要使用在其他计算机上创建的转储文件,请确保该安装所附带的 Mscorwks.dll 文件存在于符号路径中,并加载相应的 SOS.dll 版本。 若要加载特定版本的 SOS.dll,请在 Windows 调试器中键入以下命令: .load <full path to sos.dll> 示例 下面的命令显示在地址 1ca248 处的程序集的内容。 下面的命令显示有关垃圾回收器堆的信息。 下面的命令将内存中压力日志的内容写入到当前目录中名为 Stresslog.txt 的文件中。 下面的命令显示在地址 902f40 处的 MethodDesc 结构。 下面的命令显示有关在地址 1caa50 处的模块的信息。 下面的命令显示有关在地址 a79d40 处的对象的信息。 下面的命令使用在地址 0090320c 处的方法表显示在地址 00a79d9c 处的值类的字段。 下面的命令显示垃圾回收器所使用的进程内存。 下面的命令显示所有已做好终结计划的对象。 下面的命令确定在地址 00a79d98 处的对象的应用程序域。 !findappdomain 00a79d98 下面的命令显示当前进程中的所有垃圾回收器句柄。 !gcinfo 5b68dbb8 下面的命令显示模块 unittest.exe 的类 MainClass 中的 Main 方法的 MethodTable 和 EEClass 结构。 !name2ee unittest.exe MainClass.Main 下面的命令显示有关在模块 unittest.exe 中的地址 02000003 处的元数据标记的信息。 !token2ee unittest.exe 02000003 |

