次の方法で共有


アプリケーションのトレースとインストルメント化

この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。

トレースは、アプリケーションの実行中にアプリケーションの実行を監視するための方法です。 トレースインストルメンテーションとデバッグ インストルメンテーションは、開発時に .NET Framework アプリケーションに追加できます。また、そのインストルメンテーションは、アプリケーションの開発中とデプロイ後の両方で使用できます。 System.Diagnostics.TraceSystem.Diagnostics.Debug、およびSystem.Diagnostics.TraceSourceクラスを使用して、エラーとアプリケーションの実行に関する情報をログ、テキスト ファイル、またはその他のデバイスに記録して、後で分析できます。

インストルメンテーションという用語は、製品のパフォーマンスのレベルを監視または測定し、エラーを診断する機能を指します。 プログラミングでは、これはアプリケーションが以下を組み込む能力を意味します。

  • コード トレース - 実行時にアプリケーションの実行に関する情報メッセージを受信します。

  • デバッグ - 開発中のアプリケーションでのプログラミング エラーの追跡と修正。 詳細については、「デバッグ」 参照してください。

  • パフォーマンス カウンター - アプリケーションのパフォーマンスを追跡できるコンポーネント。 これらのパフォーマンス カウンターの詳細については、「 パフォーマンス カウンター」を参照してください。

  • イベント ログ - アプリケーションの実行で主要なイベントを受信および追跡できるコンポーネント。 詳細については、EventLog クラスを参照してください。

コード内の戦略的な場所にトレース ステートメントを配置してアプリケーションをインストルメント化することは、分散アプリケーションに特に役立ちます。 トレース ステートメントを使用すると、アプリケーションをインストルメント化して、問題が発生したときに情報を表示するだけでなく、アプリケーションのパフォーマンスを監視することもできます。

TraceSource クラスは、強化されたトレース機能を提供し、古いTraceおよびDebugトレース クラスの静的メソッドの代わりに使用できます。 使い慣れた Trace クラスと Debug クラスはまだ広く使用されていますが、 TraceSource クラスは、 TraceEventTraceDataなどの新しいトレース コマンドに推奨されます。

TraceクラスとDebug クラスは同じですが、Trace クラスのプロシージャと関数は既定でリリース ビルドにコンパイルされますが、Debug クラスのプロシージャと関数はコンパイルされません。

TraceクラスとDebug クラスは、開発中またはデプロイ後にアプリケーションのパフォーマンスを監視および確認する手段を提供します。 たとえば、 Trace クラスを使用して、デプロイされたアプリケーションで発生した特定の種類のアクション (たとえば、新しいデータベース接続の作成) を追跡し、アプリケーションの効率を監視できます。

コード トレースとデバッグ

開発中は、 Debug クラスの出力メソッドを使用して、Visual Studio 統合開発環境 (IDE) の [出力] ウィンドウにメッセージを表示できます。 例えば次が挙げられます。

Trace.WriteLine("Hello World!")
Debug.WriteLine("Hello World!")
System.Diagnostics.Trace.WriteLine("Hello World!");
System.Diagnostics.Debug.WriteLine("Hello World!");

これらの各例では、デバッガーでアプリケーションを実行すると、[出力] ウィンドウに "Hello World!" が表示されます。

これにより、アプリケーションをデバッグし、テスト環境での動作に基づいてパフォーマンスを最適化できます。 すべてのデバッグ出力を受け取ることができるように、 Debug 条件付き属性を有効にして、デバッグ ビルド内のアプリケーションをデバッグできます。 アプリケーションがリリースの準備ができたら、 Debug 条件付き属性をオンにせずにリリース ビルドをコンパイルし、コンパイラが最終的な実行可能ファイルにデバッグ コードを含めないようにすることができます。 詳細については、「 方法: トレースとデバッグを使用して条件付きでコンパイルする」を参照してください。 アプリケーションのさまざまなビルド構成の詳細については、「 コンパイルとビルド」を参照してください。

Trace クラスのメソッドを使用して、インストールされているアプリケーションでコードの実行をトレースすることもできます。 トレース スイッチ をコード内に配置すると、トレースを行うかどうか、対象範囲をどうするかを制御することができます。 これにより、運用環境でアプリケーションの状態を監視できます。 これは、複数のコンピューターで実行されている複数のコンポーネントを使用するビジネス アプリケーションで特に重要です。 構成ファイルを使用して、デプロイ後のスイッチの使用方法を制御できます。 詳細については、「 方法: トレース スイッチを作成、初期化、および構成する」を参照してください。

