.NET / Rotor源码分析4 - 修改Rotor使其发送CLR Notification

news/2024/12/12 16:21:20

在使用WinDbg + SOS正式跟踪Rotor的源代码研究.NET的实现之前,还有个问题需要解决:Rotor缺省并不会发出CLR NotificationCLR Notification是指CLR在运行的时候发出的一些通知,比如加载模块,代码被编译等等,这些通知对于调试Rotor / .NET以及SOS都非常重要。例如你可以设置调试器为一遇到CLR Notification便中断,在某些情况下非常有用。还有就是SOS的部分命令如BPMD等依赖于CLR notification实现其部分功能。因此这个问题必须得解决。

CLR Notifcation本质上其实就是一个SEH (Structured Exception Handling)异常。同时VC的异常以及CLR本身的托管异常也是SEH异常,只是他们的Exception Code不同和参数不同而已。CLR通过调用RaiseException函数产生Exception Code = CLR Notification的异常,这个异常并不会导致程序非正常退出,而是仅仅对调试器起到一个通知作用,CLR本身在异常处理代码中会自动处理掉这个异常。

Rotor通过间接调用DACNotificationHelper来产生CLR Notification,如下:

void DACNotifyExceptionHelper(TADDR *args,UINT argCount)

{

    PAL_TRY

    { 

        if (IsDebuggerPresent() && !CORDebuggerAttached())

        {

            RaiseException(CLRDATA_NOTIFY_EXCEPTION, 0, argCount, (ULONG_PTR *) args);

        }

    }

    PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER)

    {       

    }

    PAL_ENDTRY

}

可以看到Rotor调用RaiseException产生代码为CLRDATA_NOTIFICATION_EXCEPTIONSEH异常,也就是CLR Notification,这个异常将被后面的PAL_EXCEPT块(类似__except)处理,不作任何事情,直接“吞掉”异常。启动调试器跟踪一下发现在if语句时候并没有对IsDebuggerPresent() API进行调用,这个函数的作用是检查进程是否被正在被调试器所调试,只有在调试器挂接上此进程并且CLR调试器没有挂接上的时候才会发生此种Notification。进一步观察汇编:

xor    eax, eax

test    eax,eax

je      mscorwks!DACNotifyExceptionHelper+0x89发现这里没有调用API而直接对eax赋值为0,然后加以判断,提示IsDebuggerPresent可能被定义成FALSE。在命令行下面输入:

D:/usr/src/sscli20>findstr /s "IsDebuggerPresent" *.c *.cpp *.h

binaries.x86dbg.rotor/sdk/pal/inc/rotor_palrt.h:#define IsDebuggerPresent() FALSE

clr/src/debug/ee/debugger.cpp:        if (IsDebuggerPresent() && !g_pRCThread->G

etDCB(iWhich)->m_rightSideIsWin32Debugger)

clr/src/utilcode/debug.cpp:            t_pDbgPres pFcn = (t_pDbgPres) GetProcAdd

ress(hKrnl32, "IsDebuggerPresent");

clr/src/vm/eeconfig.h:            if (IsDebuggerPresent()) DebugBreak();

              /

clr/src/vm/i386/gmsx86.cpp:                if (IsDebuggerPresent())

clr/src/vm/pefile.cpp:    BOOL fOutputToDebugger = (level == LL_ERROR && IsDebug

gerPresent());

clr/src/vm/stubmgr.cpp:    if (IsDebuggerPresent())

clr/src/vm/util.cpp:        if (IsDebuggerPresent() && !CORDebuggerAttached())

palrt/inc/rotor_palrt.h:#define IsDebuggerPresent() FALSE

发现果然IsDebuggerPresent被定义为FALSE,看来是Rotor将其禁止掉了。因为我们这里目的是对.NET / Rotor进行研究,不太在意程序的性能,因此这里只需要将这里的IsDebuggerPresent定义成TRUE重新编译即可。

