诊断和检测
Native AOT 与 CoreCLR 共享部分(而不是全部)诊断和检测功能。 由于 CoreCLR 有丰富的诊断实用程序可供选择,因此有时适合诊断和调试 CoreCLR 中的问题。 与剪裁兼容的的应用不应有行为差异,因此调查通常适用于这两个运行时。 尽管如此,某些信息只能在发布后收集,因此 Native AOT 还提供发布后诊断工具。
.NET 8 Native AOT 诊断支持
下表总结了 Native AOT 部署支持的诊断功能:
功能 | 完全支持 | 部分支持 | 不支持 |
---|---|---|---|
可观测性和遥测 | 部分支持 | ||
开发时诊断 | 完全支持 | ||
本机调试 | 部分支持 | ||
CPU 分析 | 部分支持 | ||
堆分析 | 不受支持 |
可观测性和遥测
从 .NET 8 起,Native AOT 运行时支持 EventPipe,这是许多日志记录和跟踪库使用的基层。 可以直接通过 EventSource.WriteEvent
等 API 与 EventPipe 进行交互,也可以使用在上面构建的库,如 OpenTelemetry。 EventPipe 支持还允许 .NET 诊断工具(如 dotnet-trace、dotnet-counters 和 dotnet-monitor)与 Native AOT 或 CoreCLR 应用程序无缝配合。 EventPipe 是 Native AOT 中的可选组件。 要包含 EventPipe 支持,请将 EventSourceSupport
MSBuild 属性设置为 true
。
<PropertyGroup>
<EventSourceSupport>true</EventSourceSupport>
</PropertyGroup>
本机 AOT 为某些已知事件提供程序提供了部分支持。 Native AOT 不支持所有运行时事件。
开发时诊断
.NET CLI 工具 (dotnet
SDK) 和 Visual Studio 为 build
和 publish
提供单独的命令。 build
(或 Visual Studio 中的 Start
)使用 CoreCLR。 仅 publish
创建 Native AOT 应用程序。 将应用发布为 Native AOT 时,会生成一个应用,该应用已预先 (AOT) 编译为本机代码。 如前所述,并非所有诊断工具都可以在 .NET 8 中无缝使用已发布的 Native AOT 应用程序。 但是,在应用程序生成阶段,所有 .NET 诊断工具都可供开发人员使用。 建议像往常一样开发、调试和测试应用程序,并使用 Native AOT 发布工作应用,作为最后的步骤之一。
本机调试
在开发期间运行应用(如在 Visual Studio 中)或使用 dotnet run
、dotnet build
或 dotnet test
时,它默认在 CoreCLR 上运行。 但是,如果项目文件中存在 PublishAot
,则 CoreCLR 和 Native AOT 之间的行为应相同。 此特性使你可以使用标准的 Visual Studio 托管调试引擎进行开发和测试。
发布后,Native AOT 应用程序是真正的本机二进制文件。 托管调试器无法处理它们。 但是,Native AOT 编译器会生成完全本机可执行文件,这些文件可由所选平台上的本机调试器进行调试(例如,Windows 上的 WinDbg 或 Visual Studio 以及类似 Unix 的系统上的 gdb 或 lldb)。
Native AOT 编译器会生成有关行号、类型、局部变量和参数的信息。 使用本机调试器可以检查堆栈跟踪和变量、单步执行源行或设置行断点。
若要调试托管异常,请对 RhThrowEx
方法设置断点,每当引发托管异常时调用此方法。 异常存储在 rcx
或 x0
寄存器中。 如果调试器支持查看 C++ 对象,则可以将寄存器强制转换为 S_P_CoreLib_System_Exception*
以查看有关异常的详细信息。
为 Native AOT 应用程序收集转储文件涉及 .NET 8 中的一些手动步骤。
特定于 Visual Studio 的注释
可以在 Visual Studio 调试器下启动 Native AOT 编译的可执行文件,方法是在 Visual Studio IDE 中打开它。 需要在 Visual Studio 中打开可执行文件本身。
若要设置每当引发异常时中断的断点,请从“调试”>“Windows”菜单中选择“断点”选项。 在新窗口中,选择“新建”>“函数”断点。 将 RhThrowEx
指定为函数名称,并将语言选项保留为“所有语言”(请勿选择 C#)。
若要查看引发的异常,请开始调试(“调试”>“开始调试”或 F5),打开监视窗口(“调试”>“Windows”>“监视”),并将以下表达式添加为监视之一:(S_P_CoreLib_System_Exception*)@rcx
。 此机制利用了这样一个事实,即在调用 RhThrowEx
时,x64 CPU 寄存器 RCX 包含引发的异常。 还可以将表达式粘贴到“即时”窗口中;语法与监视语法相同。
符号文件的重要性
发布时,Native AOT 编译器同时生成可执行文件和符号文件。 本机调试和相关活动(如分析)需要访问本机符号文件。 如果此文件不存在,则可能已降级或损坏结果。
有关符号文件的名称和位置的信息,请参阅本机调试信息。
CPU 分析
特定于平台的工具(如 PerfView 和 Perf)可用于收集 Native AOT 应用程序的 CPU 示例。
堆分析
Native AOT 目前不支持托管堆分析。 堆分析工具(如 dotnet-gcdump、PerfView 和 Visual Studio 堆分析工具)在 .NET 8 中的 Native AOT 中不起作用。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