4

たまにEclipseデバッグモードになっているので、現在検査/監視しているオブジェクトを選択し、その上にある種の「オブジェクトブレークポイント」を配置して、次のコード行に進むことができればと思います。それにアクセスします。

これで、クラスにブレークポイントを設定できることがわかりましたが、通常、メモリには数百または数千ものインスタンスがあり、そのほとんどは長寿命です。彼らはしばしばフレームワークに出入りします。それらはコレクションにラップされ、フィルタリングされ、再びラップ解除されます。つまり、通常の大規模なアプリケーションです。

通常、条件付きメソッドのブレークポイントと多くの情報に基づいた推測を使用して、そのオブジェクトのまれな機能を探すことで問題を見つけます。ただし、説明されている機能のようなものがあれば、はるかに高速になることがあると思います。

いくつか検索した後に見つけたのは、デバッグプロキシです(例までスクロールダウンしてください)。これは、JavaリフレクションAPIを使用して、それ自体を含まれているオブジェクトのように見せるためのコンテナクラスであるため、アプリケーションで含まれているオブジェクトの代わりに使用できます。InvocationHandlerであるため、DebugProxyは、含まれているオブジェクト内のメソッドの呼び出しを「インターセプト」できるようになりました。

実際のデバッグにプロキシを使用するのは、この行をアプリケーションに追加するのと同じくらい簡単です。

IMyObject = (IMyObject) DebugProxy.newInstance(new MyObject());

次に、DebugProxiesソースコード内にブレークポイントを設定できます。

ただし、このアプローチには少なくとも2つの問題があります。

  1. 動作しますが、それでもハックであり、フィルタリングオプションなど、多くの機能が不足しています。
  2. Proxy-Objectを実装クラスにダウンキャストすることはできません

2.問題はより深刻な問題です。EMFによって生成されたクラスでDebugProxyを使用することができ、フレームワーク全体でオブジェクトを追跡するのに問題はありません。ただし、すべての興味深いクラスのインターフェイスを使用しないコードをデバッグしようとすると、DebugProxyはすぐに失敗します。

誰かが代替案について知っていますか?たぶん、Eclipse JDTデバッガーにはすでにそのような機能があり、私にはそれが表示されません!?

JavaインストルメンテーションAPIやAspectJなどのフレームワークがあることは知っています。これらを使用して実用的な解決策を得ることができますか?

4

1 に答える 1

1

DebugProxyに基本的なフィルタリングを追加し、出力を変更して、Eclipseコンソールビューにコードの呼び出し行へのリンクが表示されるようにしました。 ここに画像の説明を入力してください

ただし、問題2は未解決のままです。ソースコードをGitHubに載せました。多分誰かが何かを思い付くでしょう。

これにアプローチするまったく異なる方法は、現在のhashCode()を問題のオブジェクトのHashCodeと比較する条件でブレークポイントを自動的に追加することです。これは、JDTの内部について詳しく知っている人にとってはそれほど難しいことではないかもしれません。

于 2012-11-25T18:14:40.550 に答える