Java:WEBアプリをjavaでデバッグしよう

WEBアプリをデバッグするとは?

WEBアプリがローカルPC & Eclipseで動かしているのであれば、デバッグするのは簡単ですが、
別のサーバで動いている場合でもデバッグすることが出来ます。
在宅でVPNから接続していても出来るので、ぜひやり方だけでも知っておきましょう。

Javaをデバッグモードで起動しよう

まずは、Java側をデバッグモードで起動する必要があります
1.通常はjavaのプロセスはデバッグ用のポートが空いていないので、起動オプションに「★ -agentlib:jdwp=transport=dt_socket,address=*:8787,server=y,suspend=n」を追加して、デバッグ用のポートを開けます。
 「address=*:8787」:8787番ポートでデバッガーからの接続を待ち受けするよ。の意味。Java 8以前は *: が不要でした。
 「suspend=n」:yにすると、デバッガーから接続が来るまで、WEBアプリが停止します。特別な理由がない限りは、nで問題ありません。

2.WEBアプリを再起動し,「ps -ef | grep java | grep 8787」を実行してください。
3.「★ -agentlib:jdwp=transport=dt_socket,address=*:8787,server=y,suspend=n」が追加された状態で、javaプロセスが起動していることを確認してください。

これで以下のように、javaプロセス側で8787ポートを開けることが出来ました。

※起動しないなどのエラーが発生する場合は、正しく追加されていないので、再度、起動オプションを見直してください
※Jbossを使っている場合、standalone.confには、以下のようなサンプルがあるので、コメントアウトを外すだけで、追加可能です。
# Sample JPDA settings for remote socket debugging
#JAVA_OPTS=”$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n”

SSHポート転送を使い、WEBアプリサーバの8787ポートとローカルPCの8787ポートを接続しよう

ローカルで、SSHコマンドが使えればいいのですが、通常は使えないのでteratermを使ってSSHポート転送を実施します
1.WEBサーバにteratermで接続します。
2.「設定 > SSH転送(O)…」を選択します。

3.SSHポート転送画面から「追加(A)…」ボタンを押下します。

4.ローカルのポート(L)、リモート側のポートに「8787」を入力し、「OK」ボタンを押下します。

5.以下のように追加されたらポート転送の設定が完了です。

これで以下の赤矢印線のようにポート転送をすることが出来ます。

ローカルPCのEclipseからWEBアプリサーバ側のJavaプロセスに接続しよう

これでWEBアプリに接続する準備が出来たので、ローカルPCからデバッグしましょう。
1.まずはEclipseを起動します。
2.「実行(R) > デバッグ構成(B)…」を選択します。

3.デバッグ構成画面から「リモートJavaアプリケーション」を選択し、「新規構成」ボタンを押下します。

4.以下のように入力し、「デバッグ」ボタンを押下します。
 名前(N):[任意の名前]
 接続タブ
  プロジェクト(P):「参照(B)…」ボタンから[デバッグしたいプロジェクト]を選択します。
  ホスト(H):localhost
  ポート(R):8787

4´.[デバッグしたいプロジェクト]でコンパイルエラーなどが発生していると、以下のようなポップアップが出る場合がありますが、そのまま「続行(P)」を押下して大丈夫です。

5.「デバッグ」ボタンを押下した後、特にエラーが発生しなければデバッグ出来ます。
「ウィンドウ(W) > ビューの表示(V) > デバッグ」を選択して、デバッグのウィンドウを表示しましょう。

6.以下のように画面にjavaのプロセスが表示されたら、WEBアプリに接続が成功しています。
ブレイクポイントを設定し、WEBアプリ側でその個所を通ったら、その位置で止めることが出来ます。変数などの参照が可能になりますので、確認してみてください。

これで以下のように、ローカルPCのEclipseからWebアプリサーバのjavaプロセスに接続することが出来ました。