`
happmaoo
  • 浏览: 4431440 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

.NET / Rotor源码研究3 – 调试Rotor托管代码的利器:WinDbg和SOS

阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>

WinDbg+SOS简介

在动手进一步研究Rotor之前,我们需要首先解决一个问题:用什么调试工具最好? 很有可能你会说,这还不简单,直接用Visual Studio不就好了?一般情况下是的,只不过,在这个情况下,Visual Studio并非是最好的选择:

1. CLR对代码的编译是动态进行的(其实还有可能是静态的,称之为Prejit或者NGEN,不过可惜Rotor对此不支持),也就是说常规的设置断点的方法并不适用,因为可能这个时候对应的本地代码还没有生成呢

2. CLR是一个复杂的运行时环境/虚拟机。有些时候我们需要获得CLR的一些相关信息,而这个时候Visual Studio就显得功能不够强大

你可能会说,那为什么VS可以调试托管代码呢?确实,VS是可以调试托管代码,但是注意我们是调试CLR本身,这个时候VS本身的对托管代码的调试功能会造成不少麻烦,得到一些你所不希望的结果。此外,由于我们是在调试Rotor,这个时候不能直接运行托管代码,而是要在CLIX的支持下运行,这也使得VS的托管代码调试功能无效。

这个时候,相对而言较好的工具是WinDbg+SOS的组合。

WinDbg是微软提供的Windows下面的免费调试器,具有下面特点:

1. 支持用户模式和内核模式下的调试

2. 支持GUI(虽然看起来是废话,不过WinDbg也有所谓命令行版本NTSD/CDB/KD,相对于这几个调试器而言WinDbg算是很友好的了)

3. 支持远程调试

4. 支持符号服务器和源代码服务器

5. 支持源代码级别的调试(不支持也不用出来混了,呵呵)

6. 非常轻量级,完整地版本仅数十兆(相对于VS而言),如果只需要调试器本身,还可以更小

7. 支持对Dump文件的调试

8. 可扩展

WinDbg可以在下面的地址下载:

32位版本:http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

64位版本:http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx

SOS全称是Son of Strike(别问我为什么,我也不知道,这个要问Larry了),是一个WinDbgExtension,加载之后可以给WinDbg提供一些对托管代码调试的命令。值得一提的是,WinDbg也有有限的对托管代码的支持,只不过功能非常有限,需要SOS的帮助。

SOS.NET Framework中和Rotor中均有提供,所以本文中对于WinDbgSOS的描述基本上适用于Rotor和发行版的.NET Framework(而且有可能也将适用于Silverlight)。比如.NET Framework 2.0中的SOSC:\Windows\Microsoft .NET\v2.0.50727下面,而RotorSOS.dll则是在binaries.<flavor>.rotor</flavor>目录下面(flavorBuild的配置,如CPUDebug/Release,等等)。

SOS可以做到:

1. 输出对象的内容

2. 察看CLR的数据结构

3. 察看代码和堆栈

4. 显示各种历史信息

5. 提供各种诊断信息

SOS有如下限制:

1. 不可以在mscorwks加载之前被使用

2. 无法察看局部对象的名称

3. 以及很多其他的功能

SOS使用方法如下:

1. 使用.loadby / .load 命令加载。但是Rotor下面SOS由于对VC Runtime的依赖会发生Side By Side相关的问题导致无法找到MSVCR80.dll或者MSVCR80D.dll。解决方法在文章最后会提到

2. !help命令可以提供所有命令的列表

3. !help faq显示SOS使用的方法

4. !help <command></command>显示具体Command的帮助

WinDbg+SOS的优势在于:

1. WinDbg的本地代码(非托管代码)调试功能非常强,甚至比VS还强大,只是需要一些时间习惯

2. SOS是调试托管代码必须的,提供一些基本功能如设置对托管代码的断点,显示变量和Stack,等等

3. SOS可以用来查询对CLR内部的状态,如GCHeapMethodTableMethodDescModuleAssembly等等各种信息,对于除错和诊断非常有用

如何解决Rotor中的SOS.dll命令无法加载的问题

由于SOS是在WinDbg进程中加载,而WinDbgManifest中并没有VC Runtime调试版的DLLSide By Side信息,所以加载会失败。解决方法有下面的两种:

1. Copy相应的的DLLWinDbg目录或者到Rotor的目录下面。我的VS2005编译出来的SOS.dll依赖于8.0.50727.762版本的MSVCR80D.dll,因此可以在C:\windows\WinSxS\x86_microsoft.vc80.debugcrt_1fc8b3b9a1e18e3b_8.0 .50727.762_none_24c8a196583ff03b目录下面找到。

2. 也可以从WinDbgManifest入手解决这个问题。既然WinDbgManifest没有MSVCR80D的相关信息,我们可以手动替WinDbg加上一个,步骤如下:

首先使用mt.exeWinDbgManifest提取出来,这个Manifest是在WinDbg.exe中作为资源存在的,其ID1。先打开VS 2005的命令提示符(否则找不到mt),进入WinDbg所在目录,输入:

mt.exe -inputresource:windbg.exe;#1 -out:extracted.manifest

获得了WinDbgManifest之后,打开extracted.manifest可以看到下面内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestversion="1.0"><p></p></assembly>

<assemblyidentity name="Microsoft.Windows.SdkTools.windbg" processorarchitecture="x86" version="6.7.0.0" type="win32"></assemblyidentity>

<description>Windows GUI symbolic debugger</description>

<dependency><p></p></dependency>

<dependentassembly><p></p></dependentassembly>

<assemblyidentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorarchitecture="*" publickeytoken="6595b64144ccf1df" language="*"></assemblyidentity>

可以看到里面并没有对于MSVCR80D.dll的信息,我们可以自己动手加上去:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestversion="1.0"><p></p></assembly>

<assemblyidentity name="Microsoft.Windows.SdkTools.windbg" processorarchitecture="x86" version="6.7.0.0" type="win32"></assemblyidentity>

<description>Windows GUI symbolic debugger</description>

<dependency><p></p></dependency>

<dependentassembly><p></p></dependentassembly>

<assemblyidentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorarchitecture="*" publickeytoken="6595b64144ccf1df" language="*"></assemblyidentity>

<dependency><p></p></dependency>

<dependentassembly><p></p></dependentassembly>

<assemblyidentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.762" processorarchitecture="x86" publickeytoken="1fc8b3b9a1e18e3b"></assemblyidentity>

其中深红色的为添加的内容,意思是该EXE依赖于Microsoft.VC80.DebugCRT这个DLLversion 8.0.50727.762architecturex86public key token1fc8b3b9a1e8e3bWindows会自动根据这个信息找到对应的MSVCR80D.dll

下面我们可以动手修改WinDbg了,建议动手之前WinDbg之前请先备份WinDbg。准备好了之后键入:

mt.exe -manifest extracted.manifest -outputresource:windbg.exe;#1

这个命令会将Manifest作为资源重新添加到WinDbg.exe,覆盖原来的Manifest,至此WinDbg已经被我们修改了。验证一下,用WinDbg打开CLIX.exe进行调试,然后键入如下命令:

.loadby sos sscoree

没有看到任何输出,说明加载成功。再输入

!help

SOS会输出所有命令的列表。

后记

经过修改之后,SOS可以被正常加载了。很遗憾的是,在我后续的对Rotor的实验中,发现Rotor的代码中对SOSBPMD命令和CLR notification支持存在问题,而BPMD命令正好是SOS的最重要功能之一:设置断点。在我的下一篇文章中,会讲到问题的具体情况以及如何修改Rotor代码来支持CLR NotificationSOSBPMD命令。在修改了Rotor代码使SOS正常工作之后,再下一篇文章则会以跟踪一个简单的HelloWorld的托管代码程序来揭示Rotor的基本运行机制和原理,敬请关注。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1606151


分享到:
评论

相关推荐

    sscli_Shared Source CLI 2.0 (开发代号Rotor)

    Rotor的代码可以在非商业行为的前提下可以自由修改和发布,只需保留License声明即可。Rotor包含了下面的内容: 1. CLI的运行时(CLR)的符合ECMA标准的实现 2. C# & Jscript编译器 3. .NET Framework中的部分工具,如...

    应用Samcef/Rotor计算转子-轴承系统非线性动力学响应与稳定性

    应用Samcef/Rotor计算转子-轴承系统非线性动力学响应与稳定性,刘承前,曹树谦,应用Samcef/Rotor有限元分析软件,对两种转子-滑动轴承系统进行了非线性动力学响应和稳定性计算。通过分析计算出的分岔图、Poincaré...

    .NET核心源代码

    含有大部分.net核心类库的源代码 ...在这个名为rotor的包中,含有大部分.net核心类库的源代码,但是不包括ado.net、winform、webform,另外vb.net和managed c++也没有包含在其中。不过像是socket、xml等都包含在里面。

    rotor37_CFD_rotor37_rotor37网格划分_MeshCase_NASARotor37_

    本资源“rotor37_CFD_rotor37_rotor37网格划分_MeshCase_NASARotor37_”提供了一个专门针对rotor37问题的网格案例,适用于CFD初学者进行学习和交流。 rotor37是一个经典的风力涡轮机叶片研究案例,源自NASA...

    .net学习网站总结

    SourceForge是一个开放源代码项目托管平台,不仅包含.NET相关的开源项目,如SharpDevelop、NDoc和Mono等,还提供了大量的开源软件资源,对于.NET开发者来说,这是一个不可多得的宝藏。 ### 4. CodeProject ...

    c# 学 习 网 址

    10. **微软.NET Winform**(http://www.windowsforms.net/):专门针对.NET Winform开发者的资源站点。 11. **微软KnowledgeBase**(http://support.microsoft.com/):微软的技术支持库,解决开发过程中的疑难问题...

    Rotor37.rar

    标题中的"Rotor37.rar"指的是一个RAR格式的压缩文件,通常用于打包并压缩多个相关文件,便于存储和传输。RAR是一种高效的压缩算法,由尤里·扎哈罗夫开发,它提供了比ZIP更高的压缩率,并支持恢复记录,可以在文件...

    NASA_Rotor_67_Blade_data

    总的来说,NASA_Rotor_67_Blade_data 提供了一个研究和学习旋翼叶片设计的重要资源,对于航空工程的学生、研究人员和工程师来说,它提供了深入理解旋翼空气动力学、优化设计和验证计算方法的宝贵素材。然而,由于...

    Numerical analysis of nonlinear rotor–seal system

    The nonlinear model of the rotor–seal system is established using Muszynska’s nonlinear seal forces. An efficient and high-precision direct integration scheme is presented based on the 2N type ...

    rotor-modal-analysis_rotor_悬臂梁模态分析_轴承_模态分析_轴承分析_源码.zip

    《悬臂梁模态分析与轴承模态分析的...通过对"rotor-modal-analysis_rotor_悬臂梁模态分析_轴承_模态分析_轴承分析_源码.zip"的深入研究,我们可以更好地理解结构的动力响应,预防振动问题,提高设备的可靠性和效率。

    TRMS.rar_TRMS_Twin rotor mimo_rotor_twin rotor_wind simulator

    【TRMS.rar_TRMS_Twin rotor mimo_rotor_twin rotor_wind simulator】是一个与风力模拟和多轴旋翼系统相关的压缩包文件。这个文件很可能包含了一套名为"Twin Rotor MIMO System"(双旋翼多输入多输出系统)的相关...

    rotor37.geomTurbo

    rotor37的几何模型文件

    NASA rotor37网格

    ROTOR37的numeca网格,格式为igg,带叶顶间隙,另外还有geomturbo文件

    开发人员一定要加入收藏夹的网站收藏

    19. **blog.csdn.net/group/experts** - CSDN专家群,集结了众多领域专家的博客和文章。 20. **codeproject.com** - 提供丰富的示例代码和深入的教程,覆盖各种编程语言和技术。 21. **gotdotnet.com** - 微软维护...

    rotor37网格文件和算例

    rotor37网格文件和算例

    开发人员喜欢的网站

    - **内容介绍**:提供了.NET Framework的源代码,对于深入研究.NET技术非常有用。 - **特点**: - 可以查看.NET Framework的核心实现细节。 - 有助于提高对.NET技术的理解和应用水平。 #### 10. **DoFactory ...

    HOPF BIFURCATION ANALYSIS OF A ROTOR/SEAL SYSTEM

    The Hopf bifurcation behaviour of a symmetric rotor/seal system was investigated using Muszynska's non-linear seal fluid dynamic force model.

    SAMCEF ROTOR 理论手册

    SAMCEF ROTOR是一款专为旋转系统设计的分析工具,广泛应用于旋转机械的设计与分析,帮助工程师和研究人员理解和预测旋转设备在各种工作条件下的动态行为。手册内容详尽,涵盖了旋转系统动力学分析的各个方面,包括...

    Rotor software 说明文档

    文档提到的“Rotor software”是一套用MATLAB编写的脚本程序,其设计初衷是为了配合《Dynamics of rotating machines》这本书的阅读和理解。这些脚本的主要用途是说明书中描述的旋转机器的特性,尤其是基于轴线模型...

    rotor37的geomturbo文件

    NUMECA AUTOblade读取的rotor37文件,希望初学者有用!!

Global site tag (gtag.js) - Google Analytics