gpt4 book ai didi

.net - 调试 .net 编译器

转载 作者:行者123 更新时间:2023-12-03 05:11:31 25 4
gpt4 key购买 nike

我目前正在开发一种语言(外部字节码)的编译器,并使用System.Reflection.Emit

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

"Common Language Runtime detected an invalid program."

可能只是一个操作码导致了问题,但是,由于该 main 函数使用了 100 多个操作码,因此我无法确定是哪个操作码导致了问题。

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

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

如果没有,我可以使用其他工具来确定问题的根源吗?

最佳答案

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

您将从该工具中获得更好的诊断,抖动生成的运行时异常信息量太少,无法查明确切的错误。我不能保证它执行与抖动完全相同的检查,这些是不同的代码块,并且抖动比静态分析有一点优势。然而,该工具是专门为您的用例(编写 IL 生成器的人员)设计的。我只是引用 MSDN 文章中的 promise :

Peverify.exe performs comprehensive MSIL verification checks based on dataflow analysis plus a list of several hundred rules on valid metadata. For detailed information on the checks Peverify.exe performs, see the "Metadata Validation Specification" and the "MSIL Instruction Set Specification" in the Tools Developers Guide folder in the Windows Software Development Kit (SDK).

事实证明它对你很有效,太酷了:)

关于.net - 调试 .net 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9863623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com