43

VisualStudioでC/C ++をプログラムするとき、何かを壊すためにコマンドを使用してnoop__asm nop;コードを挿入することがよくあります。例えば:

if (someCondition())
{
  __asm nop;
}

状態が発生したときにどうしたらよいかわかりませんが、実行を停止して現在の状態を調べたいと思います。条件付きブレークポイントを作成するのに十分単純な場合もありsomeCondition()ますが、条件付きブレークポイントは、常に可能であるとは限らないことに加えて、実行を大幅に遅くします。

System.Diagnostics.Debugger.Break()ここで、C#では、またはを呼び出してデバッガーに直接侵入しますSystem.Diagnostics.Debugger.Launch()

今、私はJavaをプログラムすることを余儀なくされており、今まで、ただ実行しSystem.out.println("bla-bla")てそこにブレークポイントを設定するよりも良い代替手段を見つけられませんでした。繰り返しになりますが、条件付きブレークポイントが実行できない場合を考えてみてください。

だから、私は疑問に思います-Javaに__asm nopまたはSystem.Diagnostics.Debugger.Break()代替手段はありますか?

4

5 に答える 5

51

バイトコードにはnop命令がありますがnop、Java言語のステートメントはありません。

1行に追加することもできますが;、コードはコンパイルされますが、空の行を追加するよりも意味がありません。

別の「何もしない」ステートメントは次のようになります。

assert true;

これまでのところ副作用はなく、プログラムの実行時にオフにすることができます。

結局のところ、バイトコード命令を生成してassert trueいないようです。これにより、asserttrueのブレークポイントがすべてスキップされます。ただし、Eclipseは次のようなステートメントを破ることができます

assert Boolean.TRUE;

これは非常に似ています。

于 2012-05-24T11:07:32.497 に答える
9

Javaは、これを空のステートメントとして解釈します。

;

ただし、コメントに記載されているように、Eclipseではここにブレークポイントを設定することはできません。ブレークポイントを設定できる役に立たないものが必要な場合は、入力も簡単です。次のことをお勧めします。

if(false){}

コンパイラは、これが入力されないことを警告する場合があります。これは、本番用にコンパイルする前に取り出すように通知するのに役立ちます。お役に立てれば!

于 2015-02-03T16:48:03.837 に答える
7

何もしない任意の代入ステートメントを入れることができます。

if (someCondition()) {
  int t=0;
}

デバッガーはこれを喜んで中断します。はブロックに対してローカルであるためt、副作用が発生する可能性はありません(また、JITコンパイルされたものが本番コードに存在しなくなります)。

または、ブレークポイントが永続的に設定されている静的関数を作成して、次のことを実行することもできます。

if (someCondition()) {
  breakPoint();
}
于 2012-05-24T11:14:48.113 に答える
4

まだ誰もこれを言っていないことに驚いたので、私はこれを新しい答えに分けています。最新のIDEを使用すると、ブレークポイントにロジックを追加できます。デバッグ専用のifステートメントをコンパイルする代わりに、実際に気になる場所にブレークポイントを配置し、それを右クリックして[ブレークポイントのプロパティ]を選択します。

OS Xの右クリックメニューで、下部にブレークポイントのプロパティがあります ヒット数、条件などを表示する[ブレークポイントのプロパティ]ダイアログ。

于 2015-07-27T13:35:31.600 に答える
3

これに対する完璧な解決策は見つかりませんでしたが、これが私が最も気に入っている解決策です。おそらく効率的ではありませんが、ブレークポイントを設定できます。Eclipseは文句を言ったり警告したりせず、コードリーダーの観点からは、何をしたいのかは明らかです。

// Silly method that allows me to make noop
private static void noop() {

}

public otherMethod() { 
    // Here I need breakpoint
    noop();
}

ブレークポイントを事前条件付けする場合は、前に条件を配置します。

public otherMethod() { 
    // Here I need breakpoint
    if(someCondition())
        noop();
}
于 2015-05-06T08:46:26.167 に答える