Visual Studio デバッガーでの式

Visual Studio デバッガーには式エバリュエーターという機能があり、 [クイック ウォッチ] ダイアログ ボックス、 [ウォッチ] ウィンドウ、または [イミディエイト] ウィンドウで式を入力するときに役立ちます。 式エバリュエーターは [ブレークポイント] ウィンドウなど、他のデバッガー機能でも使用できます。

以下のセクションでは、Visual Studio でサポートされている言語に対する式の評価での制限事項について説明します。

F# の式はサポートされていません。

F# の式は認識されません。 F# のコードをデバッグする場合は、デバッガー ウィンドウまたはダイアログ ボックスに式を入力する前に、式を C# の構文に変換する必要があります。 式を F# から C# に変換するときは、C# では等価をテストするのに == 演算子を使用しますが、F# では単一の =を使用することにご注意ください。

C++ の式

C++ の式でのコンテキスト演算子の使用については、「 Context Operator (C++)」をご覧ください。

C++ でサポートされていない式

コンストラクター、デストラクター、および変換

オブジェクトに対し明示的または暗黙にコンストラクターまたはデストラクターを呼び出すことはできません。 たとえば、次の式は明示的にコンストラクターを呼び出すと、エラー メッセージが表示されます。

my_date( 2, 3, 1985 )

変換先がクラスである場合は、変換関数を呼び出せません。 クラスへの変換には、オブジェクトの構築が必要です。 たとえば、 myFractionCFractionのインスタンスであり、変換関数演算子 FixedPointを定義する場合、次の式はエラーになります。

(FixedPoint)myFraction

new 演算子または delete 演算子を呼び出すことはできません。 たとえば、次の式はサポートされません。

new Date(2,3,1985)

プリプロセッサ マクロ

デバッガーでは、プリプロセッサ マクロはサポートされていません。 たとえば、定数 VALUE#define VALUE 3 として宣言されている場合、[ウォッチ] ウィンドウで VALUE を使用することはできません。 この制約を回避するには、可能な場合は常に #defineを列挙体と関数に置き換えてください。

名前空間の宣言の使用

using namespace 宣言は使用できません。 現在の名前空間外部の型名または変数にアクセスするには、完全修飾名を使用する必要があります。

匿名の名前空間

匿名の名前空間はサポートされていません。 次のコードを使用する場合、ウォッチ ウィンドウに test を追加できません。

namespace mars
{
    namespace
    {
        int test = 0;
    }
}
int main()
{
    // Adding a watch on test doesn't work.
    mars::test++;
    return 0;
}

デバッガーの組み込み関数による状態の保持

デバッガーの組み込み関数を使用すると、アプリケーションの状態を変更せずに、式の中で特定の C/C++ 関数を呼び出すことができます。

デバッガーの組み込み関数には次の特徴があります。

  • 安全なことが保証されています。デバッガーの組み込み関数を実行しても、デバッグ対象のプロセスは破損しません。

  • すべての式で使用できます。副作用と関数評価が許可されていないシナリオでも使用できます。

  • ミニダンプのデバッグ中など、通常の関数呼び出しができないシナリオでも機能します。

    デバッガーの組み込み関数は、式の評価をより便利にすることもできます。 たとえば、ブレークポイント条件に記述する際、 strncmp(str, "asd")str[0] == 'a' && str[1] == 's' && str[2] == 'd'よりもはるかに簡単です。 )

Area 組み込み関数
文字列長 strlen、wcslenstrnlen、wcsnlen
文字列比較 strcmp、wcscmpstricmp、wcsicmp_stricmp、_strcmpi、_wcsicmp、_wcscmpistrncmp、wcsncmpstrnicmp、wcsnicmp_strnicmp、_wcsnicmp
文字列検索 strchr、wcschrmemchr、wmemchrstrstr、wcsstr
Win32 CoDecodeProxyDecodePointerGetLastErrorTlsGetValue
Windows 8 RoInspectCapturedStackBackTraceWindowsCompareStringOrdinalWindowsGetStringLenWindowsGetStringRawBuffer

