30

如何跟踪 JIT-Compiler 生成的本机代码?

谢谢

4

5 回答 5

19

在 Visual Studio 中,在代码中放置一个断点并开始调试。当它中断时,打开反汇编窗口(调试 > 窗口 > 反汇编或 Alt+Ctrl+D)。

于 2010-03-09T15:36:45.040 回答
18

如果您只是在标准 Debug 或 Release exe 上使用 Debug->Windows->Disassembly,而不修改 Visual Studio 调试选项,您将只会看到未优化的.NET 代码版本。

看看这篇文章“如何使用 Visual Studio 查看 JIT 生成的汇编代码”。它解释了如何检查生成的 JIT 优化代码。

文章中的一个相关引述:

  1. 在 Visual Studio 中配置调试选项以允许 JIT 生成优化代码并允许您调试优化代码。

转到工具 => 选项 => 调试 => 常规 · 确保未选中标有“在模块加载时抑制 JIT 优化”的框。

· 确保未选中标有“仅启用我的代码”的框。

于 2011-01-13T10:14:00.047 回答
4

您应该查找从NGen 工具输出的文件。NGen 在全局程序集缓存中编译和存储程序集的预编译版本。

于 2010-03-09T15:37:31.427 回答
3

您甚至可以使用 Sharplab 查看生成的代码 => https://sharplab.io/。在此,您可以根据您在调试和发布配置中编写的 C# 代码快速查看生成的代码。

最近流行的编译器资源管理器也开始支持 .NET 语言。这是示例 => https://godbolt.org/z/P49Y6Ejh6 它不如 SharpLab 快,但它仍然是一个可行的选择。

于 2021-01-15T09:29:11.687 回答
0

最新版本的 .NET 可以提供更多跨平台、跨架构、仅限本地和开源的方法。这还允许您构建/修改 JIT 本身并查看结果。完整的步骤描述在:

https://github.com/dotnet/runtime/blob/main/docs/design/coreclr/jit/viewing-jit-dumps.md

缺点是它不是“简单”或开箱即用。

它归结为:

  • 构建您的应用程序并发布它。像这样的东西:

    dotnet publish -c Release -r linux-x64

    但是linux-x64用适当的操作系统/架构组合替换,喜欢win-x64osx-arm64视情况而定。

  • 构建 clrjit 的调试版本:

    git clone https://github.com/dotnet/runtime cd runtime ./build clr -c Debug

  • 将应用程序的 clrjit 替换为您构建的

    cp /path/to/dotnet/runtime/artifacts/bin/coreclr/Linux.x64.Debug/* bin/Release/net6.0/linux-x64/publish/

    调整Linux.x64,net6.0linux-x64酌情调整。

  • 设置COMPlus_JitDump=<Method>环境变量并运行应用程序以将 JIT 输出转储到标准输出。

    COMPlus_JitDump=Main ./bin/Release/net6.0/linux-x64/publish/Application

于 2022-01-04T14:29:24.353 回答