3

デバッガーを使用してプログラムをステップ実行し、何が起こっているのかを確認する必要がなかった理由はわかりません。おそらく、デバッグ コードを追加するのが非常に簡単になる PHP などのインタープリター言語を使用することに慣れているためです ( print_r) 変更をライブで確認できます。

しかし、この新しい Java プロジェクトでは、正しいデバッグ方法を学ばなければならないと感じています。

このプログラムは、私が作成したものではありませんが、Tomcat 上で実行され、基本的な JSP を使用します。問題は、特定の JSP ページにアクセスしようとすると、例外がスローされ、何が起こったかのスタック トレースが表示されることです。

org.apache.jasper.JasperException: java.lang.NullPointerException
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:503)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:363)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:306)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.sgrp.singer.filters.SingerLoginFilter.doFilter(SingerLoginFilter.java:128)

JDB などのツールを使用してプログラムをステップ実行するにはどうすればよいですか? JSP が行っていることを模倣する必要があるため、特定のクラスを実際にステップ実行することはできません... IDE を使用せずに、コマンドラインからこれを実行したいと考えています。

4

4 に答える 4

2

まず、デバッガーをプラグインするために、Java を特定のパラメーターで開始する必要があります。

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

私たちの目的のために使用されるパラメータです。その後、IDE を使用して、デバッガーをリモートで接続します。コードの一部にブレークポイントを設定すると (ローカル ファイルとリモート プログラムがまったく同じリビジョンであることを確認してください)、エラーが発生します。キャッチされていない例外にブレークポイントを設定することもできます。

ヒント: 参照されているエラー キャッチング JSP (error.jsp) を変更して、キャッチされた例外のスタック トレース (ex.getStracktrace) だけでなく、原因となっているスタック トレース (ex.getCause().getStacktrace) も表示することができます。 ()))。これは、より高いレベルの例外の原因を特定するのに役立つ場合があります。

編集: 申し訳ありませんが、IDE がなければ、これは人間には不可能な情報オーバーフローです。Tomcat アプリケーションはアーキテクチャ レベルで複雑であり、最も簡単な要求のために多数の異なるクラスを切り替えます。

于 2010-11-03T13:23:35.420 に答える
1

デバッガーを Tomcat にフックするよりも使いやすい代替ソリューション:

まず、コール スタックを見てみましょう。下部に、 という名前のクラスが表示されますorg.sgrp.singer.filters.SingerLoginFilter。問題はここ、 method の 128 行にありますdoFilter

最初の行は言うorg.apache.jasper.JasperException: java.lang.NullPointerException。つまり、前述のクラスの 128 行目で値が null であるオブジェクトを使用したことを意味します。

そのコードをチェックして、何が問題なのかを見つけてください。また、いくつかの print/logging ステートメントをコードに追加します。

デバッグは最後の手段です。スタック トレースを見るだけで多くの情報を収集できます。

于 2010-11-03T13:24:03.400 に答える
1

JDB を使用することもできますが、それは私の最初の選択肢ではありません。

使用方法については、次のとおりです 。 http://www.javaworld.com/javaworld/javaqa/2000-06/04-qa-0623-jdb.html

ファイルをコンパイルして Tomcat に接続できるように設定するときは、デバッグ情報を含めることを忘れないでください。これは、他の投稿で言及されている文字列です。

-Xdebug -Xnoagent -Djava.compiler=NONE-Xrunjdwp:server=y, transport=dt_socket,address=8000,suspend=y

8000 は他の数値に置き換えることができます。基本的に、デバッガーのそのポートでリッスンするように jvm に指示します。

これから何が起こるかというと、Tomcat は起動しますが、それ自体を中断し、続行する前にデバッガーがアタッチされるのを待ちます。

JDB を起動してアタッチします。

jdb -attach localhost:8000

ここで、localhost は別のマシンで実行されている場合は Tomcat が実行されている場所に置き換えることができ、8000 は Tomcat で jvm を設定したポートに置き換えることができます。

これでデバッグできます。jdb で help と入力すると、デバッグ手順が表示されます。

于 2010-11-03T15:39:56.467 に答える
0

私は常にEclipseデバッガーを使用しており、Eclipse内でTomcatを実行するか、Eclipseを別の、しかしEclipseに対してローカルなjbossサーバーに接続しています。

夢のように動作し、jvm 設定などを変更する必要はありません。

于 2010-11-03T13:26:42.403 に答える