http://blog.csdn.net/garyye/article/details/4788070

 

在使用VS进行托管应用程序的调试的时候,有的时候总感觉有些力不从心。譬如查看一个托管堆或者计算堆栈的时候,VS就不能胜任了。这个时候,Windbg+SOS扩展调试模块就为我们提供了一个很好的解决方案。
我们看一段代码:
class Program
    {
        static void Main(string[] args)
        {
            Program b = new Program();
            b.test();
            System.Console.ReadLine();
        }

public void test()
        {
            int i = 67;
            System.Console.WriteLine((char)i);
            System.Console.WriteLine((char)67);
            i = 1;
        }
    }
这是C#里面的一个强制类型转换,我们现在用windbg+SOS来分析下计算堆栈,以及强制类型转换之后的JIT代码。
在windbg里面加载这个正在运行的程序,attach to this process,然后加载SOS扩展调试模块:
0:003> .load C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/SOS.dll
然后显示当前的线程:
0:003> ~
   0  Id: cf0.450 Suspend: 1 Teb: 7ffdf000 Unfrozen
   1  Id: cf0.be8 Suspend: 1 Teb: 7ffdd000 Unfrozen
   2  Id: cf0.168 Suspend: 1 Teb: 7ffdc000 Unfrozen
.  3  Id: cf0.7d0 Suspend: 1 Teb: 7ffde000 Unfrozen
切换到第0个线程:
0:003> ~0s
eax=0012f2e4 ebx=00000000 ecx=0012f400 edx=00000008 esi=0012f1f4 edi=00250688
eip=7c92eb94 esp=0012f194 ebp=0012f1b4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!KiFastSystemCallRet:
7c92eb94 c3              ret
显示test方法相关的地址:
0:000> !name2ee TestConcoleApp.exe TestConcoleApp.Program.test
Module: 00ab2c24 (TestConcoleApp.exe)
Token: 0x06000002
MethodDesc: 00ab2ff0
Name: TestConcoleApp.Program.test()
JITTED Code Address: 00d000f8
显示这个方法被C#编译器编译之后的IL代码:
0:000> !dumpil 00ab2ff0
ilAddr = 00402074
IL_0000: nop 
IL_0001: ldc.i4.s 67
IL_0003: stloc.0 
IL_0004: ldloc.0 
IL_0005: conv.u2 
IL_0006: call System.Console::WriteLine 
IL_000b: nop 
IL_000c: ldc.i4.s 67
IL_000e: call System.Console::WriteLine 
IL_0013: nop 
IL_0014: ldc.i4.1 
IL_0015: stloc.0 
IL_0016: ret

这里,sandwi对conv.u2这条指令一直困惑良多。我也对这个问题困惑了好久,翻阅了很多资料也没找到,后来准备在sscli的C#编译器里面找到答案,不过没找到地方......
后来被证实,这条指令是C#编译器为了类型安全,而生成的一条指令。作用在于把一个integer转换称为一个unsigned int16,然后前面补0成为int32压入堆栈里面去。
这是一个语言编译器行为,为了证实这个想法,同时写了一段同样的VB代码来证实我们的想法:
Module Module1

Sub Main()
        Dim i As Integer

i = 67
        System.Console.WriteLine(Chr(i))
        System.Console.WriteLine(Chr(67))
        System.Console.ReadLine()

End Sub
   
End Module
编译之后的IL代码也同样支持上面的想法。
这里,感谢微软的张翼证实了我关于conv.u2的存在原因的猜想。但是,zhangyi说在test方法中的conv.u2指令在JIT生成的本地代码中被优化掉了,我却不同意这种看法:
0:000> !u 00d000f8
这条指令,是显示JIT编译了的test方法的本地代码,根据
JITTED Code Address: 00d000f8
这一行得来的。显示结果如下:
Normal JIT generated code
TestConcoleApp.Program.test()

push          esi
push          eax
mov          dword ptr [esp],ecx
cmp          dword ptr ds:[0AB2DD8h],0
je              00d0010b  (跳到xor  esi,esi这里)
call            mscorwks!CorLaunchApplication+0x108b4 (7a08e179) 
xor            esi,esi
nop
mov           esi,43h
movzx       ecx,si
call            mscorlib_ni+0x2f8b9c (793b8b9c) (System.Console.WriteLine(Char), mdToken: 06000759)
nop
mov           ecx,43h
call            mscorlib_ni+0x2f8b9c (793b8b9c) (System.Console.WriteLine(Char), mdToken: 06000759)
nop
mov           esi,1
pop            ecx
pop            esi
ret
这里,movzx   ecx,si这条指令就对应了IL代码里面的Conv.u2,把对应的int前面补0放入到ecx寄存器里面去。

