EasyBuggy のトリセツ

EasyBuggyは、JavaのWebアプリケーションで起こりうる様々な問題を、非常に手軽に体験できるWebアプリケーションです。ここでいう問題とは、メモリリークやデッドロックなどの障害、SQLインジェクションやオープンリダイレクトなどの脆弱性、OutOfMemoryErrorなどのエラー、算術オーバーフロー、性能上の問題などいろいろなものが含まれます。

なぜそのようなものをつくったかというと、教育や実験に活用できると考えたからです。問題を再現させて事象を解析してみると、トラブルシューティングの方法やバグ修正の仕方を学ぶことができます。実践的に学習すると予想外な結果が出ることもあり、理由を調査して理解を深めることができます。そして、その経験があることで、実際に本番環境で問題が発生した時でも冷静に対応できるのではないかと考えます。

EasyBuggyの特徴

以下のような点にこだわって開発しました。

  • 簡単、手軽である
  • 多くの技術を使わず、基本的な技術のみを使う
  • IDE、ビルドツールと連携し、開発からデプロイまでが短時間にできる
  • サーブレットコンテナ、DB、LDAPなどを組み込み、インストールや初期設定が不要
  • 単純なパッケージ・クラス構成 (基本的に1機能 – 1サーブレットの関係)
  • デザインは最小限に (本当はこだわりたいんですが…)

スクリーンショット

以下はメインの画面で、ブラウザの言語設定によって日本語と英語が切り替えられるようになっています。見ての通り、いろいろなバグを確認できます。

main

バグのリンクをクリックすると、そのバグが確認できます。以下はOSコマンドインジェクションを確認できるページです。

math

java.lang.Mathを使用した数式を入力すると、計算結果が表示されるという単純な機能の中に、OSコマンドインジェクションの脆弱性があります。(i)マークで始まる説明の通り、特定の文字列を入力すると、致命的な問題が発生します。

起動方法

EasyBuggyを起動して、http://localhost:8080にアクセスすると、先ほどのメインページが表示されます。起動方法には次の3つがあります。

  • javaコマンドで起動
  • mvnコマンドで起動
  • warファイルをサーブレットコンテナにデプロイして起動

それぞれどのように使い分けるか説明します。

● javaコマンドで起動:

もっとも関単にEasyBuggyを起動する方法です。easybuggy.jarをダウンロードして、次のコマンドで起動します。

$ java -jar easybuggy.jar

この時、以下のようにJVMオプションを指定しておくと、問題が発生しやすく、またログを確認しやすくなります。

$ java -Xmx256m -XX:MaxPermSize=64m -XX:MaxDirectMemorySize=90m -XX:+UseSerialGC -Xloggc:logs/gc.log -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M -XX:GCTimeLimit=15 -XX:GCHeapFreeLimit=50 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/ -XX:ErrorFile=logs/hs_err_pid%p.log -XX:NativeMemoryTracking=summary -agentlib:jdwp=transport=dt_socket,server=y,address=9009,suspend=n -Dderby.stream.error.file=logs/derby.log -Dderby.infolog.append=true -Dderby.language.logStatementText=true -Dderby.locks.deadlockTrace=true -Dderby.locks.monitor=true -Dderby.storage.rowLocking=true -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7900 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar easybuggy.jar

easybuggy.jarはPayara Microを組み込んでいるので、Tomcatなどのサーブレットコンテナが無くても、起動することができます。easybuggy.jarはTomcatを組み込んでいるので、サーブレットコンテナが無くても、起動することができます(バージョン1.3.0から変更しました)。

● mvnコマンドで起動:

次のコマンドでビルドから、起動までが一気にできます。

$ mvn clean install exec:exec

新しい機能を追加したり、ソースコードを変更して動作確認してみたい場合、このコマンドを実行すればビルドして、すぐに動作確認をすることができます。

mvnコマンドを実行する場合は、Payara Microではなく、組み込みのJettyサーバーが起動します。mvnコマンドを実行する場合も、組み込みのTomcatサーバーが起動します(バージョン1.3.0から変更しました)。

● warファイルをサーブレットコンテナにデプロイして起動:

Tomcat以外のコンテナにもデプロイできます。ROOT.warをダウンロードして、PayaraやJettyなどにデプロイすれば、起動します。easybuggy.jarを起動したときと同様にJVMオプションを指定することをお勧めします。

開発する方法

EasyBuggyはMavenのプロジェクトとして開発しているので、Eclipseで開発するためには、次のコマンドを実行します。

> mvn eclipse:eclipse

このコマンドを実行すると、Eclipseのプロジェクトに必要な .classpath や .project ファイルが作成されます。このプロジェクトをインポートすれば、Eclipseでソースコードを参照したり、改造したりすることができます。

デバッグする方法

Eclipseの場合は、次のデバッグ設定を追加することでデバッガーをアタッチすることができます。

  • Connection type: Standard (Socket Listen)
  • Host: localhost
  • Port: 9009

Screenshot-Debug Configurations

注意事項

OutOfMemoryError関連のリンク(特にネイティブメモリを操作するもの)をクリックすると、PCの動作が不安定になる可能性があります。CPUやメモリを制限したVM上で起動するなどしてから、自己責任でリンクをクリックして下さい。

既知の問題と対策の方法

Javaやサーブレットコンテナのバージョンにも依存しますが、Windows上での動作で問題が出る場合があります。

● メインページにアクセスすると、内部サーバーエラーが発生する(v 1.3.0より前のバージョンでの問題):

easybuggy.jarで起動した場合、Javaのバージョンによっては、メインページにアクセスすると次のエラーが発生する場合があります。

HTTP Status 500 – Internal Server Error

org.apache.jasper.JasperException: PWC6345: There is an error in invoking javac.  A full JDK (not just JRE) is required

この場合は、JDK/binを環境変数「path」に追加し、JRE/bin/javaを実行して下さい。

> set path=%path%;C:\Program Files\Java\jdk1.8.0_121\bin
> "C:\Program Files\Java\jdk1.8.0_121\jre\bin\java" -jar easybuggy.jar

● 「Failed to delete ○○.jar」のエラーが出力されて起動できない:

mvnコマンドで起動した場合、JavaのバージョンによってはCtrl+CでもEasyBuggyのプロセスが停止しない場合があります。この場合は、起動時に次のようなエラーが出力されます。

> mvn clean install exec:exec
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building easybuggy 1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ easybuggy ---
[INFO] Deleting C:\Users\ktamura\git\easybuggy\target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.681 s
[INFO] Finished at: 2017-03-14T09:45:18+09:00
[INFO] Final Memory: 7M/155M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project easybuggy: Failed to clean project: Failed to delete C:\easybuggy\target\easybuggy-1-SNAPSHOT\WEB-INF\lib\xom-1.2.5.jar -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

この場合は、「JVMクラッシュ」や「コードインジェクション」のページにアクセスして、EasyBuggyのプロセスを強制的に停止させてしまうのが、手っ取り早いです 🙂 。「JVMクラッシュ」で停止させる場合は、logsディレクトリにコアダンプが出力されるので、増えてきたら削除して下さい。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中