2009-04-15 7 views
29

jdiインターフェイスを使用してデバッガを作成しています。メソッド入力トレースを有効にするためにMethodEntryRequestsを使用すると、デバッグされたプログラムが数十倍遅くなります。メインスレッドのフィルタを設定し、ポリシーをSUSPEND_EVENT_THREADに中断しました。 Classfilterは限られています。受け取ったイベントを印刷した場合は、それ以上の数のイベントは表示されません。 (私は、デバッガはそれがいずれかと一致するかどうかを確認するために、すべてのメソッド呼び出しのためにウェイクアップする必要があることを前提となりメソッドエントリのデバッグを使用すると、デバッグされたプログラムが遅くなるのはなぜですか?

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=y,server=y,address=1337

+0

良い質問に行きます。 EclipseでJavaプログラムをデバッグしているときに、メソッド入力ブレークポイントがかなり遅くなっていることに気付きました。私は誰かが答えを持って願っています! –

+0

最近のJavaバージョンで状況が改善したのですか、それとも同じですか? – WSS

答えて

30

簡単な答えは、メソッドエントリが設定されているときにインタープリタを実行することです。私はこの周りにはとにかくあるとは思わない...

これは、すべてのコードがデバッグモードで実行されていたが、it was enhanced in 1.4 ...これは、「フルスピード」デバッグの場合を除いて動作するメソッドのエントリと終了、ウォッチポイント、およびシングルステッピングの場合、またはブレークポイントを含むメソッドの場合。

+1

実際には意味があります... HotSpotは、コードをコンパイルする際に高速化のためにあらゆる種類の良いことを行います(関連するメソッド間の境界をぼかすインラインメソッドを含む)。さらに、メソッドの実行方法を変更することができるように、実行間で適応的です。間違いなく、デバッグの途中で起きたがっていることではありません。 – Ichorus

5

:私は、ローカルデバッグおよびデバッグJavaプログラムとコマンドラインのfollowind種類を持っていますs)が破られた。実行可能になる前にすべてのメソッド呼び出しをチェックする必要があるため、これらのチェックをすべて行う必要がない場合よりもかなり遅くなります。

9

2の理由:

    それはすべてのメソッドエントリ にチェックを追加する必要があり
  1. メソッドのインライン化が不可能 (非常に小さいメソッドになります10~100倍を実行します(ただ、いくつかの方法を微調整するためのオプションはありません)倍遅く)

同じことがプロファイラーと.NETアプリケーション

+1

メソッドインライン化が不可能になるのはなぜですか? –

+4

メソッドインライン化は、そのメソッドがもうなくなったことを意味します。そのため、その全体のコンテンツは呼び出し元のすべての場所でINLINEDされ、メソッド呼び出しは発生しません。しかし、デバッガにはその方法が必要です。なぜなら、デバッガはその場所を取っている場所だからです。 – Mash

+0

妥当だが強くない音がする。 INLINEDメソッドはデバッガでもトレースできますか?技術的には、それがインラインになっている包囲方法を知っているべきですか? –

関連する問題