Interstage Application Server トラブルシューティング集 |
目次
索引
![]() ![]() |
第18章 Java実行環境運用時の異常 | > 18.2 スレッドダンプの見方 |
アプリケーションで例外が発生した場合、以下のタイミングでスタックトレースが出力されます。スタックトレースにはエラーが発生するまでの経緯(メソッドの呼び出し順番)が示されており、スタックトレースを解析することでエラーの発生箇所/発生原因を確認することが可能です。
アプリケーション |
出力方法 |
出力場所 |
---|---|---|
Servlet/JSP/EJBアプリケーション |
アプリケーションでcatchした例外クラス(java.lang.Throwableクラスのサブクラス)に対してprintStackTraceメソッドを実行 |
コンテナログファイル |
アプリケーションのコールバックメソッドからコンテナに例外を返却(コンテナが自動的にスタックトレースを出力) |
コンテナログファイル |
|
その他のJavaアプリケーション |
アプリケーションでcatchした例外クラス(java.lang.Throwableクラスのサブクラス)に対してprintStackTraceメソッドを実行 |
コンソール |
例) printStackTraceメソッドでスタックトレースを出力する方法
******************************************************************************** try { SampleBMPSessionRemote bmpSessionRemote = bmpSessionHome.create(); } catch(Exception e) { e.printStackTrace(); } ********************************************************************************
上記のように実行すると、createメソッドで返却された例外のスタックトレースが出力されます。
発生した例外はtry - catchで拾うことができます。try {...} catchの中で例外が発生すると、catch() {...}の処理が実行されます。例では、try {...} catchでExceptionが発生すると、catch (Exception e) {...}に書かれた処理が実行されます。
上記例では発生した例外に対してprintStackTrace()を実行しています。printStackTrace()は例外のスタックトレースを表示するメソッドです。
以下にスタックトレースの出力フォーマットを示します。
******************************************************************************** 例外クラス名: エラーメッセージ at クラス名.メソッド名1(ソース名:行番号) 呼び出し先 at クラス名.メソッド名2(ソース名:行番号) ↑ at ... 呼び出し元 ********************************************************************************
1行目には、例外クラス名とエラーメッセージが出力されます。エラーメッセージがない場合には例外クラス名のみ出力されます。
2行目以降には、クラス名/メソッド名/ソース名/行番号の情報がメソッドの呼び出し元から呼び出し先に向かって下から上に出力されます。一番上に出力されるメソッドが異常を検知して例外を生成したメソッドです。
スタックトレースの出力例を以下に説明します。
(先頭の"数字:"は、説明の都合上記載しています。)
******************************************************************************** 1:java.lang.NullPointerException 2:at agency.attestation.CheckLoginInfo.doCheck(CheckLoginInfo.java:150) 3:at agency.attestation.AttestationServlet.doGet(AttestationServlet.java:96) 4:at agency.attestation.AttestationServlet.doPost(AttestationServlet.java:161) 5:at javax.servlet.http.HttpServlet.service(HttpServlet.java:772) 6:at javax.servlet.http.HttpServlet.service(HttpServlet.java:865) : ********************************************************************************
1. NullPointerExceptionが発生(例外)
2. 発生個所はagency.attestation.CheckLoginInfoクラスのdoCheckメソッド内であり、CheckLoginInfo.javaの150行目にあたる。
3. doCheckメソッドを呼び出した個所はagency.attestation.AttestationServletクラスのdoGetメソッド内であり、AttestationServlet.javaの96行目にあたる。
4. doGetメソッドを呼び出した個所はagency.attestation.AttestationServletクラスのdoPostメソッド内であり、AttestationServlet.javaの161行目にあたる。
5. doPostメソッドを呼び出した個所はjavax.servlet.http.HttpServletクラスのserviceメソッド内であり、HttpServlet.javaの772行目にあたる。
6. serviceメソッドを呼び出した個所はjavax.servlet.http.HttpServletクラスのserviceメソッド内であり、HttpServlet.javaの865行目にあたる。
スタックトレースの解析方法を以下に説明します。
注)表示の関係上、改行している箇所があるため、実際の出力形式とは若干の違いがあります。
******************************************************************************** java.util.MissingResourceException: Can't find bundle for base name jp.apli.sdk.eie.EIEBufferCSyuyakuListOut, locale ja_JP at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:707) at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:679) at java.util.ResourceBundle.getBundle(ResourceBundle.java:546) at jp.apli.sdk.common.corba.SdkCorbaDataBuffer.<init>(SdkCorbaDataBuffer.java:74) at jp.apli.sdk.common.corba.SdkCorbaData.<init>(SdkCorbaData.java:120) at jp.apli.sdk.eie.servlet.SdkDataBuilder.buildSdkCorbaData (SdkDataBuilder.java:59) at jp.apli.sdk.common.corba.SdkCorbaExec.buildDatas(SdkCorbaExec.java:130) at jp.apli.sdk.common.corba.SdkCorbaExec.function(SdkCorbaExec.java:77) at jp.apli.sdk.eie.servlet.SdkServletEvent$DataSend.exec(SdkServletEvent.java:307) at jp.apli.sdk.common.event.SdkEvent.execEvent(SdkEvent.java:93) at jp.apli.sdk.eie.servlet.SdkServletEvent.execEvent(SdkServletEvent.java:1609) at jp.apli.sdk.eie.servlet.SdkServlet.doPost(SdkServlet.java:700) at javax.servlet.http.HttpServlet.service(HttpServlet.java:772) at javax.servlet.http.HttpServlet.service(HttpServlet.java:865) at com.fujitsu.interstage.jservlet.tomcat.core.ServletWrapper.handleRequest (ServletWrapper.java:415) at com.fujitsu.interstage.jservlet.tomcat.core.ServletWrapper.handleRequest (ServletWrapper.java:447) at com.fujitsu.interstage.jservlet.tomcat.servlets.InvokerServlet.service (InvokerServlet.java:257) at javax.servlet.http.HttpServlet.service(HttpServlet.java:865) at com.fujitsu.interstage.jservlet.tomcat.core.ServletWrapper.handleRequest (ServletWrapper.java:415) at com.fujitsu.interstage.jservlet.tomcat.core.ContextManager.service (ContextManager.java:541) at com.fujitsu.interstage.jservlet.tomcat.service.connector. Ajp12ConnectionHandler.processConnection(Ajp12ConnectionHandler.java:147) at com.fujitsu.interstage.jservlet.tomcat.service.TcpConnectionThread.run (SimpleTcpEndpoint.java:334) at java.lang.Thread.run(Thread.java:484) ********************************************************************************
この例での原因の解析方法を以下に説明します。
対象として考えられるリソースファイル名は次のとおりです。
以下が、所定のディレクトリ構成(jp/apli/sdk/eie/)で置かれているかどうかを確認します。
例外が発生しているのはjava.util.ResourceBundleクラスのthrowMissingResourceExceptionメソッドですが、例外が発生した理由は、指定されたリソースファイルを見つけることができなかったことによります。
リソースファイル名を受け取っているのはjava.util.ResourceBundleクラスのgetBundle()メソッドです。これを呼び出しているのはjp.apli.sdk.common.corba.SdkCorbaDataBufferクラスのコンストラクタ(SdkCorbaDataBuffer.javaの74行目)です。そこで渡すリソースファイル名を誤っていないかどうかを調べます。
目次
索引
![]() ![]() |