トレースを使用するアプリケーションを開発するときは、通常、トレース メッセージとデバッグ メッセージの両方をアプリケーション コードに含めます。 アプリケーションをデプロイする準備ができたら、 デバッグ の条件付き属性をオンにしなくても、リリース ビルドをコンパイルできます。 ただし、 トレース 条件付き属性を有効にして、コンパイラが実行可能ファイルにトレース コードを含めることができます。 詳細については、「 方法: トレースとデバッグを使用して条件付きでコンパイルする」を参照してください。

コード トレースのフェーズ

コード トレースには、次の 3 つのフェーズがあります。

  1. インストルメンテーション — トレース コードをアプリケーションに追加します。

  2. トレース — トレース コードは、指定されたターゲットに情報を書き込みます。

  3. 分析 — トレース情報を評価して、アプリケーションの問題を特定して理解します。

開発中、デバッグおよびトレース出力のすべてのメソッドは、既定で Visual Studio の [出力] ウィンドウに情報を書き込みます。 デプロイされたアプリケーションでは、メソッドは指定したターゲットにトレース情報を書き込みます。 トレースまたはデバッグ用の出力ターゲットの指定の詳細については、「 トレース リスナー」を参照してください。

以下は、通常、トレースを使用してデプロイされたアプリケーションの潜在的な問題を分析および修正するために関連する主要な手順の全体像を示しています。 これらの手順を実行する方法の詳細については、適切なリンクを参照してください。

アプリケーションでトレースを使用するには
  1. アプリケーションをデプロイした後にオンサイトで受け取るトレース出力を検討します。

  2. スイッチのセットを作成します。 詳細については、「トレース スイッチを構成する方法に関するページを参照してください。

  3. トレース ステートメントをアプリケーション コードに追加します。

  4. トレース出力を表示する場所を決定し、適切なリスナーを追加します。 詳細については、「 トレース リスナーの作成と初期化」を参照してください。

  5. アプリケーションと、アプリケーションに含まれるトレース コードをテストしてデバッグします。

  6. 次のいずれかの手順を使用して、アプリケーションを実行可能コードにコンパイルします。

    • ソリューション エクスプローラー[プロパティ ページ] ダイアログ ボックスの [デバッグ] ページと共に [ビルド] メニューを使用します。 これは、Visual Studio でコンパイルするときに使用します。

      -又は-

    • コンパイルのコマンド ライン メソッドには、 Trace および Debug コンパイラ ディレクティブを使用します。 詳細については、「 トレースとデバッグを使用した条件付きコンパイル」を参照してください。 これは、コマンド ラインからコンパイルするときに使用します。

  7. 実行時に問題が発生した場合は、適切なトレース スイッチをオンにします。 詳細については、 トレース スイッチの設定を参照してください。

    トレース コードは、指定されたターゲット (画面、テキスト ファイル、イベント ログなど) にトレース メッセージを書き込みます。 Trace.Listeners コレクションに含めるリスナーの種類によって、ターゲットが決まります。

  8. トレース メッセージを分析して、アプリケーションの問題を特定して理解します。

トレース インストルメンテーションと分散アプリケーション

分散アプリケーションを作成するときに、アプリケーションを使用する方法でテストするのが難しい場合があります。 オペレーティング システムまたは Web ブラウザー (ローカライズされたすべての言語オプションを含む) のすべての可能な組み合わせをテストしたり、同時にアプリケーションにアクセスする多数のユーザーをシミュレートしたりする機能を持つ開発チームはほとんどありません。 このような状況では、分散アプリケーションが大量、さまざまなセットアップ、および固有のエンドユーザーの動作にどのように応答するかをテストすることはできません。 また、分散アプリケーションの多くの部分には、直接対話したり、それらの部分のアクティビティを表示したりできるユーザー インターフェイスがありません。

ただし、これを補うには、分散アプリケーションでシステム管理者に関心のある特定のイベント (特に問題が発生したイベント) を記述できるようにすることで、アプリケーション をインストルメント化 します。つまり、コード内の戦略的な場所にトレース ステートメントを配置します。 その後、実行時に予期しない問題が発生した場合 (応答時間が極端に遅い場合など)、考えられる原因を特定できます。

