人生是一场不能存盘的RPG,我只能尽量多搞几个Screenshot

June 6, 2006

VS 中使用SOS

出自

More on debugging with SOS.DLL - enter Visual Studio
http://mtaulty.com/blog/archive/2004/08/06/628.aspx

FIX: Unmanaged debugging not possible until you install Visual C++ .NET
http://support.microsoft.com/default.aspx?scid=kb;en-us;813134

//—-调试Managed application
1. 设置project的属性,把”Enable Unmanaged Debugging”设置为true
否则在load sos时vs会报错:

SOS not available while Managed only debugging.
To load SOS, enable unmanaged debugging in your project properties.

如果没有安装 vc++.net, 上面的设置并不会有效果,使用F5直接运行project, vs会报错
—————————
Microsoft Development Environment
—————————
Error while trying to run project: Unable to start debugging.

Unable to start program ‘D:\Work2006\CursorTest\bin\Debug\CursorTest.exe’.

Unmanaged debugging is not available.

尝试使用 ctrl+F5启动程序,并Attach 进程,SOS也不能加载,提示:

SOS not available while Managed only debugging.
To load SOS, enable unmanaged debugging in your project properties.

3. 在 Immediate window (Debug-> Windows -> Immediate)中输入 .load sos
在Immediate window中输入 immed 和 cmd 可在Immediate mode和Command mode之间切换

//—-调试 dump file
1. File 打开 dump file

2. Debug->Start 等待中断

3. 在Immediate window中输入 .load sos

常用命令
!EEVersion
!ProcInfo
!ClrStack
!Help <command>
!

May 28, 2006

WinDbg+SOS实例

Filed under: WinDbg&SOS

出自
 SOS: It’s Not Just an ABBA Song Anymore(John Robbins)
 http://msdn.microsoft.com/msdnmag/issues/03/06/Bugslayer/
 
源码:
//——————————————————–
using System ;
using System.Diagnostics ;

namespace ExceptApp
{
    enum Days { Sat = 1 , Sun , Mon , Tue , Wed , Thu , Fri } ;
   
    class DoSomething
    {
        public void Doh ( String StrParam , Days ValueParam )
        {
            Console.WriteLine ( StrParam ) ;
            Console.WriteLine ( ValueParam.ToString ( ) ) ;
            throw new ArgumentException ( "Throwing an exception" , "x" ) ;
        }
       
        public void Reh ( int i , String StrParam )
        {
            Console.WriteLine ( "Reh = " + i ) ;
            String s = "Tommy can you see me? " + StrParam ;
            Days e = Days.Fri ;
            Doh ( s , e ) ;
        }
       
        public void Mi ( Object o )
        {
            Console.WriteLine ( "Mi = " + o.ToString ( ) ) ;
            String LocalStr = "Can you see me?" ;
            Reh ( 0x42 , LocalStr ) ;
        }
       
        public void Fa ( )
        {
            Mi ( this ) ;
        }
    }
 class Class1
 {
  static void Main(string[] args)
  {
      try
      {
          DoSomething x = new DoSomething ( ) ;
          x.Fa ( ) ;
      }
      catch
      {
      }
  }
 }
}
 
1. 何让WinDbg 拦截CLR Exception
使用菜单Debug->Event Filter打开Dialog
Click "Add"
enter "0xE0434F4D"
Select "Enabled" in the Execution group box
select "Not Handled" in the Continue group box

2. 使用 !thread 显示进程或一个dump文件中所有的managed线程

ThreadCount: 2
UnstartedThread: 0
BackgroundThread: 1
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
                                      PreEmptive   GC Alloc           Lock
       ID OSID ThreadOBJ    State     GC       Context       Domain   Count APT Exception
   0    1  188 00181148      a020 Enabled  013c4b6c:013c5fe8 0014f238     0 MTA System.ArgumentException (013c4ad0)
   2    2  94c 0018ae58      b220 Enabled  00000000:00000000 0014f238     0 MTA (Finalizer)

OSID为 win32 thread id
Domain 线程所在的app domain
Exception 可能包含多种含义, 以上的信息表明1号线程引发了ArgumentException, 2号线程是Finalizer
          这个字段的值还可能是 (Threadpool Worker), (Threadpool Completion Port), or (GC),这些
          都是.net的执行线程.

3. 使用Windbg的 ~ 系列命令
   ~     :  显示所有的线程
   ~*    :  显示所有的线程
   ~.    :    显示当前线程
   ~#    :  引发异常的线程
   ~2    :  2号线程

使用~会显示
.  0  Id: b64.188 Suspend: 1 Teb: 7ffde000 Unfrozen
   1  Id: b64.a14 Suspend: 1 Teb: 7ffdd000 Unfrozen
   2  Id: b64.94c Suspend: 1 Teb: 7ffdc000 Unfrozen
  
   可见, 进程中除了2个.net线程,还存在一个win32线程.
     
4. 使用 !clrstack (或!dumpstack)
   !clrstack -a       查看所有信息,包括参数和局部变量
   !clrstack -l       查看局部变量
   !clrstack -p       查看参数
  
   ~*e!clrstack       查看所有线程的调用栈.
  
使用 !clrstack -a 显示

OS Thread Id: 0x188 (0)
ESP       EIP    
0012f350 7c81eb33 [HelperMethodFrame: 0012f350]
0012f3f4 00df02e7 ExceptApp.DoSomething.Doh(System.String, ExceptApp.Days)
    PARAMETERS:
        this = 0x013c1c44
        StrParam = 0x013c3f18
        ValueParam = 0x00000007

