诊断和检测

本机 AOT 与完整的 .NET 运行时共享某些诊断和检测功能,但并非全部。 与剪裁兼容的的应用不应有行为差异,因此调查通常适用于这两个运行时。 因此,有时适合在完整的 .NET 运行时中诊断和调试问题,因为它具有丰富的可用诊断实用工具选择。 尽管如此,某些信息只能在发布后收集,因此 Native AOT 还提供发布后诊断工具。

本机 AOT 诊断支持

下表总结了 Native AOT 部署支持的诊断功能:

功能 完全支持 部分支持 不支持
可观测性和遥测 部分支持
开发时诊断 完全支持
本机调试 部分支持
CPU 分析 部分支持
堆分析 不受支持

可观测性和遥测

从 .NET 8 起,Native AOT 运行时支持 EventPipe,这是许多日志记录和跟踪库使用的基层。 可以直接通过 EventSource.WriteEvent 等 API 与 EventPipe 进行交互,也可以使用在上面构建的库,如 OpenTelemetry。 EventPipe 支持还允许 .NET 诊断工具(如 dotnet-tracedotnet-countersdotnet-monitor)与本机 AOT 或完整的 .NET 运行时应用程序无缝配合工作。 EventPipe 是 Native AOT 中的可选组件。 要包含 EventPipe 支持,请将 EventSourceSupport MSBuild 属性设置为 true

<PropertyGroup>
    <EventSourceSupport>true</EventSourceSupport>
</PropertyGroup>

本机 AOT 为某些已知事件提供程序提供了部分支持。 Native AOT 不支持所有运行时事件

开发时诊断

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

本机调试

在开发期间运行应用(例如在 Visual Studio 中)或与 dotnet rundotnet build 一起运行时,或者dotnet test默认情况下,它会在完整的 .NET 运行时上运行。 但是,如果 PublishAot 项目文件中存在,则行为应在完整的 .NET 运行时和本机 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 中不起作用。

另请参阅