ソフトウェアが期待どおりに動作するとは限りませんが、.NET には、これらの問題を迅速かつ効果的に診断するのに役立つツールと API があります。
ネイティブ AOT デプロイ は、.NET 7 以降で使用できるアプリケーション モデルです。 ネイティブ AOT アプリの .NET 8 診断サポートの詳細については、「 ネイティブ AOT 診断」を参照してください。
この記事は、必要なさまざまなツールを見つけるのに役立ちます。
デバッガー
デバッガーを 使用すると、プログラムを操作できます。 一時停止、増分実行、調査、再開を行うと、コードの動作に関する分析情報が得られます。 デバッガーは、簡単に再現できる機能の問題を診断するための適切な選択肢です。
プロファイラー
プロファイラーを 使用すると、プログラムのパフォーマンスを分析できます。 メモリ使用量、CPU 使用率、およびその他のメトリックに関するデータを収集して、パフォーマンスの問題を診断して理解することができます。
可観測性のためのインストルメンテーション
.NET では、メトリック、ログ、分散トレースを使用した業界標準のインストルメンテーション手法がサポートされています。これは、一般に 監視の 3 つの柱として知られています。
インストルメンテーションは、ソフトウェア プロジェクトに追加され、実行内容を記録するコードです。 この情報は、ファイル、データベース、またはメモリ内で収集し、ソフトウェア プログラムの動作を理解するために分析できます。 これは、多くの場合、問題を監視して診断するために運用環境で使用されます。 .NET ランタイムには、必要に応じて有効にできるインストルメンテーションと、アプリケーション専用のカスタム インストルメンテーションを追加できる API が組み込まれています。
ログ
ログ 記録は、プログラムの実行中に発生した興味深いイベントのレコードであるログを生成するためにコードをインストルメント化する手法です。 多くの場合、ログ イベントのベースライン セットは既定で構成され、より広範なログ記録をオンデマンドで有効にして特定の問題を診断できます。 パフォーマンスのオーバーヘッドは、ログに記録されるデータの量によって異なります。
ほとんどの場合、既存のプロジェクトにログ記録を追加する場合も、新しいプロジェクトを作成する場合でも、 ILogger インフラストラクチャ は適切な既定の選択肢です。
ILogger では、高速な構造化ログ記録、柔軟な構成、およびコンソールを含む 一般的なシンク のコレクションがサポートされています。これは、ASP.NET アプリの実行時に表示されます。 さらに、 ILogger インターフェイスは、豊富な機能と拡張性を提供する多くの サード パーティ製のログ実装 のファサードとしても機能します。
Metrics
メトリック は、アプリケーションのパフォーマンスと正常性を監視するために、時間の経過と同時に記録される数値測定値です。 メトリックは、多くの場合、潜在的な問題が検出されたときにアラートを生成するために使用されます。 メトリックのパフォーマンスオーバーヘッドは非常に低く、多くのサービスではそれらを常時オン テレメトリとして構成します。 例外は多くの場合、メトリックとして記録され、集計してデータのカーディナリティを減らすことができます。 詳細については、 例外の要約を参照してください。
分散トレース
分散トレース は、複数のコンピューターまたはプロセスに分散されたアプリケーション内でエラーとパフォーマンスの問題をローカライズするのに役立つ特殊な形式のログ記録です。 この手法では、アプリケーションを介して要求を追跡し、異なるアプリケーション コンポーネントによって実行される作業を相互に関連付け、同時要求に対してアプリケーションが実行している可能性がある他の作業からそれを分離します。 すべての要求をトレースすることができ、必要に応じてサンプリングを使用してパフォーマンスのオーバーヘッドを制限できます。
インストルメンテーションを収集する
インストルメンテーション データをアプリケーションから送信するには、次のような複数の方法があります。
- OpenTelemetry - テレメトリを収集およびエクスポートするためのクロスプラットフォームのベンダーに依存しない標準
- dotnet-counters などの .NET CLI ツール
- dotnet-monitor - トレースとテレメトリを収集するためのエージェント
- サード パーティ製のライブラリまたはアプリ コードは、 System.Diagnostics.Metrics、 ILogger<TCategoryName>、および System.Diagnostics.Activity API から情報を読み取ることができます。
特殊な診断
デバッグや監視が不十分な場合、.NET では EventSource、Dumps、DiagnosticSource などの追加の診断メカニズムがサポートされます。 詳細については、 特殊な診断に関する記事を 参照してください。
診断ツール
.NET では、アプリケーションの診断に使用できるさまざまな CLI ツール がサポートされています。
.NET Core 診断のチュートリアル
メモリ リークをデバッグする
チュートリアル: メモリ リークをデバッグして、メモリ リーク を見つける手順を説明します。 dotnet-counters ツールを使用してリークを確認し、dotnet-dump ツールを使用してリークを診断します。
高い CPU 使用率をデバッグする
チュートリアル: CPU 使用率の高いデバッグ では、高い CPU 使用率を調査する手順について説明します。
dotnet-counters ツールを使用して、高い CPU 使用率を確認します。 次に、 Trace for Performance Analysis ユーティリティ (dotnet-trace) または Linux perf を使用して CPU 使用率プロファイルを収集して表示する手順について説明します。
デバッグ デッドロック
チュートリアル: デバッグ デッドロック では、 dotnet-dump ツールを使用してスレッドとロックを調査する方法を示します。
Debug ThreadPool Starvation
チュートリアル: threadPool の不足をデバッグして、dotnet-counters ツールと dotnet-stack ツールを使用して ThreadPool の不足を調査する方法を示します。
StackOverflow をデバッグする
チュートリアル: StackOverflow のデバッグ では、Linux で StackOverflowException をデバッグする方法を示します。
Linux ダンプのデバッグ
Linux ダンプのデバッグでは、Linux でダンプを収集して分析する方法について説明します。
EventCounters を使用してパフォーマンスを測定する
チュートリアル: .NET で EventCounters を使用してパフォーマンスを測定 する方法については、 EventCounter API を使用して .NET アプリのパフォーマンスを測定する方法を示します。
独自の診断ツールを作成する
診断クライアント ライブラリ を使用すると、診断シナリオに最適な独自のカスタム診断ツールを作成できます。 詳細については、 Microsoft.Diagnostics.NETCore.Client API リファレンスを参照してください。
.NET