0012f418 00df0237 ExceptApp.DoSomething.Reh(Int32, System.String)
    PARAMETERS:
        this = 0x013c1c44
        i = 0x00000042
        StrParam = 0x013c1c6c
    LOCALS:
        <CLR reg> = 0x013c3f18
        0x0012f41c = 0x00000007

0012f438 00df01a0 ExceptApp.DoSomething.Mi(System.Object)
    PARAMETERS:
        this = 0x013c1c44
        o = 0x013c1c44
    LOCALS:
        0x0012f438 = 0x013c1c6c

0012f450 00df0134 ExceptApp.DoSomething.Fa()
    PARAMETERS:
        this = 0x013c1c44

0012f458 00df00b8 ExceptApp.Class1.Main(System.String[])
    PARAMETERS:
        args = 0x013c1c34
    LOCALS:
        0x0012f458 = 0x013c1c44

0012f69c 79e88f63 [GCFrame: 0012f69c]

以上内容对应于.net2.0 和原文中有所不同.

5. 使用dd 0x**** 可以查看内存中的值

6. !DumpMT [-MD] <MethodTable address>
    显示位于某个地址的 method table的信息, 每个managed object都会有个method table
   
7. !DumpClass 显示class所有信息

8. !Dumpmodule

9. !Dumpobject
    对于一个static 变量,会显示domain 和 静态变量在domain中位置, 这些信息被>>和<<扩起.
   
    790fa3e0  4000099       10        System.String  0   shared   static Empty
    >> Domain:Value  0014f238:790d6584 <<

10.!DumpStackObjects 显示当前线程的堆栈上的所有对象.

May 26, 2006

使用SOS

Filed under: WinDbg&SOS

//—-SOS.dll 的位置
%windir%\Microsoft.NET\Framework\<version>\

Documnet
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\Samples\sos
.NET 2.0中这个目录不见了.

//—-让WinDbg加载SOS
当打开一个.net 可执行程序windbg6.5会自动加载SOS,如果需要手动加载,有如下方法

方法1:配置系统环境变量,让搜索路径指向系统.NET Framework的安装目录,既sos.dll所在目录
set PATH=%PATH%;C:\WINDOWS\Microsoft.NET\Framework\<Version>
然后使用.load SOS 加载

方法2. 加载某个特定的sos
.load <full path to sos.dll>

方法3.
.extpath command sets or displays the extension DLL search path.

方法4.
.loadby sos mscorwks
debugger 会加载模块mscorwks所在路径下的sos

方法5.
直接使用形如!DLLName.ExtensionCommand 的命令,如果扩展dll没有被加载,debugger会加载之.

在windbg6.5的安装目录下也有一个sos.dll
C:\Program Files\Debugging Tools for Windows\clr10
加载和使用方法如下:
.load clr10\sos
!clr10\sos.help

//—-相关命令

.load sos
加载SOS

.chain
list extensions dlls,以确认SOS是否正确加载

.setdll sos.dll 把SOS设置为default extension.

lm
查看有哪些模块被载入内存

//—–实验
用Windbg打开一个.net 可执行程序(ctrl+E), WinDbg会自动break到程序入口(如果attach到一个程序上,则
立即break),此时,mscorwks尚未被加载,如果在此时加载了SOS,SOS中的命令还无法使用.F5让程序继续运行,
这次WinDbg会自动break到,此时使用lm命令可以看到被加载的module,其中包含了mscorwks.dll,此时SOS中的命令
才可使用

参考
SOS: It’s Not Just an ABBA Song Anymore(John Robbins)
http://msdn.microsoft.com/msdnmag/issues/03/06/Bugslayer/

Mini Dump Snapshots and the New SOS(John Robbins)
http://msdn.microsoft.com/msdnmag/issues/05/03/Bugslayer/default.aspx

SOS Debugging of the CLR, Part 1
http://blogs.msdn.com/jasonz/archive/2003/10/21/53581.aspx

用WinDbg探索CLR世界
http://flier.cnblogs.com/archive/2004/07/08/22313.html

深入探索.NET框架内部了解CLR如何创建运行时对象
http://www.microsoft.com/china/MSDN/library/netFramework/netframework/JITCompiler.mspx?mfr=true

如何:使用 SOS
http://msdn2.microsoft.com/zh-cn/library/yy6d2sxs.aspx

SOS Debugging Extension (SOS.dll)
http://msdn2.microsoft.com/en-us/library/ms404370.aspx

May 22, 2006

Symbol File 的使用

Filed under: WinDbg&SOS

//–Symbol的分类
private : 包含最完整的调试信息,如变量,函数信息
retail  : 次之,不包含变量信息
export  : 用处不大

//–设置symbol path的3种方法
1. 设置_NT_SYMBOL_PATH环境变量(要在运行windbg前设置)
2. 使用菜单 File->Symbol File Path或通过快捷键 ctrl+s
3. 使用.sympath 命令

C:\WINDOWS\Symbols\dll;
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\symbols;
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\symbols;
SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbol
其中最重要的是:

SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbol

这一句会使Windbg在需要Symbol时检查C:\MyLocalSymbols路径,如果没有找到所需的Symbol,
Windbg会从http://msdl.microsoft.com/download/symbol把所需的Symbol下载到C:\MyLocalSymbols

注意:http://msdl.microsoft.com/download/symbols不能通过ie访问,只有MS的debug工具可以访问.

 

 

WinDbg官方资源

Filed under: WinDbg&SOS

http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx






















Get free blog up and running in minutes with Blogsome
Theme designed by Hadley Wickham