修改之后重新编译,启动Windbg调试clix,运行一个托管代码程序,可以在调试器中发现类似下面的输出:

(1464.c88): CLR notification exception - code e0444143 (first chance)

First chance exceptions are reported before any exception handling.

This exception may be expected and handled.

可以看到CLR Notification已经被Windbg接收到了,之后,如果想当每一个CLR Notifcation到来的时候让调试器中断,只需输入:

sxe clrn

Clrn代表CLR Notification所对应的Exception Code,预定义在WinDbg内部。

OK,至此我们的准备工作完成,下一篇文章我们将正式使用WinDbg+SOS来调试一个托管程序在CLR中的运行过程。

 

作者:      张羿/ATField
Blog:     
http://blog.csdn.net/atfield
转载请注明出处

 



https://dhexx.cn/news/show-3785814.html

相关文章

马云100%信任的CEO,却说大公司要做小,原来是这意思!

"我知道阿里巴巴这样的公司管起来不容易,我100%相信张勇将会比我做得更好!" 刚刚,马云在阿里巴巴全球投资者大会上,用这么一句话评价了现任CEO张勇,把接近尾声的大会再次推向了高潮! "100…

mycat入门—安装

2019独角兽企业重金招聘Python工程师标准>>> 1、mycat简介: 一个彻底开源的,面向企业应用开发的大数据库集群支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群一个融合…

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

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

java架构-Java 判断字符串中是否包含中文

Java判断一个字符串是否有中文是利用Unicode编码来判断,因为中文的编码区间为:0x4e00--0x9fbb, 不过通用区间来判断中文也不非常精确,因为有些中文的标点符号利用区间判断会得到错误的结果。而且利用区间判断中文效率也并不高&…

铁路民警拍摄记录农村30年 农村淘宝承包其全家全年口粮

“天哪!这么多,这真的一年估计都吃不完” 尽管早有心理准备,但当王宏旻面对农村淘宝送的整整1200斤大米时,仍不禁感叹。 农村淘宝推出共享丰收喜悦“随手拍丰收”活动。一周时间内全国32个省市区上万名网友参与,随手拍…

手动生成C#的COM包装类的常见问题和解决办法

看一下如下代码:[Guid("25088995-7924-4B15-B01A-EA7C422ADC68")]public class CHelloClass : IHello{[DispId(1)][MethodImplAttribute(MethodImplOptions.InternalCall, MethodCodeTypeMethodCodeType.Runtime)]public extern void HelloWorld();}class…

丰收节拍丰收中奖 农村淘宝给一家全年管饭

“天哪!这么多,这真的一年估计都吃不完” 尽管早有心理准备,但当王宏旻面对农村淘宝送的整整1200斤大米时,仍不禁感叹。 农村淘宝推出共享丰收喜悦“随手拍丰收”活动。一周时间内全国32个省市区上万名网友参与,随手拍…

阿里CEO张勇:不存在阿里巴巴模式,我们一直在高速演进

双节期间,马云在联合国"加班",阿里CEO张勇也没闲着。 昨天,即将于明年接任阿里巴巴集团董事局主席的张勇,参加了2018安永全球新晋合伙人大会,并发表了精彩的演说,"不存在阿里巴巴模式&…

Visual Studio 2005的JIT Debugger在Vista上面无法正常工作

Visual Studio 2005的Jit Debugger在Vista上不工作,即使你打了SP1和Update for Windows Vista也不行。修改Jit Debugger使其工作在Vista上需要大量的修改,因此这个工作被移到Visual Studio Code Name Orcas,也就是2007中去了。不过不排除微软…

抛砖引玉 【镜像控件】 WPF实现毛玻璃控件不要太简单

原文:抛砖引玉 【镜像控件】 WPF实现毛玻璃控件不要太简单版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Vblegend_2013/article/details/83447420 源码已封装成 MirrorGrid类 可以直接在XAML里添加 根据需要可以把Grid 改…