.net - 如何查看 JIT 生成的代码

标签 .net assembly

类似 http://aakinshin.net/en/blog/dotnet/ryujit-ctp5-and-loop-unrolling/ 的帖子显示 JIT 编译器创建的汇编代码。如何从 .NET 程序中获得通用汇编?

最佳答案

这只是从 Visual Studio 调试器窗口复制的。您只需更改一些选项,以便可以调试优化的代码,否则不会发生循环展开:

  • 工具 > 选项 > 调试 > 常规 > 取消选中“抑制 JIT 优化”复选框。为了安全起见,还要取消选中“仅我的代码”。这可以确保即使您正在调试,优化器也可以完成其工作。
  • 构建 > 配置管理器 > 左上角组合 = 发布。调试版本永远不会被优化。
  • 项目 > 属性 > 构建 > 取消选中“首选 32 位”复选框,并确保平台目标组合为 AnyCPU。这是必要的,这样您才能获得新的 x64 抖动而不是 x86 抖动来生成代码。
  • 在您想要查看的代码上设置断点。请注意,断点在优化代码中表现不稳定,并且可能根本不会中断,最好将其设置在方法 header 或从一开始就单步执行。
  • 按 F5。在断点处使用“调试”>“窗口”>“反汇编”。您将看到源代码和机器代码的混合,就像在博客文章中看到的那样。

请注意,您必须编写具有足够副作用的“实质性”代码,这样它就不会被完全优化。例如,Console.Write() 可以提供帮助。如果您在将源代码与机器代码关联起来时遇到困难,那么您可能需要首先为调试版本执行此操作。

关于.net - 如何查看 JIT 生成的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31802549/

相关文章:

c# - 使用 LinQ 从列表返回另一个列表中不存在的值

c++ - 如何为arduino编译V-USB?

c - 为什么 %esp 会被不明确地更改?

.net - 有没有可以模拟静态方法和密封类的免费模拟框架?

.net - 存储在数据库中的过时枚举成员

C 到程序集转换数据类型大小

c++ - 是否启用了 SSE2 指令?

assembly - 当我们有一个红色区域时,为什么我们需要堆栈分配?

c# - 用于日期操作的 DSL

C# 将 XML 反序列化为对象