.NET Core 中提供哪些诊断工具?

软件并非始终按预计方式运行,但 .NET Core 具有可帮助用户快速有效地诊断这些问题的工具和 API。

本文可帮助用户查找各种所需的工具。

调试程序

借助调试程序,用户可以与程序进行交互。 通过暂停、增量执行、检查和恢复操作,可深入了解代码的行为。 调试程序是诊断易于重现的功能问题的一个很好的选择。

单元测试

单元测试是持续集成和部署高质量软件的关键组件。 单元测试的目的在于,在用户操作导致系统出现问题时提前向其发出警告。

可观测性检测

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

指标

指标是在一段时间内记录的数值度量,用于监视应用程序性能和运行状况。 指标通常用于在检测到潜在问题时生成警报。 指标的性能开销非常低,并且许多服务将指标配置为始终启用遥测。

日志

日志记录是一种技术,用于检测代码以生成日志,这是程序运行时发生的值得注意的事件的记录。 通常,默认情况下会配置一组基准的日志事件,并且可以按需启用更广泛的日志记录来诊断特定问题。 性能开销是可变的,具体取决于记录的数据量。

分布式跟踪

分布式跟踪是一种专门的日志记录形式,可帮助用户找出跨多个计算机或进程分布的应用程序中的故障和性能问题。 此技术通过应用程序跟踪请求,将不同应用程序组件完成的工作关联在一起,并将其与应用程序可能为并发请求所做的其他工作分开。 可以跟踪每个请求,并且可以选择采用抽样来绑定性能开销。

转储

转储是一个文件,其中包含创建时进程的快照。 它们可用于检查应用程序的状态,以便进行调试。

符号

符号是源代码和编译器生成的二进制代码之间的映射。 这些通常被 .NET 调试器用来解析源行号、局部变量名称以及其他类型的诊断信息。

收集容器中的诊断

也可使用非容器化 Linux 环境中使用的相同诊断工具收集容器中的诊断。 只需进行几次使用更改就可使这些工具在 Docker 容器中运行。

.NET Core 诊断全局工具

dotnet-counters

dotnet-counters 是一个性能监视工具,用于初级运行状况监视和性能调查。 它通过 EventCounter API 观察已发布的性能计数器值。 例如,可以快速监视 CPU 使用情况或 .NET Core 应用程序中的异常率等指标。

dotnet-dump

通过 dotnet-dump 工具,可在不使用本机调试器的情况下收集和分析 Windows 和 Linux 核心转储。

dotnet-gcdump

dotnet-gcdump 工具可用于为活动 .NET 进程收集 GC(垃圾回收器)转储。

dotnet-trace

分析数据通过 .NET Core 中的 EventPipe 公开。 通过 dotnet-trace 工具,可以使用来自应用的有意思的分析数据,这些数据可帮助你分析应用运行缓慢的根本原因。

dotnet-stack

使用 dotnet-stack 工具可以快速打印正在运行的 .NET 进程中的所有线程的托管堆栈。

dotnet-symbol

dotnet-symbol 用于下载打开核心转储或小型转储所需的文件(符号、DAC/DBI、主机文件等)。 如果需要使用符号和模块来调试在其他计算机上捕获的转储文件,请使用此工具。

dotnet-sos

dotnet-sos 在 Linux 和 macOS(如果使用的是 Windbg/cdb,则在 Windows 上)安装 SOS调试扩展

PerfCollect

PerfCollect 是一个 bash 脚本,可用于收集包含 perfLTTng 的跟踪,以便更深入地分析在 Linux 分发版上运行的 .NET 应用的性能。

.NET Core 诊断教程

编写自己的诊断工具

使用诊断客户端库可以编写最适合诊断场景的自定义诊断工具。 在 Microsoft.Diagnostics.NETCore.Client API 参考中查找信息。

调试内存泄露

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

调试高 CPU 使用率

教程:调试高 CPU 使用率逐步介绍了如何调查高 CPU 使用率。 它使用 dotnet-counters 工具来确认高 CPU 使用率。 然后,它逐步介绍了如何使用性能分析实用工具 (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 应用的性能。