Interstage Application Server トラブルシューティング集
目次 索引 前ページ次ページ

第18章 Java実行環境運用時の異常> 18.2 スレッドダンプの見方

18.2.1 スタックトレース

 アプリケーションで例外が発生した場合、以下のタイミングでスタックトレースが出力されます。スタックトレースにはエラーが発生するまでの経緯(メソッドの呼び出し順番)が示されており、スタックトレースを解析することでエラーの発生箇所/発生原因を確認することが可能です。

アプリケーション

出力方法

出力場所

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

 スタックトレースの出力例を以下に説明します。
 (先頭の"数字:"は、説明の都合上記載しています。)

********************************************************************************
  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行目にあたる。

■解析方法1

 スタックトレースの解析方法を以下に説明します。

  1. エラーメッセージが出力されている場合、メッセージから原因を特定できないかを確認してください。
  2. スタックトレースの先頭行のクラスがアプリケーション開発者の作成したクラスである場合、ソースファイルを参照して例外の発生した行に問題がないか確認してください。
  3. 先頭行のクラスがアプリケーション開発者の作成したクラスでない場合、トレースの最上行にあるアプリケーション開発者の作成したクラスを探し、そのクラスから呼び出しているメソッドのインタフェース仕様書(JavaDocなど)を参照して引数に問題がないかを確認してください。
  4. 3.で解決できない場合には、アプリケーション開発者の作成したクラスから呼び出しているクラスの提供元に調査を依頼してください。

■出力例2

 注)表示の関係上、改行している箇所があるため、実際の出力形式とは若干の違いがあります。

********************************************************************************
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)
********************************************************************************

■解析方法2

 この例での原因の解析方法を以下に説明します。

  1. エラーメッセージが出力されている場合、メッセージから原因を特定できないかを確認します。
    JavaDocで確認するとMissingResourceExceptionは、Javaのリソース(リソースファイル、リソースファイル内のプロパティ)がない場合に発生する例外です。
    この場合は例外メッセージから、jp.apli.sdk.eie.EIEBufferCSyuyakuListOutというリソースファイルの日本語版(ja_JP)がないために発生したことが分かります。
     
  2. リソースファイルについて確認します。
    調査ポイントは次の2つとなります。
    1. リソースファイルが存在するか、所定のディレクトリ構成で置かれているかどうか。
    2. リソースファイル名を誤っていないかどうか。

a)リソースファイルが存在するかどうか。

 対象として考えられるリソースファイル名は次のとおりです。
 以下が、所定のディレクトリ構成(jp/apli/sdk/eie/)で置かれているかどうかを確認します。

b)リソースファイル名を誤っていないかどうか。

 例外が発生しているのはjava.util.ResourceBundleクラスのthrowMissingResourceExceptionメソッドですが、例外が発生した理由は、指定されたリソースファイルを見つけることができなかったことによります。
 リソースファイル名を受け取っているのはjava.util.ResourceBundleクラスのgetBundle()メソッドです。これを呼び出しているのはjp.apli.sdk.common.corba.SdkCorbaDataBufferクラスのコンストラクタ(SdkCorbaDataBuffer.javaの74行目)です。そこで渡すリソースファイル名を誤っていないかどうかを調べます。


目次 索引 前ページ次ページ

Copyright 2006 FUJITSU LIMITED