.NET 中的诊断

软件并不总是按预期方式运行,但 .NET 具有工具和 API,可帮助你快速有效地诊断这些问题。

本机 AOT 部署 是自 .NET 7 以来可用的应用程序模型。 有关本机 AOT 应用的 .NET 8 诊断支持的信息,请参阅 本机 AOT 诊断

本文可帮助你找到所需的各种工具。

调试

调试器 允许你与程序交互。 暂停、增量执行、检查和恢复可让你深入了解代码的行为。 调试器是诊断可轻松重现的功能问题的一个不错的选择。

分析器

探查器 允许分析程序的性能。 可以收集有关内存使用情况、CPU 使用率和其他指标的数据,以诊断和了解性能问题。

可观测性的检测

.NET 支持使用指标、日志和分布式跟踪(通常称为 可观测性的三大支柱)的行业标准检测技术。

检测是添加到软件项目的代码,用于记录它正在执行的作。 然后,可以在文件、数据库或内存中收集此信息,并对其进行分析,以了解软件程序的运行方式。 这在生产环境中通常用于监视问题并诊断问题。 .NET 运行时具有内置检测,可以选择性地启用,API 允许添加专用于应用程序的自定义检测。

日志

日志记录 是一种用于检测代码以生成日志的技术,这是程序运行时发生的有趣事件的记录。 默认情况下,默认配置了一组基线日志事件,并且可以按需启用更广泛的日志记录来诊断特定问题。 性能开销因记录的数据量而异。

在大多数情况下,无论是向现有项目添加日志记录还是创建新项目, ILogger 基础结构 都是一个很好的默认选择。 ILogger 支持快速结构化日志记录、灵活的配置和 常见接收器 集合,包括控制台,这是运行 ASP.NET 应用时看到的。 此外,该 ILogger 接口还可以充当许多 第三方日志记录实现 的外墙,提供丰富的功能和可扩展性。

Metrics

指标 是一段时间内记录的数字度量值,用于监视应用程序性能和运行状况。 检测到潜在问题时,指标通常用于生成警报。 指标的性能开销非常低,许多服务将其配置为始终启用的遥测。 异常通常记录为指标,可以汇总以减少数据的基数。 有关详细信息,请参阅 异常摘要

分布式跟踪

分布式跟踪 是一种专用的日志记录形式,可帮助本地化分布在多台计算机或进程的应用程序中的故障和性能问题。 此方法通过应用程序跟踪应用程序,将不同应用程序组件完成的工作关联在一起,并将其与应用程序可能针对并发请求执行的其他工作分开。 可以选择性地跟踪每个请求和采样,以限制性能开销。

收集检测

可以通过多种方式从应用程序流出检测数据,包括:

专用诊断

如果调试或可观测性不足,.NET 支持其他诊断机制,例如 EventSource、Dumps、DiagnosticSource。 有关详细信息,请参阅 专用诊断 文章。

诊断工具

.NET 支持许多可用于诊断应用程序的 CLI 工具

.NET Core 诊断教程

调试内存泄露

教程:调试内存泄漏 演练如何查找内存泄漏。 dotnet-counters 工具用于确认泄漏,dotnet-dump 工具用于诊断泄漏。

调试高 CPU 使用率

教程:调试高 CPU 使用率 将引导你调查高 CPU 使用率。 它使用 dotnet-counters 工具确认 CPU 使用率较高。 然后,它将指导你使用 Trace 进行性能分析实用工具(dotnet-trace 或 Linux perf 来收集和查看 CPU 使用情况配置文件。

调试死锁

教程:调试死锁 演示如何使用 dotnet-dump 工具调查线程和锁。

调试 ThreadPool 饥饿

教程:调试 threadPool 饥饿 演示如何使用 dotnet-countersdotnet-stack 工具调查 ThreadPool 饥饿。

调试 StackOverflow

教程:调试 StackOverflow 演示如何在 Linux 上调试 StackOverflowException

调试 Linux 转储

调试 Linux 转储 说明如何在 Linux 上收集和分析转储。

使用 EventCounters 测量性能

教程:使用 .NET 中的 EventCounters 度量性能 演示如何使用 EventCounter API 来度量 .NET 应用中的性能。

编写自己的诊断工具

使用诊断客户端库 ,可以编写最适合诊断方案的自定义诊断工具。 有关详细信息,请参阅 Microsoft.Diagnostics.NETCore.Client API 参考