5

VC++ Express 2005 のコードにブレークポイント条件を追加して、ローカル変数が指定された条件を満たした場合にのみブレークポイントがトリガーされるようにしたいと考えています。例えば

bool my_test(UIDList test_list) {
    foo(test_list);
    bar(test_list); // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0
    print(test_list);
}

ブレークポイントを右クリックして [条件...] を選択すると、希望どおりのダイアログが表示されますが、テキスト フィールドに入力しようとすると、次のエラーが発生します。

ブレークポイント条件を評価できません: CX0052: エラー: メンバー関数が存在しません

ヘルプ ドキュメントを試しましたが、答えが見つかりませんでした。VC++ の経験者が正しい方向に向けてくれることを願っています...

以前、VC++ Express の最新バージョンへのアップグレードを試みましたが、プロジェクトが正常にインポートされませんでした。プロジェクトの複雑さと現在のタイム スケールのため、現時点ではアップグレードをソリューションとして検討することはできません。

4

3 に答える 3

10

VSには、変数ウォッチウィンドウ、即時ウィンドウ、ブレークポイント条件など、いくつかのマイクロ評価エンジンがあります。それらに関する適切なドキュメントは見つかりませんでした。私が知る限り、彼らは喜んで呼び出すメソッドにうるさいです、アクセス制限にも鈍感です。
したがって、おそらくあなたの状態を次のように言い換えることができます

test_list.Length() > 0  

のようなものに

test_list.m_nLength > 0

(またはあなたのプライベート長変数が何であれ)。

(編集)デバッガーが処理できる式と処理できない式を説明するこのmsdnページを見つけました。まず、確かに-

'デバッガーは、アクセス制御に関係なく、すべてのクラス メンバーにアクセスできます。基本クラスや埋め込みメンバー オブジェクトなど、任意のクラス オブジェクト メンバーを調べることができます。

そして第二に、「Length()」の評価の失敗に関する私の推測 - おそらくインライン化されていました:

「関数が通常の関数として少なくとも 1 回出現しない限り、デバッガー式は組み込み関数またはインライン関数を呼び出すことはできません。」

于 2009-04-11T08:21:57.123 に答える
9

DebugBreak(); を使用します。関数:

bool my_test(UIDList test_list) {
    foo(test_list);
    if (bar(test_list) /* or whatever check :) */) // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0
        DebugBreak();
    }
    print(test_list);
}

または、いつでも assert(expression) を使用できます

bool my_test(UIDList test_list) {
    foo(test_list);
    bar(test_list);
    assert(test_list.Length() > 0); // will break here
    print(test_list);
}
于 2009-03-18T10:56:52.590 に答える
4

私の知る限り、ブレークポイントの条件はメソッドを呼び出すことができません。したがって、事前に長さを計算する必要があります。このようなもの。


bool my_test(UIDList test_list) {
 foo(test_list);
 int i = test_list.Length();
 bar(test_list); // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0
 print(test_list);
}

ここで i の値に条件付きブレークポイントを設定すれば問題ありません。

于 2009-03-18T10:52:02.557 に答える