小编Dan*_*ler的帖子

使用.NET的ICorProfilerInfo::SetILFunctionBody,是否可以向没有任何异常处理的方法添加try-finally EH子句?

我正在开发一个 IL 重写分析器,我的目标是能够向方法添加 try-finally 块。本质上:

// IL to set some state 
try {
   // original IL 
} finally { 
   // IL to revert state
}
Run Code Online (Sandbox Code Playgroud)

根据分析 API ( https://msdn.microsoft.com/en-us/library/ms232096.aspx ) 的有限文档和信息,似乎应该能够使用 SetILFunctionBody 添加新的异常处理子句。

我一直在关注来自http://clrprofiler.codeplex.com/SourceControl/list/changesets?branch=master的 Microsoft 示例 ILRewrite 探查器。我添加了代码以将“EHCLause”添加到“ILRewriter”类维护的 EHCLause 列表中,并添加了适当的 left.s 和 endfinally IL 指令。从探查器的角度来看,一切似乎都正常(SetILFunctionBody 成功),但是当调用修改后的方法时,我们会收到可怕的“公共语言运行时检测到无效程序”。例外,没有进一步的信息。

我尝试过的事情:

  • 检查了仪器,代码没有在保护区内做非法的事情(例如返回或分支到外部)。
  • 如果我删除 EHCLause 和 left.s/endfinally 指令,则仪表化方法运行良好。
  • 我在 ILRewriting 代码中添加了大量日志记录,以在末尾转储修改后的 IL、EH 信息和字节。我使用所需的 try-finally 和状态跟踪代码制作了类似的方法,并且两种方法(检测与编译)的 IL 是相同的。然而,实际的“导出”字节有很大不同。

这让我相信分析 API 可能不支持向没有任何异常处理子句的方法添加新的异常处理子句。我很想听听您的其他想法以及如何解决此问题的任何想法。


以下是来自日志记录的一些信息 - * 是原始 IL。

EXPORTING IL:
Offset IL   notes
0   0x28    call EnterScope …
Run Code Online (Sandbox Code Playgroud)

.net c# profiler clr-profiling-api

5
推荐指数
1
解决办法
464
查看次数

标签 统计

.net ×1

c# ×1

clr-profiling-api ×1

profiler ×1