利用CLR20R3信息将IL转储映射回源代码
本文关键字:映射 源代码 转储 IL CLR20R3 信息 利用 | 更新日期: 2023-09-27 18:06:55
我在运行的ASP中得到CLR20R3
错误。网络应用程序。我知道最终我需要捕获这个错误——很明显——但这是我在PROD中解决这个问题后要进行的维护任务。我不能直接进入维护任务的原因是,要在所有较低的环境中测试和批准这些更改,然后最终进入PROD,这将花费大量的工作和时间。
错误说明P7
值是4dd
,因此在从违规程序集(不是我的程序集)获得IL转储后,我找到了该代码。我还在方法标记后面显示了几行因为我认为这些引用了被调用方法中的违规行:
IL_0040: callvirt instance int32 IBM.WMQ.MQTCPConnection/*02000072*/::SendData(uint8[],
int32,
int32) /* 060004DD */
IL_0045: stloc.0
IL_0046: leave.s IL_0055
现在,记住这一点,这是一个很好的切入问题的过渡,因为我正试图将其映射回问题程序集的反编译代码。
IL_0046: leave.s IL_0055
行是指被调用方法中失败的行吗?
因为如果是这样,下面就是匹配的行,以及前面一些似乎相关的代码:
IL_0044: callvirt instance int32 [System/*23000002*/]System.Net.Sockets.Socket/*0100000E*/::Send(uint8[],
int32,
int32,
valuetype [System/*23000002*/]System.Net.Sockets.SocketFlags/*01000060*/) /* 0A0000F9 */
IL_0049: stloc.0
IL_004a: ldarg.0
IL_004b: ldc.i4 0x92
IL_0050: ldstr "Send returned " /* 700028D5 */
IL_0055: ldloc.0
但是,我有一点麻烦证明这是指什么,因为汉斯在这篇文章中说,P8
的值是偏移量,或违规行,这不会与例外。异常表示P8
的值为7d
。
leave.s IL_0055
没有对调用方法的引用。P7
值表明错误发生在IBM.WMQ.MQTCPConnection.SendData
中,因此您需要在那里查找(而不是在调用它的方法中)。
由于P8
是7d
,因此您应该在IBM.WMQ.MQTCPConnection.SendData
中查看IL_007d
—与从.
P7是指发生异常的方法的方法标记。因此,崩溃发生在IBM.WMQ.MQTCPConnection::SendData
中,因为显然,这是与4DD令牌对应的方法。您发现的只是对该方法的调用(可能与问题无关),而不是方法本身。
要验证这一点,您可以在ILDASM中打开程序集并单击View->MetaInfo->Show!搜索060004DD
,元数据中会出现类似Method #123 (060004DD)
的内容。该方法是该应用域中第一个发现异常的方法。
P8是该方法中对出错指令的偏移量。