WinDbg 之 SOS扩展命令
SOS.dll (SOS debugging extension)
The SOS Debugging Extension (SOS.dll) helps you debug managed programs in Visual Studio and in the Windows debugger (WinDbg.exe) by providing information about the internal Common Language Runtime (CLR) environment. This tool requires your project to have unmanaged debugging enabled. SOS.dll is automatically installed with the .NET Framework. To use SOS.dll in Visual Studio, install the Windows Driver Kit (WDK).
Syntax
![command] [options]
Commands
| Command | Description |
|---|---|
| AnalyzeOOM (ao) | Displays the information for the last out of memory (OOM) that occurred on an allocation request to the garbage collection heap. (In server garbage collection, it displays OOM, if any, on each garbage collection heap.) |
BPMD [-nofuturemodule] [<module name> <method name>] [-md <MethodDesc>] -list -clear<pending breakpoint number> -clearall |
Creates a breakpoint at the specified method in the specified module.
If the specified module and method have not been loaded, this command waits for a notification that the module was loaded and just-in-time (JIT) compiled before creating a breakpoint. You can manage the list of pending breakpoints by using the -list, -clear, and -clearall options: The -list option generates a list of all the pending breakpoints. If a pending breakpoint has a non-zero module ID, that breakpoint is specific to a function in that particular loaded module. If the pending breakpoint has a zero module ID, that breakpoint applies to modules that have not yet been loaded. Use the -clear or -clearall option to remove pending breakpoints from the list. |
| CLRStack [-a] [-l] [-p] [-n] | Provides a stack trace of managed code only.
The -p option shows arguments to the managed function. The -l option shows information on local variables in a frame. The SOS Debugging Extension cannot retrieve local names, so the output for local names is in the format <local address> = <value>. The -a(all) option is a shortcut for -l and -p combined. The -n option disables the display of source file names and line numbers. If the debugger has the option SYMOPT_LOAD_LINES specified, SOS will look up the symbols for every managed frame and if successful will display the corresponding source file name and line number. The -n (No line numbers) parameter can be specified to disable this behavior. The SOS Debugging Extension does not display transition frames on x64 and IA-64-based platforms. |
| COMState | Lists the COM apartment model for each thread and a Context pointer, if available. |
| DumpArray [-start<startIndex>] [-length<length>] [-details] [-nofields] <array object address>
-or- DA [-start<startIndex>] [-length<length>] [-detail] [-nofields] array object address> |
Examines elements of an array object.
The -start option specifies the starting index at which to display elements. The -length option specifies how many elements to show. The -details option displays details of the element using the DumpObj and DumpVC formats. The -nofields option prevents arrays from displaying. This option is available only when the -detail option is specified. |
| DumpAssembly<assembly address> | Displays information about an assembly.
The DumpAssembly command lists multiple modules, if they exist. You can get an assembly address by using the DumpDomain command. |
| DumpClass <EEClass address> | Displays information about the EEClass structure associated with a type.
The DumpClass command displays static field values but does not display nonstatic field values. Use the DumpMT, DumpObj, Name2EE, or Token2EE command to get an |
| DumpDomain[<domain address>] | Enumerates each Assembly object that is loaded within the specified AppDomain object address. When called with no parameters, the DumpDomain command lists all AppDomain objects in a process. |
| DumpHeap [-stat] [-strings] [-short] [-min<size>] [-max <size>] [-thinlock] [-startAtLowerBound] [-mt <MethodTable address>] [-type<partial type name>][start [end]] | Displays information about the garbage-collected heap and collection statistics about objects.
The DumpHeap command displays a warning if it detects excessive fragmentation in the garbage collector heap. The -stat option restricts the output to the statistical type summary. The -strings option restricts the output to a statistical string value summary. The -short option limits output to just the address of each object. This lets you easily pipe output from the command to another debugger command for automation. The -min option ignores objects that are less than the The -max option ignores objects that are larger than the The -thinlock option reports ThinLocks. For more information, see the SyncBlk command. The The -mt option lists only those objects that correspond to the specified The -type option lists only those objects whose type name is a substring match of the specified string. The The |
| DumpIL <Managed DynamicMethod object> | <DynamicMethodDesc pointer> | <MethodDesc pointer> | Displays the Microsoft intermediate language (MSIL) that is associated with a managed method.
Note that dynamic MSIL is emitted differently than MSIL that is loaded from an assembly. Dynamic MSIL refers to objects in a managed object array rather than to metadata tokens. |
DumpLog [-addr<addressOfStressLog>] [<Filename>] |
Writes the contents of an in-memory stress log to the specified file. If you do not specify a name, this command creates a file called StressLog.txt in the current directory.
The in-memory stress log helps you diagnose stress failures without using locks or I/O. To enable the stress log, set the following registry keys under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework: (DWORD) StressLog = 1 (DWORD) LogFacility = 0xffffffff (DWORD) StressLogSize = 65536 The optional |
| DumpMD<MethodDesc address> | Displays information about a MethodDesc structure at the specified address.
You can use the IP2MD command to get the |
| DumpMT [-MD] <MethodTable address> | Displays information about a method table at the specified address. Specifying the -MD option displays a list of all methods defined with the object.
Each managed object contains a method table pointer. |
DumpMethodSig<sigaddr> <moduleaddr> |
Displays information about a MethodSig structure at the specified address. |
| DumpModule [-mt] <Module address> | Displays information about a module at the specified address. The -mtoption displays the types defined in a module and the types referenced by the module
You can use the DumpDomain or DumpAssembly command to retrieve a module's address. |
| DumpObj [-nofields] <object address>
-or- DO <object address> |
Displays information about an object at the specified address. The DumpObj command displays the fields, the EEClass structure information, the method table, and the size of the object.
You can use the DumpStackObjects command to retrieve an object's address. Note that you can run the DumpObj command on fields of type The |
| DumpRuntimeTypes | Displays the runtime type objects in the garbage collector heap and lists their associated type names and method tables. |
DumpStack [-EE] [-n] [top stack [bottom stack]] |
Displays a stack trace.
The -EE option causes the DumpStack command to display only managed functions. Use the The -n option disables the display of source file names and line numbers. If the debugger has the option SYMOPT_LOAD_LINES specified, SOS will look up the symbols for every managed frame and if successful will display the corresponding source file name and line number. The -n (No line numbers) parameter can be specified to disable this behavior. On x86 and x64 platforms, the DumpStack command creates a verbose stack trace. On IA-64-based platforms, the DumpStack command mimics the debugger's K command. The |
| DumpSig <sigaddr> <moduleaddr> | Displays information about a Sig structure at the specified address. |
| DumpSigElem<sigaddr> <moduleaddr> | Displays a single element of a signature object. In most cases, you should use DumpSig to look at individual signature objects. However, if a signature has been corrupted in some way, you can use DumpSigElem to read the valid portions of it. |
DumpStackObjects [-verify] [top stack [bottom stack]]
-or- DSO [-verify] [ |
Displays all managed objects found within the bounds of the current stack.
The -verify option validates each non-static Use the DumpStackObject command with stack tracing commands such as the K command and the CLRStack command to determine the values of local variables and parameters. |
| DumpVC<MethodTable address> <Address> | Displays information about the fields of a value class at the specified address.
The MethodTable parameter allows the DumpVC command to correctly interpret fields. Value classes do not have a method table as their first field. |
| EEHeap [-gc] [-loader] | Displays information about process memory consumed by internal CLR data structures.
The -gc and -loader options limit the output of this command to garbage collector or loader data structures. The information for the garbage collector lists the ranges of each segment in the managed heap. If the pointer falls within a segment range given by -gc, the pointer is an object pointer. |
| EEStack [-short] [-EE] | Runs the DumpStack command on all threads in the process.
The -EE option is passed directly to the DumpStack command. The -shortparameter limits the output to the following kinds of threads: Threads that have taken a lock. Threads that have been stalled in order to allow a garbage collection. Threads that are currently in managed code. |
| EEVersion | Displays the CLR version. |
| EHInfo [<MethodDesc address>] [<Code address>] | Displays the exception handling blocks in a specified method. This command displays the code addresses and offsets for the clause block (the try block) and the handler block (the catch block). |
| FAQ | Displays frequently asked questions. |
| FinalizeQueue [-detail] | [-allReady] [-short] | Displays all objects registered for finalization.
The -detail option displays extra information about any The The |
| FindAppDomain<Object address> | Determines the application domain of an object at the specified address. |
| FindRoots -gen <N> | -gen any |<object address> | Causes the debugger to break in the debuggee on the next collection of the specified generation. The effect is reset as soon as the break occurs. To break on the next collection, you have to reissue the command. The <object address> form of this command is used after the break caused by the -genor -gen any has occurred. At that time, the debuggee is in the right state for FindRoots to identify roots for objects from the current condemned generations. |
| GCHandles [-perdomain] | Displays statistics about garbage collector handles in the process.
The -perdomain option arranges the statistics by application domain. Use the GCHandles command to find memory leaks caused by garbage collector handle leaks. For example, a memory leak occurs when code retains a large array because a strong garbage collector handle still points to it, and the handle is discarded without freeing it. |
| GCHandleLeaks | Searches memory for any references to strong and pinned garbage collector handles in the process and displays the results. If a handle is found, the GCHandleLeaks command displays the address of the reference. If a handle is not found in memory, this command displays a notification. |
| GCInfo <MethodDesc address><Code address> | Displays data that indicates when registers or stack locations contain managed objects. If a garbage collection occurs, the collector must know the locations of references to objects so it can update them with new object pointer values. |
| GCRoot [-nostacks] <Object address> | Displays information about references (or roots) to an object at the specified address.
The GCRoot command examines the entire managed heap and the handle table for handles within other objects and handles on the stack. Each stack is then searched for pointers to objects, and the finalizer queue is also searched. This command does not determine whether a stack root is valid or is discarded. Use the CLRStack and U commands to disassemble the frame that the local or argument value belongs to in order to determine if the stack root is still in use. The -nostacks option restricts the search to garbage collector handles and freachable objects. |
| GCWhere <object address> | Displays the location and size in the garbage collection heap of the argument passed in. When the argument lies in the managed heap but is not a valid object address, the size is displayed as 0 (zero). |
help [<command>] [faq] |
Displays all available commands when no parameter is specified, or displays detailed help information about the specified command.
The |
| HeapStat [-inclUnrooted | -iu] | Displays the generation sizes for each heap and the total free space in each generation on each heap. If the -inclUnrooted option is specified, the report includes information about the managed objects from the garbage collection heap that is no longer rooted. |
| HistClear | Releases any resources used by the family of Hist commands.
Generally, you do not have to explicitly call |
| HistInit | Initializes the SOS structures from the stress log saved in the debuggee. |
| HistObj<obj_address> | Examines all stress log relocation records and displays the chain of garbage collection relocations that may have led to the address passed in as an argument. |
| HistObjFind<obj_address> | Displays all the log entries that reference an object at the specified address. |
| HistRoot <root> | Displays information related to both promotions and relocations of the specified root.
The root value can be used to track the movement of an object through the garbage collections. |
| IP2MD <Code address> | Displays the MethodDesc structure at the specified address in code that has been JIT-compiled. |
ListNearObj (lno) <obj_address> |
Displays the objects preceding and following the specified address. The command looks for the address in the garbage collection heap that looks like a valid beginning of a managed object (based on a valid method table) and the object following the argument address. |
| MinidumpMode [0] [1] | Prevents running unsafe commands when using a minidump.
Pass 0 to disable this feature or 1 to enable this feature. By default, the MinidumpMode value is set to 0. Minidumps created with the .dump /m command or .dump command have limited CLR-specific data and allow you to run only a subset of SOS commands correctly. Some commands may fail with unexpected errors because required areas of memory are not mapped or are only partially mapped. This option protects you from running unsafe commands against minidumps. |
| Name2EE <module name> <type or method name>
-or- Name2EE <module name>!<type or method name> |
Displays the MethodTable structure and EEClass structure for the specified type or method in the specified module.
The specified module must be loaded in the process. To get the proper type name, browse the module by using the Ildasm.exe (IL Disassembler). You can also pass This command supports the Windows debugger syntax of < |
| ObjSize [<Object address>] | [-aggregate] [-stat] | Displays the size of the specified object. If you do not specify any parameters, the ObjSize command displays the size of all objects found on managed threads, displays all garbage collector handles in the process, and totals the size of any objects pointed to by those handles. The ObjSizecommand includes the size of all child objects in addition to the parent.
The -aggregate option can be used in conjunction with the -stat argument to get a detailed view of the types that are still rooted. By using !dumpheap -stat and !objsize -aggregate -stat, you can determine which objects are no longer rooted and diagnose various memory issues. |
| PrintException [-nested] [-lines] [<Exception object address>]
-or- PE [-nested] [<Exception object address>] |
Displays and formats fields of any object derived from the Exception class at the specified address. If you do not specify an address, the PrintException command displays the last exception thrown on the current thread.
The -nested option displays details about nested exception objects. The -lines option displays source information, if available. You can use this command to format and view the |
| ProcInfo [-env] [-time] [-mem] | Displays environment variables for the process, kernel CPU time, and memory usage statistics. |
| RCWCleanupList<RCWCleanupList address> | Displays the list of runtime callable wrappers at the specified address that are awaiting cleanup. |
| SaveModule <Base address> <Filename> | Writes an image, which is loaded in memory at the specified address, to the specified file. |
| SOSFlush | Flushes an internal SOS cache. |
| StopOnException [-derived] [-create | -create2] <Exception> <Pseudo-register number> | Causes the debugger to stop when the specified exception is thrown, but to continue running when other exceptions are thrown.
The -derived option catches the specified exception and every exception that derives from the specified exception. |
| SyncBlk [-all | <syncblk number>] | Displays the specified SyncBlock structure or all SyncBlockstructures. If you do not pass any arguments, the SyncBlk command displays the SyncBlock structure corresponding to objects that are owned by a thread.
A |
| ThreadPool | Displays information about the managed thread pool, including the number of work requests in the queue, the number of completion port threads, and the number of timers. |
| Token2EE <module name> <token> | Turns the specified metadata token in the specified module into a MethodTable structure or MethodDesc structure.
You can pass |
| Threads [-live] [-special] | Displays all managed threads in the process.
The Threads command displays the debugger shorthand ID, the CLR thread ID, and the operating system thread ID. Additionally, the Threads command displays a Domain column that indicates the application domain in which a thread is executing, an APT column that displays the COM apartment mode, and an Exception column that displays the last exception thrown in the thread. The -live option displays threads associated with a live thread. The -special option displays all special threads created by the CLR. Special threads include garbage collection threads (in concurrent and server garbage collection), debugger helper threads, finalizer threads, AppDomainunload threads, and thread pool timer threads. |
| ThreadState < State value field > | Displays the state of the thread. The value parameter is the value of the State field in the Threads report output.
Example:
|
| TraverseHeap [-xml] <filename> | Writes heap information to the specified file in a format understood by the CLR profiler. The -xml option causes the TraverseHeap command to format the file as XML.
You can download the CLR Profiler from the Microsoft Download Center. |
| U [-gcinfo] [-ehinfo] [-n] <MethodDesc address> | <Code address> | Displays an annotated disassembly of a managed method specified either by a MethodDesc structure pointer for the method or by a code address within the method body. The U command displays the entire method from start to finish, with annotations that convert metadata tokens to names.
The -gcinfo option causes the U command to display the The -ehinfo option displays exception information for the method. You can also obtain this information with the EHInfo command. The -n option disables the display of source file names and line numbers. If the debugger has the option SYMOPT_LOAD_LINES specified, SOS looks up the symbols for every managed frame and, if successful, displays the corresponding source file name and line number. You can specify the -noption to disable this behavior. |
| VerifyHeap | Checks the garbage collector heap for signs of corruption and displays any errors found.
Heap corruptions can be caused by platform invoke calls that are constructed incorrectly. |
| VerifyObj <object address> | Checks the object that is passed as an argument for signs of corruption. |
| VMMap | Traverses the virtual address space and displays the type of protection applied to each region. |
| VMStat | Provides a summary view of the virtual address space, ordered by each type of protection applied to that memory (free, reserved, committed, private, mapped, image). The TOTAL column displays the result of the AVERAGE column multiplied by the BLK COUNT column. |
Remarks
The SOS Debugging Extension lets you view information about code that is running inside the CLR. For example, you can use the SOS Debugging Extension to display information about the managed heap, look for heap corruptions, display internal data types used by the runtime, and view information about all managed code running inside the runtime.
To use the SOS Debugging Extension in Visual Studio, install the Windows Driver Kit (WDK). For information about the integrated debugging environment in Visual Studio, see Debugging Environments.
You can also use the SOS Debugging Extension by loading it into the WinDbg.exe debuggerand executing commands within WinDbg.exe.
To load the SOS Debugging Extension into the WinDbg.exe debugger, run the following command in the tool:
.loadby sos clr
WinDbg.exe and Visual Studio use a version of SOS.dll that corresponds to the version of Mscorwks.dll currently in use. By default, you should use the version of SOS.dll that matches the current version of Mscorwks.dll.
To use a dump file created on another computer, make sure that the Mscorwks.dll file that came with that installation is in your symbol path, and load the corresponding version of SOS.dll.
To load a specific version of SOS.dll, type the following command into the Windows Debugger:
.load <full path to sos.dll>
Examples
The following command displays the contents of an array at the address 00ad28d0. The display starts from the second element and continues for five elements.
!dumparray -start 2 -length 5 -detail 00ad28d0
The following command displays the contents of an assembly at the address 1ca248.
!dumpassembly 1ca248
The following command displays information about the garbage collector heap.
!dumpheap
The following command writes the contents of the in-memory stress log to a (default) file called StressLog.txt in the current directory.
!DumpLog
The following command displays the MethodDesc structure at the address 902f40.
!dumpmd 902f40
The following command displays information about a module at the address 1caa50.
!dumpmodule 1caa50
The following command displays information about an object at the address a79d40.
!DumpObj a79d40
The following command displays the fields of a value class at the address 00a79d9c using the method table at the address 0090320c.
!DumpVC 0090320c 00a79d9c
The following command displays the process memory used by the garbage collector.
!eeheap -gc
The following command displays all objects scheduled for finalization.
!finalizequeue
The following command determines the application domain of an object at the address 00a79d98.
!findappdomain 00a79d98
The following command displays all garbage collector handles in the current process.
!gcinfo 5b68dbb8
The following command displays the MethodTable and EEClass structures for the Mainmethod in the class MainClass in the module unittest.exe.
!name2ee unittest.exe MainClass.Main
The following command displays information about the metadata token at the address 02000003 in the module unittest.exe.
!token2ee unittest.exe 02000003
WinDbg 之 SOS扩展命令的更多相关文章
- WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...
- 使用Windbg和SoS扩展调试分析.NET程序
在博客堂的不是我舍不得 - High CPU in GC(都是+=惹的祸,为啥不用StringBuilder呢?). 不是我舍不得 - .NET里面的Out Of Memory 看到很多人在问如何分析 ...
- WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...
- Windbg脚本和扩展工具开篇
好长一段时间没写文章了,最近一直忙于为项目的可调式性做一些脚本和扩展工具,鉴于对windbg强大威力的震撼,以及相对较少的资料,笔者决定写一系列关于如何开发Windbg脚本和扩展命令的文章,您的支持是 ...
- windbg调试系列教程:sos扩展的介绍和使用
SOS是什么? 直观来说,sos就是一个程序集文件.这个程序集的作用就是让我们在使用windbg分析.net进程时,更加方便快捷.通过sos,我们可以清晰的查看CLR运行时的各类信息,辅助我们去理解托 ...
- C#编程模式之扩展命令
C#编程模式之扩展命令 前言 根据上一篇的命令模式和在工作中遇到的一些实际情况,有了本篇文章,时时都是学习的一个过程,会在这个过程中发现许多好的模式或者是一种开发方式,今天写出来的就是我工作中常用到的 ...
- windbg指定SOS版本,执行扩展命令报错
调试dump文件,加载相匹配版本的sos/clr时,绝大多数都是可以正常使用的. 然而凡事都有例外,今天在做类似工作时,遇到了错误: CLRDLL: Consider using ".cor ...
- windbg关于.NET分析的扩展命令
收到一个dump文件,运行环境的.net framework的详细版本是多少呢? dump信息与性能计数器结合分析时,想知道该dump运行的进程号是多少? dump定位到有效的堆栈信息,而对应的源码是 ...
- VS里用Sos扩展调试CLR总结
暂时不用Windbg,用VS来调试CLR. 1) Enable unmanaged debugging 2) Load sos.dll into vs. !DumpHead -type SimpleC ...
随机推荐
- Python操作redis系列之 列表(list) (五)(转)
# -*- coding: utf-8 -*- import redis r =redis.Redis(host=") 1. Lpush 命令将一个或多个值插入到列表头部. 如果 key 不 ...
- Ubuntu18.04下可以完美运行Quake3 Arena
安装 其实很早就知道Linux下面可以跑Quake3, 但是一直没有付诸行动, 在硬盘上躺了很多年的Quake III Arena, 和Brood一起从来不舍得删, 昨天终于想起来试试. 安装很简单, ...
- ffmpeg -i 10.wmv -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 C:\fm\074\10\10.m3u8
ffmpeg -i 10.wmv -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 C:\fm\074\10\1 ...
- 企业和个人都需要的终极跨平台全端解决方案 UniApp
相信大家在平时开发过程中都会遇到这两类问题: 很多中小型企业要快速开发一个产品,这个产品至少需要覆盖平台范围为:ios.Android.web/H5.微信/支付宝小程序,那么需要的投入的人力成本.时间 ...
- wps直接打开CVS文件会把长串数字订单号最后4位变为0
WPS打开CVS文件,发现里面的长串数字订单号后4位全变成0了,而且是以科学计数法来显示了 上网查了下,不能直接打开,得先在WPS(OFFICE中也一样)中新建一个空白表格,然后用菜单里的数据导入功能 ...
- python(62):保留两位小数
转载:https://blog.csdn.net/jiandanjinxin/article/details/77752297 在C/C++语言对于整形数执行除法会进行地板除(舍去小数部分). 例如 ...
- 【温暖】文龙回AICODER给老马送锦旗了
又是一个愉快的周末,AICODER第一批老学员文龙小伙伴.已经工作两个月,而且就业薪资12000+,文龙从之前月薪不足4000,一下子翻了三倍多的工资. 几个月的实习,让文龙掌握了大前端全栈的技术,在 ...
- 高性能前端 art-template 模板
官网: https://aui.github.io/art-template/zh-cn/index.html nodejs 服务器端使用 第一步: 引入 art-template 的包 npm in ...
- idea当配置eclipse快捷键时,全局替换的快捷键是什么?
简介 每次为了新版本新建一个分支的时候,都要改每个maven的版本号,好麻烦,有么有?如下图: 当idea配置eclipse快捷键时,默认是没有全局替换快捷键的,需要设置 步骤 首先打开setti ...
- 聊天机器人(chatbot)终极指南:自然语言处理(NLP)和深度机器学习(Deep Machine Learning)
在过去的几个月中,我一直在收集自然语言处理(NLP)以及如何将NLP和深度学习(Deep Learning)应用到聊天机器人(Chatbots)方面的最好的资料. 时不时地我会发现一个出色的资源,因此 ...