调试.net编译器

Orv*_*ing 5 .net compiler-construction debugging

我正在研究一种语言(外部字节码)的编译器,并且正在使用System.Reflection.Emit.

现在,当我在反射器中打开生成的程序集时,一切看起来都很好,并且它重新编译为C#也很好(并运行),但是当我尝试运行生成的main函数时,我得到一个InvalidProgramException:

"Common Language Runtime检测到无效程序."

它可能只是导致问题的单个操作码,但是,因为主要功能使用100多个操作码,我无法确定导致问题的操作码.

每个操作码都非常复杂,因此手动测试每个操作码是不行的.

有没有办法让.NET告诉我它在函数中检测到无效程序的位置?

如果没有,是否还有其他工具可用于确定问题的根源?

Han*_*ant 10

我最好把它写成答案.您可以使用PEVerify工具执行装配验证.它是Windows SDK工具的一部分,运行它的最佳方式是从Visual Studio命令提示符,peverify.exe命令.您需要使用/ il命令行选项运行它以检查您生成的IL,/ md以验证程序集元数据.

您将从此工具中获得更好的诊断,抖动生成的运行时异常有点过于无法确定错误.我不能保证它执行的确切相同的检查作为抖动,这些都是代码的不同块和抖动有一点在静态分析的边缘.然而,该工具专为您的用例而设计,即编写IL生成器的人员.我将引用MSDN文章中的承诺:

Peverify.exe基于数据流分析以及有效元数据上的数百条规则列表执行全面的MSIL验证检查.有关Peverify.exe执行的检查的详细信息,请参阅Windows软件开发工具包(SDK)中"工具开发人员指南"文件夹中的"元数据验证规范"和"MSIL指令集规范".

原来它适合你,这很酷:)