これらの関数では、デバッグ対象のプロセスが Windows 8 上で動作している必要があります。 Windows 8 デバイスから生成されたダンプ ファイルをデバッグする際も、Visual Studio コンピューターが Windows 8 を実行している必要があります。 ただし、Windows 8 デバイスをリモートでデバッグする場合は、Visual Studio コンピューターが Windows 7 を実行していてもかまいません。
WindowsGetStringLenWindowsGetStringRawBuffer は、ソース レベルで実行エンジン (EE) によってのみ使用されます。
その他 __log2 - 指定した整数の底 2 の対数 (最も近い整数に切り捨てられます) を返します。

__findNonNull - ポインターの配列を検索し、null でない最初の要素のインデックスを返します。
- パラメーター: (1) 配列内の最初の要素へのポインター (void*)、(2) 配列のサイズ (unsigned int)。
- 戻り値: (1) 配列内の null でない最初の要素の 0 から始るインデックス。見つからない場合は -1。

DecodeHString - HSTRING の値を書式設定するヘルパー関数。 HSTRING 値をスタックからポップし、EE で文字列の場所を識別するために使用できる StringInfo 構造体のバイトをプッシュします。 これは EE によって内部的にのみ使用されます。ユーザーが使用して直接呼び出すことはできません。

DecodeWinRTRestrictedException - WinRT 制限付き例外をデコードして、制限付きの説明を取得します。
- パラメーター: (1) 制限付き参照文字列を表す、null で終わる文字列の文字。
- 戻り値: 表示する実際のエラー メッセージを含む、null で終わる文字列の文字。

DynamicCast - dynamic_cast が実装されます。
- パラメーター: (1) キャストするオブジェクトへのポインター。
- データ項目: CDynamicCastData オブジェクトが、対応する ExecuteIntrinsic() 命令にデータ項目として関連付けられている必要があります。 データ項目により、キャストに使用する型と、natvis 式を評価するかどうか (無限再帰を中断するための診断に必要です) がエンコードされます。
- 戻り値: (1) オブジェクトへのポインター、正しい型へのキャスト、またはキャストするオブジェクトが正しい型のインスタンスではない場合は NULL。

DynamicMemberLookup - クラス メンバーの値を動的に取得するヘルパー関数

GetEnvBlockLength - 環境ブロックの長さ (文字数) を取得するヘルパー関数。 $env に使用されます。

Stdext_HashMap_Int_OperatorBracket_idx - stdext::hash_map の operator[]。 'int' のキーを持つ既定のハッシュ関数が想定されます。 に値を返します。 組み込みの operator[] では、ハッシュ テーブルからの既存の項目の取得のみがサポートされています。テーブルへの新しい項目の挿入は、メモリ割り当てなどの不要な複雑さを伴う可能性があるため、サポートされていません。 ただし、operator[] を使用して、テーブル内に既に存在するキーに関連付けられている値を変更できます。
- スタック パラメーター: (1) stdext::hash_map オブジェクトのアドレス、(2) テーブルへのキー (int)、(3) 関数の実装で参照を実行するために必要なメンバーのフィールド オフセットを指定する HashMapPdb 構造体。 リモート側ではシンボルへの直接アクセスを使用できないため、これが必要になります。
- 戻り値: (1) キーがテーブル内にある場合、そのキーに対応する値のアドレス。 それ以外の場合は NULL。

Std_UnorderedMap_Int_OperatorBracket_idx - std::unordered_map は、ハッシュ関数が異なる点を除き、stdext::hash_map と同じように動作します。

ConcurrencyArray_OperatorBracket_idx // Concurrency::array<>::operator[index<>] および operator(index<>)

ConcurrencyArray_OperatorBracket_int // Concurrency::array<>::operator(int, int, ...)

ConcurrencyArray_OperatorBracket_tidx // Concurrency::array<>::operator[tiled_index<>] および operator(tiled_index<>)

