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

我的一台Win2008R2(64位)安装了VS2012和windbg32位版。
用VC2012编了个简单的32位控制台程序ConsoleApplication1,并创建C:\MyLocalSymbols目录,然后启动windbg:

(1)设置File-->Symbol file path填入:
C:\MyLocalSymbols;SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols

(2)File-->Open executable打开ConsoleApplication1,
进入Windbg的窗口:

C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
Copyright (c) Microsoft Corporation. All rights reserved.
 
CommandLine: "C:\Users\Administrator\Documents\Visual Studio 2012\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe"
Symbol search path is: C:\MyLocalSymbols;SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
ModLoad: 00200000 00228000   ConsoleApplication1.exe
ModLoad: 77c40000 77dc0000   ntdll.dll
ModLoad: 75f90000 760a0000   C:\Windows\syswow64\kernel32.dll
ModLoad: 76160000 761a6000   C:\Windows\syswow64\KERNELBASE.dll
ModLoad: 0f660000 0f72b000   C:\Windows\SysWOW64\MSVCP110D.dll
ModLoad: 0f150000 0f2f1000   C:\Windows\SysWOW64\MSVCR110D.dll
(1e20.1e0c): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00000000 ecx=cc7e0000 edx=002ae018 esi=fffffffe edi=00000000
eip=77ce0f3b esp=003af90c ebp=003af938 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll - 
ntdll!LdrVerifyImageMatchesChecksum+0x96c:
77ce0f3b cc              int     3
0:000> .sympath
Symbol search path is: C:\MyLocalSymbols;SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols
Expanded Symbol search path is: c:\mylocalsymbols;srv*c:\mylocalsymbols*http://msdl.microsoft.com/download/symbols

明明用.sympath已经看到我正确设置了符号文件路径,而且C盘下面的MyLocalSymbols里面也有了不少东西,如下图所示:

windbg Symbol file path的更多相关文章

  1. ERROR: Symbol file could not be found 寒江孤钓<<windows 内核安全编程>> 学习笔记

    手动下载了Symbols,设置好了Symbols File Path,串口连接上了以后,出现ERROR: Symbol file could not be found, 并且会一直不停的出现windb ...

  2. [LeetCode] Longest Absolute File Path 最长的绝对文件路径

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  3. Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  4. Leetcode: Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  5. "make_path" is not exported by the File::Path modul

    之前正常运行的perl脚本换了一个环境突然报 从原来的make_path 和 remove_tree改为现在的mkpath 和 rmtree就好了. File::Path version is 1.0 ...

  6. [Swift]LeetCode388. 文件的最长绝对路径 | Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  7. vue-cli 报Module build failed: Error: No parser and no file path given, couldn't infer a parser.错的解决方法

    出错提示如下: ERROR Failed to compile with errors :: error in ./src/App.vue Module build failed: Error: No ...

  8. vue.js报错:Module build failed: Error: No parser and no file path given, couldn't infer a parser.

    ERROR Failed to compile with 2 errors 12:00:33 error in ./src/App.vue Module build failed: Error: No ...

  9. Leetcode算法比赛----Longest Absolute File Path

    问题描述 Suppose we abstract our file system by a string in the following manner: The string "dir\n ...

随机推荐

  1. css+html菜单适应性学习的宽度

    本文就是利用css和html自适应于文本菜单的长度. 后效果图实现,例如下列: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvajkwMzgyOTE4Mg= ...

  2. C++ 在dynamic_cast&lt;&gt;用法

    /*这是从网上断开的试样.主要是关于 dynamic_cast<> 用法.*/ /* 行动:对象指向一个基类(或参考)cast一个指向派生类,dynamic_cast将基于一个基类指针确实 ...

  3. hdu Hat's Tea

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1288 去买茶,需要正好的钱才行,另外花的钱的个数最多  其实是一个简单的贪心问题,小的多取一点,多的少 ...

  4. Android UI开发神兵利器之Android Asset Studio

    Android Asset Studio 这个工具提供了一系列的资源设计实现,很推荐:

  5. 【高德地图API】从零开始学高德JS API(七)——定位方式大揭秘

    原文:[高德地图API]从零开始学高德JS API(七)——定位方式大揭秘 摘要:关于定位,分为GPS定位和网络定位2种.GPS定位,精度较高,可达到10米,但室内不可用,且超级费电.网络定位,分为w ...

  6. java io流之int数组数据的插入与取出

    java io流大家都非常熟悉吧,有时候假设用的不熟,对于数据的处理真的非常头疼,以下是对与int数组的处理. 以下是代码: public class Stream { private int a[] ...

  7. SQL Server日志文件庞大收缩方法(实测好用)

    原文:SQL Server日志文件庞大收缩方法(实测好用) 这两个命令连续执行,间隔时间越少越明显(可多次运行),直到达到效果 --截断 BACKUP LOG CloudMonitor TO DISK ...

  8. PHP支付接口RSA验证

    PHP 验签 Sign 验签数据准备: 公钥(Public key) Sign签名(一般是base64加密过的) Data参数(参数列表,Sign对应的参数值) php的openssl扩展里已经封装好 ...

  9. solr中重跑索引

    solr与.net系列课程(八)solr中重跑索引的注意事项   solr与.net系列课程(八)solr中重跑索引的注意事项 我们如果在项目中使用solr,那肯定就是把数据库中的数据跑进solr服务 ...

  10. Linux内核头文件与内核与库的关系

    看上一篇文章中对buildroot的介绍,里面的文档第 3.1.1.1 Internal toolchain backend 节内容 C库会去访问Linux kernel headers(*.h)文件 ...