如何跟踪 JIT-Compiler 生成的本机代码?
谢谢
在 Visual Studio 中,在代码中放置一个断点并开始调试。当它中断时,打开反汇编窗口(调试 > 窗口 > 反汇编或 Alt+Ctrl+D)。
如果您只是在标准 Debug 或 Release exe 上使用 Debug->Windows->Disassembly,而不修改 Visual Studio 调试选项,您将只会看到未优化的.NET 代码版本。
看看这篇文章“如何使用 Visual Studio 查看 JIT 生成的汇编代码”。它解释了如何检查生成的 JIT 优化代码。
文章中的一个相关引述:
- 在 Visual Studio 中配置调试选项以允许 JIT 生成优化代码并允许您调试优化代码。
转到工具 => 选项 => 调试 => 常规 · 确保未选中标有“在模块加载时抑制 JIT 优化”的框。
· 确保未选中标有“仅启用我的代码”的框。
您应该查找从NGen 工具输出的文件。NGen 在全局程序集缓存中编译和存储程序集的预编译版本。
您甚至可以使用 Sharplab 查看生成的代码 => https://sharplab.io/。在此,您可以根据您在调试和发布配置中编写的 C# 代码快速查看生成的代码。
最近流行的编译器资源管理器也开始支持 .NET 语言。这是示例 => https://godbolt.org/z/P49Y6Ejh6 它不如 SharpLab 快,但它仍然是一个可行的选择。
最新版本的 .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-x64
或osx-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.0
并linux-x64
酌情调整。
设置COMPlus_JitDump=<Method>
环境变量并运行应用程序以将 JIT 输出转储到标准输出。
COMPlus_JitDump=Main ./bin/Release/net6.0/linux-x64/publish/Application