后记:关于动态调试托管代码,我也是刚接触不久,上面有不准确的地方,欢迎大家多多指正

转载于:https://www.cnblogs.com/zengkefu/p/6938186.html

CLR探索系列:Windbg+SOS动态调试分析托管代码相关推荐

  1. CLR探索系列:托管PE/COFF文件格式侧窥

    一直都想写篇文章来说说那些尘封在PE/Coff文件格式下的那些事,还有Metadata和EEClass是如何表现了一个静态的PE格式文件在内存中的映射结构.    在这篇文章里,我不去介绍window ...

  2. [系统安全] 二十三.逆向分析之OllyDbg动态调试复习及TraceMe案例分析

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. WinDbg+SOS:Web服务器High CPU Hang(100%)实例分析

    下午,msn上面一个朋友发了一个dump文件过来,说是Web服务器的CPU使用率在100%,找不到问题在什么地方,让帮忙看看,遂让把dump文件传过来,找找问题出在哪儿. Framework2.0,W ...

  4. windbg + sos 调试w3wp进程内存崩溃问题

    windbg + sos 调试w3wp进程内存崩溃问题 1.加载符合文件 C:\symbols;SRV*C:\symbols*http://msdl.microsoft.com/download/sy ...

  5. Android微信动态调试,Android远程调试的探索与实现

    作为移动开发者,最头疼的莫过于遇到产品上线以后出现了Bug,但是本地开发环境又无法复现的情况.常见的调查线上棘手问题方式大概如下:方法优点缺点联系用户安装已添加测试日志的APK方便定位问题需要用户积极 ...

  6. 路由器逆向分析------路由器固件分析和动态调试环境搭建简述

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/70140865 01.路由器固件分析和动态调试环境搭建简述的原文 <Emula ...

  7. Android逆向之旅---Android中分析抖音和火山小视频的数据请求加密协议(IDA动态调试SO)

    一.前言 最近萌发了一个做app的念头,大致什么样的app先暂时不说,后面会详细介绍这个app的开发流程和架构,不过先要解决一些技术前提问题,技术问题就是需要分析解密当前短视频四小龙:抖音,火山,秒拍 ...

  8. 安卓逆向分析中常用动态调试方法总结

    安卓逆向之----常用动态调试方法 一. 前言 逆向分析中常用的分析方法有:静态分析.动态调试.HOOK等.动态调试的好处是:1)可以在调试的过程中知道参数或者局部变量的值以及变化过程,2)可以快速履 ...

  9. 自然语言处理NLP星空智能对话机器人系列:业界动态信息分享 京东零售数据智能探索实践沙龙

    自然语言处理NLP星空智能对话机器人系列:业界动态信息分享 京东零售数据智能探索实践沙龙 目录 京东客服全链路数智化的应用实践 京东智能商客之推荐卖点的技术介绍 星空智能对话机器人系列博客 京东客服全 ...

最新文章

  1. 一文告诉你Adam、AdamW、Amsgrad区别和联系 重点
  2. 图像分析用 OpenCV 与 Skimage,哪一个更好?
  3. RDKit | 基于RDKit和Python的阿斯利康ADME数据集分析
  4. Xml 格式数据的生成和解析
  5. 什么叫pmt测试分析_直读分析光谱仪核心配件
  6. 利用规划图提高经典人工智能规划复杂度
  7. 到底哪种类型的错误信息会阻止business transaction的保存
  8. arccatalog点要素显示不完_如果你读不完显示屏说明书,至少读完这几句话吧
  9. BZOJ1179 Atm //缩点+spfa
  10. 光源时间_D65光源对色灯箱的操作步骤及作业标准
  11. python识别pdf文字_Python 神工具包!翻译、文字识别、语音转文字统统搞定
  12. thymeleaf中的th:remove用法
  13. springboot之@Async实现异步
  14. TEM:基于树模型构建可解释性推荐系统
  15. 计算机房的标准和规定,机房建设标准和规范.doc
  16. Laravel第二章
  17. mysql char archer_mysql - 常用sql
  18. 微信中打开app store连接
  19. 我的2019年终总结
  20. 熵值法的Python实现

热门文章

  1. 手把手带你入门 Spring Security!
  2. 2018-2019-1 20165337 《信息安全系统设计基础》第一周学习总结
  3. 项目开发环境(h5+pc的开发思路是一样的)
  4. MongoDB windows解压缩版安装
  5. Linq to SQL 中实现模糊查询
  6. cordova 学习笔记
  7. [转]C#中的委托和事件(续)
  8. 创建XNA Shooter游戏——挑战:用引擎编写自己的游戏
  9. 密码强弱度检测万能插件
  10. jchdl - GSL Port