诊断和检测

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-tracedotnet-countersdotnet-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 为 buildpublish 提供单独的命令。 build(或 Visual Studio 中的 Start)使用 CoreCLR。 仅 publish 创建 Native AOT 应用程序。 将应用发布为 Native AOT 时,会生成一个应用,该应用已预先 (AOT) 编译为本机代码。 如前所述,并非所有诊断工具都可以在 .NET 8 中无缝使用已发布的 Native AOT 应用程序。 但是,在应用程序生成阶段,所有 .NET 诊断工具都可供开发人员使用。 建议像往常一样开发、调试和测试应用程序,并使用 Native AOT 发布工作应用,作为最后的步骤之一。

本机调试

在开发期间运行应用(如在 Visual Studio 中)或使用 dotnet rundotnet builddotnet test 时,它默认在 CoreCLR 上运行。 但是,如果项目文件中存在 PublishAot,则 CoreCLR 和 Native AOT 之间的行为应相同。 此特性使你可以使用标准的 Visual Studio 托管调试引擎进行开发和测试。

发布后,Native AOT 应用程序是真正的本机二进制文件。 托管调试器无法处理它们。 但是,Native AOT 编译器会生成完全本机可执行文件,这些文件可由所选平台上的本机调试器进行调试(例如,Windows 上的 WinDbg 或 Visual Studio 以及类似 Unix 的系统上的 gdb 或 lldb)。

Native AOT 编译器会生成有关行号、类型、局部变量和参数的信息。 使用本机调试器可以检查堆栈跟踪和变量、单步执行源行或设置行断点。

若要调试托管异常,请对 RhThrowEx 方法设置断点,每当引发托管异常时调用此方法。 异常存储在 rcxx0 寄存器中。 如果调试器支持查看 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 分析

特定于平台的工具(如 PerfViewPerf)可用于收集 Native AOT 应用程序的 CPU 示例。

堆分析

Native AOT 目前不支持托管堆分析。 堆分析工具(如 dotnet-gcdumpPerfView 和 Visual Studio 堆分析工具)在 .NET 8 中的 Native AOT 中不起作用。