利用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

利用CLR20R3信息将IL转储映射回源代码

leave.s IL_0055没有对调用方法的引用。P7值表明错误发生在IBM.WMQ.MQTCPConnection.SendData中,因此您需要在那里查找(而不是在调用它的方法中)。

由于P87d,因此您应该在IBM.WMQ.MQTCPConnection.SendData中查看IL_007d—与从.

中获取第二个代码片段的方法相同。

P7是指发生异常的方法的方法标记。因此,崩溃发生在IBM.WMQ.MQTCPConnection::SendData中,因为显然,这是与4DD令牌对应的方法。您发现的只是对该方法的调用(可能与问题无关),而不是方法本身。

要验证这一点,您可以在ILDASM中打开程序集并单击View->MetaInfo->Show!搜索060004DD,元数据中会出现类似Method #123 (060004DD)的内容。该方法是该应用域中第一个发现异常的方法。

P8是该方法中对出错指令的偏移量。