デバッグ中にプログラムを調査するには、デバッガーに、マネージ スタック フレームにアクセスして式を評価する機能が用意されている必要があります。 以下のシナリオでは、デバッガーで共通言語ランタイム (CLR: Common Language Runtime) のデバッグ API を使用して、これらのタスクを実行する方法を説明します。
呼び出し履歴へのアクセス
以下では、デバッガーでマネージ スタック フレームにアクセスする方法について、順を追って説明します。 スタック フレームにアクセスするには、デバッグ対象プロセスを停止する必要があります。
スタック チェーンの列挙子を取得します。 スタック チェーンにアクセスするスレッドの ICorDebugThread::EnumerateChains メソッドを呼び出して、スタック チェーンを列挙する ICorDebugChainEnum オブジェクトを取得します。
ICorDebugChainEnum::Next メソッドを呼び出して、スタック チェーンを反復処理します。
ICorDebugChain::EnumerateFrames メソッドを呼び出して、チェーン内のスタック フレームの列挙子を取得します。
ICorDebugFrameEnum::Next メソッドを呼び出して、スタック フレームの反復処理を続行します。
必要に応じて、IP アドレスを取得します。 ICorDebugILFrame::GetIP メソッドを呼び出して、スタック フレームの関数の先頭からの相対位置として IP アドレスを取得します。
必要に応じて、スタック フレームに関するその他の情報を取得します。 たとえば、ICorDebugFrame::GetFunctionToken メソッドを呼び出して、スタック フレームが実行しているコードの関数のメタデータ トークンを取得できます。 ICorDebugCode::GetCode メソッドを呼び出して、スタック フレームが実行しているコードを表すオブジェクトを取得することもできます。
式の評価
アンマネージ ネイティブ コードの式は、従来のデバッガーと同じ機構を使用して評価できます。
マネージ コードの場合、デバッガーは次の方法で式を評価できます。
式を解析する。
デバッグ API を呼び出して、式内の変数の値へのアクセスや式内の関数の呼び出しを行う。
または、デバッガーで次の操作を行うことができます。
グローバル関数の式のラップや関数のコンパイルを行う。
デバッグ API (エディット コンティニュ) を呼び出してグローバル関数を追加する。
デバッグ API を呼び出して関数を評価する。
以下では、デバッガーで式を評価する方法について、順を追って説明します。 このシナリオでは、A + MyFunc() という式を使用します。A はレジスタ内に存在するものとし、デバッグ対象のコードはマネージ ネイティブ コードであることを前提にしています。
A の値を取得します。 式を評価するスタック フレームの ICorDebugNativeFrame::GetLocalRegisterValue メソッドを呼び出します。
式を評価するスレッドの ICorDebugThread::CreateEval メソッドを呼び出して、評価オブジェクトを作成します。
ICorDebugEval::CallFunction メソッドを呼び出して、MyFunc() の値を計算します。
式を評価します。 前の 2 つの手順で取得した値を使用して、定数の圧縮を式に適用します。