概要
Webアプリケーションの開発や保守をしていると、いろいろなバグに遭遇します。メモリーリーク、デッドロック、リダイレクトループ、JVMクラッシュ等々、バグは様々です。こういったバグは、実際にバグを再現するコードを書いて実行し、ツールで解析してみると理解が深まります。
ということで、いろいろなバグを実装したWebアプリケーションをつくってみました。現時点では、以下を簡単に再現できます。
- メモリリーク (Javaヒープ領域)
- メモリリーク (Permanent領域)
- メモリリーク (Cヒープ領域)
- デッドロック (Java)
- デッドロック (SQL)
- 完了しないプロセスの待機
- 無限ループ
- リダイレクトループ
- JVMクラッシュ
- ネットワークソケットリーク
- ファイルディスクリプタリーク
- XSS
- SQLインジェクション
- ExceptionInInitializerError / NoClassDefFoundError
- OutOfMemoryError (Java heap space)
- OutOfMemoryError (Requested array size exceeds VM limit)
- OutOfMemoryError (unable to create new native thread)
- OutOfMemoryError (GC overhead limit exceeded)
- OutOfMemoryError (PermGen space)
- OutOfMemoryError (Direct buffer memory)
- StackOverflowError
- UnsatisfiedLinkError
- 整数オーバーフロー
- 丸め誤差
- 打ち切り誤差
- 情報落ち
Webアプリケーションの起動方法
Webアプリケーションをgit clone
(またはダウンロード)して、mvn install exec:exec
で起動します。
$ git clone https://github.com/k-tamura/easybuggy
$ cd easybuggy
$ mvn clean install exec:exec
以下のようなメッセージが表示されたら、Webアプリケーションの起動は完了しています。
+- sun.nio.ch.ServerSocketChannelImpl[/0:0:0:0:0:0:0:0:8989]
+- qtp142333344{8<=6<=8/254,0} - STARTED
その他の起動方法
ここからダウンロードしたeasybuggy.jarを実行(java -jar easybuggy.jar
)するか、ROOT.warをTomcatなどのサーブレットコンテナにデプロイしてもかまいません。このとき以下のような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とROOT.warは、mvn package
でビルドされます。
起動したら次のURLにアクセスします。
正常に起動していると以下のような画面が表示されます。
リンクのいずれかをクリックすると、問題が発生します。が、その前にVisualVMやJConsoleなどを起動しておくと、どのような現象が起こっているか把握できます。これらのツールを使ったバグの解析方法などについては、今後簡単に説明します。
注意事項
OutOfMemoryError関連のリンク(特にネイティブメモリを操作するもの)をクリックすると、PCの動作が不安定になる可能性があります。CPUやメモリを制限したVM上で起動するなどしてから、自己責任でリンクをクリックして下さい。
詳細
このWebアプリケーションに関するデバッグやトラブルシューティングの方法については、このページを参考にして下さい。