web-dev-qa-db-ja.com

サードパーティライブラリのEclipseにブレークポイントを設定する方法は?

サードパーティライブラリのクラスでNullPointerExceptionを取得しています。次に、すべてをデバッグしたいと思います。どのオブジェクトからクラスが保持されているかを知る必要があります。しかし、サードパーティのクラスにブレークポイントを設定できないように思えます。

誰かが私のトラブルから抜け出す方法を知っていますか?もちろん、私はEclipseをIDEとして使用しています。

更新:ライブラリはオープンソースです。

54
boutta

これを行うための最も確実な方法(そして実際に有用なものになる)は、ソースをダウンロードし(オープンソースと言います)、そのソースを指す別の「Javaプロジェクト」をセットアップすることです。

そのためには、ソースをダウンロードして、システムのどこかに解凍します。 「ファイル」->「新規」->「Javaプロジェクト」をクリックします。次のダイアログでプロジェクト名を指定し、「既存のソースからプロジェクトを作成」を選択します。オープンソースライブラリのルートの場所を参照します。

プロジェクトに必要な追加ライブラリなどがすべて、ダウンロードしたプロジェクトに含まれているとすると、Eclipseはすべてを把握し、ビルドパスを設定します。

プロジェクトのビルドパスからオープンソースjarを削除し、この新しいプロジェクトをプロジェクトのビルドパスに追加する必要があります。

これで、これをコードとして扱い、自由にデバッグできます。

これは、他のアプローチで少なくともいくつかの問題を回避します。

  1. Jarファイルに「ソースを添付」できますが、デバッグ情報なしでjarファイルがコンパイルされた場合、これはまだ機能しません。 jarファイルがデバッグ情報(lines,source,vars... http://Java.Sun.com/j2se/1.3/docs/tooldocs/win32/javac.html 、および-gオプション)。

  2. 「例外ブレークポイント」を追加して、NullPointerExceptionがいつ発生するかを確認できますが、これは一般的な例外であり、探しているものよりも何百回も前に発生して処理される可能性があります。さらに、元のソースがないと、NullPointerExceptionをスローしているコードについてほとんど何も見ることができません。何が問題なのかを理解できる可能性はかなり低いです。

35
Jared

特定の例外にブレークポイントを設定することもできます。デバッグの観点から、「Add Java Exception Breakpoint」」ボタンがあり、そこに「NullPointerException」を追加できます。デバッガーは、そのような例外が発生するとすぐに実行を中断します。

6
lindelof

ソースをアタッチする(またはソースjarを自動的にアタッチするものを使用する)だけで、関心のある行の左側をダブルクリックして、通常の方法でブレークポイントを設定します。

1
Robin Green

MavenのマテリアライズドWebアプリでこの作業を行うには、3つのことをしなければなりませんでした。

1)サードパーティjarのソースコードを使用して、新しいEclipseプロジェクトを作成します。

2)pom.xml依存関係からjarへの参照を削除します。

3)プロジェクトプロパティのDeployment Assemblyに新しいEclipseプロジェクトを追加します。

4)プロジェクトのプロパティに新しいEclipseプロジェクトを追加します-> Java Build Path->サードパーティのプロジェクトを参照する既存のプロジェクトのプロジェクト。

3番目のプロジェクトがソースとともにmavenリポジトリに正しく追加されている場合、mavenは適切なソースコードを自動的にダウンロードし、上記の手順を実行しなくてもブレークポイントを追加できます。しかし、私はあなたがいつもこれに頼ることができないことを学びました。

1
Ted Gulesserian

通常、ブレークポイントを設定できるはずです。特にサードパーティのライブラリがオープンソースの場合。しかし、サードパーティのライブラリが商用ベンダーのものである場合、デバッグフラグをオフにしてソースをコンパイルしている可能性があります。これにより、デバッグすることができなくなります。ベンダーは、ライブラリのリバースエンジニアリングを不可能にするために難読化プロセスの一部としてこれを行っているか、単にコンパイルされた最終クラスが小さくなるためです。

1