如果调试或可观测性不够,.NET 还支持其他诊断机制。
使用事件源进行跟踪
通过事件源可以收集有关 .NET 进程内所发生情况的详细诊断信息。 它包括运行时、GC、库和应用程序代码的遥测信息。
可以使用 API 或外部诊断工具(如 Visual Studio、dotnet-monitorSystem.Diagnostics.Tracing.EventListenerdotnet-trace、PerfView 和 Perfcollect 脚本)在进程内收集事件源数据。 使用外部工具收集跟踪中的事件源数据的功能通常用于性能分析。
EventPipe
EventPipe 是类似于 ETW 或 LTTng 的运行时组件,可用于收集跟踪数据。 EventPipe 的目标是使 .NET 开发人员能够轻松地跟踪其 .NET 应用程序,而无需依赖于平台特定的 OS 本机组件(如 ETW 或 LTTng)。
EventPipe 是众多诊断工具背后的一种机制。 它可用于接收运行时发出的事件以及通过 EventSource 编写的自定义事件。
转储
转储是一个文件,其中包含转储创建时进程的快照。 转储可用于检查应用程序的状态,以便进行调试。
符号
符号是源代码和编译器生成的二进制代码之间的映射。 这些通常被 .NET 调试器和跟踪工具用来解析源行号、局部变量名称以及其他类型的诊断信息。
诊断端口
.NET 运行时公开一个服务终结点,该终结点允许其他进程通过 IPC 通道发送诊断命令和接收响应。 此终结点称为诊断端口。 可以将命令发送到诊断端口:
- 捕获内存转储。
- 启动 EventPipe 跟踪。
- 请求用于启动应用的命令行。
DiagnosticSource 和 DiagnosticListener
DiagnosticSource 是一个模块,它允许对代码进行检测,以便实现丰富数据有效负载的生产时日志记录,以供在检测到的进程中使用。 在运行时,使用者可以动态发现数据源并订阅感兴趣的数据源。 System.Diagnostics.DiagnosticSource 旨在允许进程内工具访问丰富的数据,例如 OpenTelemetry 检测库。 DiagnosticSource 数据还可以通过 EventPipe 流出,使专用工具能够收集丰富的诊断数据。
收集容器中的诊断
也可使用非容器化 Linux 环境中使用的相同诊断工具收集容器中的诊断。 只需进行几次使用更改就可使这些工具在 Docker 容器中运行。