ConcurrencyArrayView_OperatorBracket_idx // Concurrency::array_view<>::operator[index<>] および operator(index<>)

ConcurrencyArrayView_OperatorBracket_int // Concurrency::array_view<>::operator(int, int, ...)

ConcurrencyArrayView_OperatorBracket_tidx // Concurrency::array_view<>::operator[tiled_index<>] および operator(tiled_index<>)

TreeTraverse_Init - 新しいツリー トラバーサルを初期化します。
拡張機能ベースのビジュアライザーをサポートします。.natvis ファイルで使用するためのものではありません。

TreeTraverse_Next - 保留中のツリー トラバーサルからノードを取得します。
拡張機能ベースのビジュアライザーをサポートします。.natvis ファイルで使用するためのものではありません。

TreeTraverse_Skip - 保留中のツリー トラバーサル内のノードをスキップします。
拡張機能ベースのビジュアライザーをサポートします。.natvis ファイルで使用するためのものではありません。

C++/CLI - サポートされていない式

  • ポインターを使用するキャストまたはユーザー定義のキャストはサポートされていません。

  • オブジェクトの比較と代入はサポートされていません。

  • オーバーロードされた演算子と関数はサポートされていません。

  • ボックス化とボックス化解除はサポートされていません。

  • Sizeof 演算子はサポートされていません。

C# - サポートされていない式

動的オブジェクト

デバッガー式では、静的に型指定された変数を動的として使用できます。 IDynamicMetaObjectProvider を実装するオブジェクトがウォッチ ウィンドウで評価されると、[動的ビュー] ノードが追加されます。 [動的ビュー] ノードにはオブジェクトのメンバーが表示されますが、そのメンバーの値を編集することはできません。

動的オブジェクトでは、以下の機能はサポートされていません。

  • 複合演算子 +=-=%=/=*=

  • 多数のキャスト (数値キャスト、型引数キャストなど)

  • 3 つ以上の引数を指定したメソッド呼び出し

  • 3 つ以上の引数を指定したプロパティの getter

  • 引数を指定したプロパティの setter

  • インデクサーへの割り当て

  • ブール演算子 && および ||

匿名メソッド

匿名メソッドの新規作成はサポートされていません。

Visual Basic - サポートされていない式

動的オブジェクト

デバッガー式では、静的に型指定された変数を動的として使用できます。 IDynamicMetaObjectProvider を実装するオブジェクトがウォッチ ウィンドウで評価されると、[動的ビュー] ノードが追加されます。 [動的ビュー] ノードにはオブジェクトのメンバーが表示されますが、そのメンバーの値を編集することはできません。

動的オブジェクトでは、以下の機能はサポートされていません。

  • 複合演算子 +=-=%=/=*=

  • 多数のキャスト (数値キャスト、型引数キャストなど)

  • 3 つ以上の引数を指定したメソッド呼び出し

  • 3 つ以上の引数を指定したプロパティの getter

  • 引数を指定したプロパティの setter

  • インデクサーへの割り当て

  • ブール演算子 && および ||

ローカル定数

ローカル定数はサポートされていません。

インポート エイリアス

インポート エイリアスはサポートされていません。

変数宣言

デバッガー ウィンドウでは、明示的に新しい変数を宣言できません。 ただし、 イミディエイト ウィンドウ内で新しい暗黙的な変数を割り当てることはできます。 このように暗黙的な変数のスコープは、デバッグ セッションに制限されるため、デバッガーの外部ではアクセスできません。 たとえば、ステートメント o = 5 によって、新しい変数 o が暗黙的に作成され、値 5 が割り当てられます。 このように暗黙的な変数は、デバッガーで型を推測できなければ、型 Object になります。

サポートされないキーワード

  • AddressOf

  • End

  • Error

  • Exit

  • Goto

  • On Error

  • Resume

  • Return

  • Select/Case

  • Stop

  • SyncLock

  • Throw

  • Try/Catch/Finally

  • With

  • 名前空間またはモジュール レベルのキーワード ( End SubModuleなど)。