3

私は式評価器に取り組んでいます。evaluate()処理する式の複雑さに応じて、何度も呼び出される関数があります。

このメソッドが null を返す場合、中断して調査する必要があります。多くのパスと return ステートメントがあります。

exit メソッド イベントで中断することは可能ですが、返される値に関する条件を設定する方法が見つかりません。

4

3 に答える 3

3

私もそのフラストレーションに陥りました。名前付き変数を検査 (および条件を書き込む) できますが、戻り値のような名前のないものは検査できません。ここにいくつかのアイデアがあります(興味のある人向け):

  1. ブレークポイントの状態のようなものを含めることができます。evaluate() == null実行されたテスト (Eclipse 4.4) は、このような場合、ブレークポイントの目的で関数が再度実行されることを示していますが、今回はブレークポイントが無効になっています。したがって、少なくともスタック オーバーフローの状況を回避できます。これが役立つかどうかは、検討中の関数の性質に依存します- 実行時とブレークポイント時に同じ値を返しますか? (テストするいくつかの単純なコード:)
class TestBreakpoint {
    int counter = 0;
    boolean eval() { /* <== breakpoint here, [x]on exit, [x]condition: eval()==false */
        System.out.println("Iteration " + ++counter);
        return true;
    }
    public static void main(String[] args) {
        TestBreakpoint app = new TestBreakpoint();
        System.out.println("STARTED");
        app.eval();
        System.out.println("STOPPED");
    }
}
// RESULTS:
// Normal run: shows 1 iteration of eval()
// Debug run: shows 2 iterations of eval(), no stack overflow, no stop on breakpoint
  1. 簡単にする別の方法(将来的にデバッグを行う可能性がある) は、関数内で設定され、最後に 1 回だけ返されるローカル変数を宣言する必要があるコーディング規則(または個人的なコーディング スタイル) を持つことです。例えば:
public MyType evaluate() {
    MyType result = null;
    if (conditionA) result = new MyType('A');
    else if (conditionB) result = new MyType ('B');
    return result;
}

次に、少なくとも次のような条件で終了ブレークポイントを実行できますresult == null。ただし、これは単純な関数に対して不必要に冗長であり、言語が許可するフローに少し反しており、手動でのみ強制できることに同意します。(個人的には、私はこの慣習をより複雑な関数 (resultこの用途のためだけに「予約済み」の名前) に使用することがあります。これにより、物事が明確になるかもしれませんが、単純な関数ではそうではありません。しかし、線を引くのは難しいです。ちょうど今朝単純な関数をステップ実行して、考えられる 3 つのケースのうちどれが発生したかを確認します。今日の複雑なシステムでは、ステップ実行を避けたいと考えています。)

  1. 上記を除いて、テスト可能な変数に戻り値を割り当てる単一関数の前のポイントのように、ケースバイケースでコードを変更する必要があります。いくつかの作業ポリシーがそのような非機能的な変更を許可していない場合、1 つはかなり行き詰まっています...元のコードが少し複雑な場合、そのような書き直しが不注意でバグを解決してしまう可能性もあります。デバッグ後に元の状態に戻して、バグが再発していることに注意してください。
于 2015-02-25T11:55:44.103 に答える
2

どの言語で作業していたかはわかりませんでした。Java または C++ の場合は、ブレークポイント プロパティを使用してメソッド (または関数) ブレークポイントに条件を設定できます。両方のケースを示す画像を次に示します。Java の例では、Entry のクリックを解除し、Exit にチェックを入れます。

Java メソッド ブレークポイント プロパティ ダイアログ

Java ブレークポイントのプロパティ!

C++ 関数ブレークポイント プロパティ ダイアログ

C++ ブレークポイントのプロパティ

于 2013-10-16T21:25:39.947 に答える
1

これは Eclipse デバッガーではまだサポートされておらず、機能強化の要求として追加されています。投票していただければ幸いです。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=425744

于 2014-01-17T20:50:39.097 に答える