トレース ステートメントを使用すると、元のソース コードを調べて変更し、再コンパイルし、デバッグ環境内で実行時エラーを生成するという困難なタスクを回避できます。 アプリケーションをインストルメント化してエラーを表示するだけでなく、パフォーマンスを監視することもできます。

トレースステートメントの戦略的配置

実行時に使用するトレース ステートメントを配置するときは、特別な注意を払う必要があります。 すべての可能性のあるトレース シナリオが適切にカバーされるように、デプロイされたアプリケーションで必要になる可能性のあるトレース情報を考慮する必要があります。 ただし、トレースを使用するアプリケーションは大きく異なるため、トレースの戦略的配置に関する一般的なガイドラインはありません。 トレース ステートメントの配置の詳細については、「 方法: アプリケーション コードにトレース ステートメントを追加する」を参照してください。

トレースからの出力

トレース出力は、リスナーと呼ばれるオブジェクトによって収集 されます。 リスナーは、トレース出力を受け取り、それを出力デバイス (通常はウィンドウ、ログ、またはテキスト ファイル) に書き込むオブジェクトです。 トレース リスナーが作成されると、通常は Trace.Listeners コレクションに追加され、リスナーがすべてのトレース出力を受信できるようになります。

トレース情報は常に、少なくとも既定の Trace 出力ターゲットである DefaultTraceListenerに書き込まれます。 何らかの理由で他のリスナーをListeners コレクションに追加せずにDefaultTraceListenerを削除した場合、トレース メッセージは受信されません。 詳細については、「 トレース リスナー」を参照してください。

トレース情報を書き込む 6 つの Debug メンバーと Trace メソッドを次の表に示します。

メソッド アウトプット
Assert 指定されたテキスト。または、何も指定されていない場合は、呼び出し履歴。 出力は、 Assert ステートメントで引数として指定された条件が false の場合にのみ書き込まれます。
Fail 指定されたテキスト。または、何も指定されていない場合は、呼び出し履歴。
Write 指定したテキスト。
WriteIf WriteIf ステートメントで引数として指定された条件が満たされている場合は、指定されたテキスト。
WriteLine 指定されたテキストと復帰。
WriteLineIf WriteLineIf ステートメントの引数として指定された条件が満たされている場合は、指定されたテキストと復帰。

Listeners コレクション内のすべてのリスナーは、上記の表で説明したメッセージを受信しますが、実行されるアクションは、メッセージを受信するリスナーの種類によって異なる場合があります。 たとえば、 DefaultTraceListener は、 Fail または失敗した Assert 通知を受信したときにアサーション ダイアログ ボックスを表示しますが、 TextWriterTraceListener は単にそのストリームに出力を書き込みます。

独自のリスナーを実装することで、カスタム結果を生成できます。 たとえば、カスタム トレース リスナーは、メッセージ ボックスにメッセージを表示したり、データベースに接続してテーブルにメッセージを追加したりする場合があります。 すべてのカスタム リスナーは、上記の 6 つのメソッドをサポートする必要があります。 開発者定義リスナーの作成の詳細については、.NET Framework リファレンスの TraceListener を参照してください。

WriteメソッドとWriteLine メソッドは、常に指定したテキストを書き込みます。 AssertWriteIf、および WriteLineIf では、指定したテキストを書き込むかどうかを制御するブール型の引数が必要です。式が true ( WriteIf および WriteLineIf の場合) または false ( Assert の場合) にのみ、指定したテキストを書き込みます。 Fail メソッドは、常に指定されたテキストを書き込みます。 詳細については、「 方法: アプリケーション コードにトレース ステートメントを追加する 」および 「.NET Framework リファレンス」を参照してください。

セキュリティに関する懸念事項

ASP.NET アプリケーションを展開する前にトレースとデバッグを無効にしないと、悪意のあるプログラムによって悪用される可能性のある自身に関する情報がアプリケーションによって明らかにされる可能性があります。 詳細については、「 方法: トレースとデバッグを使用して条件付きでコンパイルする、 コンパイルしてビルドする方法」、および「 方法: トレース スイッチを作成、初期化、構成する」を参照してください。 デバッグは、インターネット インフォメーション サービス (IIS) を介して構成することもできます。

こちらも参照ください