私は式評価器に取り組んでいます。evaluate()
処理する式の複雑さに応じて、何度も呼び出される関数があります。
このメソッドが null を返す場合、中断して調査する必要があります。多くのパスと return ステートメントがあります。
exit メソッド イベントで中断することは可能ですが、返される値に関する条件を設定する方法が見つかりません。
私は式評価器に取り組んでいます。evaluate()
処理する式の複雑さに応じて、何度も呼び出される関数があります。
このメソッドが null を返す場合、中断して調査する必要があります。多くのパスと return ステートメントがあります。
exit メソッド イベントで中断することは可能ですが、返される値に関する条件を設定する方法が見つかりません。
私もそのフラストレーションに陥りました。名前付き変数を検査 (および条件を書き込む) できますが、戻り値のような名前のないものは検査できません。ここにいくつかのアイデアがあります(興味のある人向け):
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
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 つのケースのうちどれが発生したかを確認します。今日の複雑なシステムでは、ステップ実行を避けたいと考えています。)
どの言語で作業していたかはわかりませんでした。Java または C++ の場合は、ブレークポイント プロパティを使用してメソッド (または関数) ブレークポイントに条件を設定できます。両方のケースを示す画像を次に示します。Java の例では、Entry のクリックを解除し、Exit にチェックを入れます。
!
これは Eclipse デバッガーではまだサポートされておらず、機能強化の要求として追加されています。投票していただければ幸いです。