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. hdu 1251(字典树)

    题目链接:http://acm.hdu.edu.cn/status.php?user=NYNU_WMH&pid=1251&status=5 Trie树的基本实现 字母树的插入(Inse ...

  2. crawler_爬虫开发的曲线图

    个人总结爬虫的学习曲线,可分为三个阶段, 一. 主要在填充基础知识,要熟悉http协议,学习正则表达式,首先基于jdk的基础包的网络功能,.net包下的  httpurlconnction 从细节上简 ...

  3. hdu 统计难题(map)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 map的强大之处,但是运行时间太长. 代码: #include <stdio.h> ...

  4. JavaScript之再谈回调与闭包

    前些阵子写了几篇关于回调和闭包的博文,感觉自己都是似懂非懂,最近在项目中又碰到了类似的情况,故在此咱们来重弹js中的回调与闭包. 先说说回调: 百度百科: 回调函数就是一个通过函数指针调用的函数.如果 ...

  5. oracle_解锁表_解锁用户

    1.解锁用户 以dba身份登录   sqlplus / as sysdba alter user scott account unlock; 2.解锁表 alter   system   kill   ...

  6. 【高德地图API】那些年我们一起开发的APP—即LBS应用模式分享

    原文:[高德地图API]那些年我们一起开发的APP—即LBS应用模式分享 摘要:利用地图API都能做些什么应用呢?应用商店里所有的分类,都可以结合上LBS来丰富应用.除了传统的生活服务应用,还有新潮的 ...

  7. Python - 字符串的替换(interpolation) 具体解释

    字符串的插值(interpolation) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27054263 字符串的替换 ...

  8. 收集的VS2013的使用小技巧( 不断总结中)

    对于经常使用vs的朋友,如果能用键盘直接做的事,还是键盘更便捷点,现在我就把自己遇到的一些给写下来. 1.对一个函数的说明 先写一个函数,以及参数,完成后,在函数上输入///,vs会自动补全说明的信息 ...

  9. JavaScript中的作用域和声明提前

    [翻译]JavaScript中的作用域和声明提前 原文:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html ===翻译 ...

  10. 让apache2不开机启动,管理Ubuntu的开机启动项

    今天在网上发现了一个很好用的管理Ubuntu下开关启动的软件,叫做sysv-rc-conf 使用命令行: tf@ubuntu:/etc/apache2$ sudo update-rc.d -f apa ...