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

news/2024/5/17 15:14:46

在使用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
转载请注明出处

 



http://www.niftyadmin.cn/n/3658088.html

相关文章

调MURA数据集keras CNN模型笔记

永远不要再把sigmoid写错成softmaxcnn层最后加三个fc层比加1个效果要好得多如果参数太多,可以在最后一个cnn层后面加一个maxpooling整个图要记得指定data_format“channel_first",此时batch_norm层要指定axis120w参数的模型在GTX1050上用 tf2 勉强能…

.NET / Rotor源码分析5 - 开始使用WinDbg+SOS调试,sscoree.dll,加载SOS并设置JIT断点

准备工作在经过一番准备之后,现在我们可以开始正式使用WinDbgSOS来调试托管代码了。如果你没有看过前两篇文章,那么请先阅读这两篇文章以对WinDbgSOS有一个大致的了解。这两篇文章的链接在这里:.NET Rotor源码研究4 – 修改Rotor使其发送CLR …

服务器gpu_v100跑X-Chest-Ray 14笔记

显存估计:每张卡16G的显存,一共4张,跑32的batch size,3*1024*1024的输入,densenet161,改classifier为14分类并sigmoid输出(多标签),导致显存不足,所以改成den…

Visual Studio中的Class Designer设计工具需要您的建议!

帮同事Post一下相关调查,有兴趣的朋友可以参加一下,谈谈自己对Class Designer工具的看法 大家好,Class Designer是Visual Studio里的一个工具,可以将类之间的结构关系可视化、支持开发人员对类进行视觉化的设计和重构。它充分利用…

使用WinDbg对Windows Live Toolbar死锁的简单分析

我一直在用Windows Live Toolbar中的Live Favorites来同步我的书签信息,但是速度总是很慢,甚至完全死掉。今天闲来无事,刚看到Mark的一篇Blog http://blogs.technet.com/markrussinovich/archive/2006/08/31/453100.aspx,对于他不…

week2课堂笔记

搜索技巧: 必应国际版在谷歌用不了的时候用知乎好过百度快照功能 表示一定包含,-表示剔除,要加个空格“ ”内的内容表示不可拆分*表示通配符,表示不确定内容,模糊搜索,比如how * you, 或者吴*豪…

Windows Vista真的只是加了新界面吗?

经常看到很多朋友认为Windows Vista的改变主要是在界面上的。事实是,界面可能确实是Vista对普通用户最为有吸引力的一大方面,也是宣传最多的,但是事实上,Windows Vista还有着非常之多的重大改进:比如内核级别的改变有&…

数电学习笔记(2)

TTL逻辑器件分成54系列和74系列两大类,其电路结构、逻辑功能和 电气参数完全相同。不同的是54系列工作环境温度、电源工作范围比 74系列的宽。74系列工作环境温度为00C~ 700C,电源电压工作范围为 5V5%;而54系列工作环境温度为-550…