(57)【特許請求の範囲】
【請求項１】
プログラムを実行する実行手段と、
前記プログラムの故障を検知する検知手段と、
前記検知手段が前記プログラムの故障を検知したときに、前記実行手段からソースファイル名を含む各スタックフレームの実行位置情報を取得する取得手段と、
ダンプ対象判定条件としてソースファイル名を記載した設定情報を格納した記憶手段と、
前記スタックフレーム毎に、当該スタックフレームの実行位置情報と前記記憶手段から読み出した前記設定情報に記載された前記ダンプ対象判定条件とを比較して当該スタックフレームがダンプ対象であるか否か判定する判定手段と、
前記判定手段がダンプ対象であると判定した前記スタックフレームから参照可能な情報を再帰的に全て辿って前記実行手段から取得してコアファイルに出力する出力手段と、
を有することを特徴とするコアファイル取得装置。
【請求項２】
前記判定手段は、前記検知手段が前記プログラムの故障を検知したときに、前記設定情報を前記記憶手段から読み出すことを特徴とする請求項１記載のコアファイル取得装置。
【請求項３】
実行手段が実行するプログラムの故障を検知するステップと、
前記プログラムの故障を検知したときに、前記実行手段からソースファイル名を含む各スタックフレームの実行位置情報を取得するステップと、
ダンプ対象判定条件としてソースファイル名を記載した設定情報を格納した記憶手段から当該設定情報を読み出すステップと、
前記スタックフレーム毎に、当該スタックフレームの実行位置情報と前記ダンプ対象判定条件とを比較して当該スタックフレームがダンプ対象であるか否か判定するステップと、
ダンプ対象であると判定した前記スタックフレームから参照可能な情報を再帰的に全て辿って前記実行手段から取得してコアファイルに出力するステップと、
を有することを特徴とするコアファイル取得方法。
【請求項４】
前記プログラムの故障を検知したときに、前記記憶手段から前記設定情報を読み出すことを特徴とする請求項３記載のコアファイル取得方法。
【請求項５】
請求項１又は２に記載のコアファイル取得装置を構成する各手段としてコンピュータを機能させるためのコアファイル取得プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムに故障が発生したときの実行環境情報をコアファイルに出力する技術に関する。
【背景技術】
【０００２】
実行中のプログラムに故障が発生したときのメモリの内容などをファイルとして保存することで、後でそのファイルを解析して故障発生時のプログラムの実行状態や故障の原因を調査することが可能となる。故障発生時の実行環境情報を保存したファイルのことをコアファイルといい、コアファイルを取得することをコアダンプという（非特許文献１参照）。また、コアファイルの解析を効率化する技術も知られている（非特許文献２参照）。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】"Debugging with GDB  10.17 How to Produce a Core File from Your Program", [online], ［平成２１年１０月３０日検索］, インターネット〈ＵＲＬ：http://sourceware.org/gdb/current/onlinedocs/gdb.html〉
【非特許文献２】"ＯＳＳ性能・信頼性評価／障害解析ツール開発  ＯＳ層  〜Ａｌｉｃｉａ編〜", [online], ［平成２１年１０月３０日検索］, インターネット〈ＵＲＬ：http://www.ipa.go.jp/software/open/forum/development/download/051115/OS-Alicia.pdf〉
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、従来の技術では、プログラムが利用している全てのメモリ内の情報をダンプ対象とするため、コアファイルの取得に膨大な時間がかかったり、コアファイルのサイズが巨大化するという問題があった。非特許文献２は、コアファイルの解析を効率化するものであるが、コアファイルの取得時間やサイズを縮小する効果はない。
【０００５】
コアファイルに出力するダンプ対象を指定してファイルサイズを縮小することが考えられるが、ダンプ対象を効果的に指定しないと、解析に必要な情報を対象外としたり、ダンプ対象が多くてファイルサイズをあまり縮小できない可能性もある。
【０００６】
本発明は、上記に鑑みてなされたものであり、その目的とするところは、コアダンプ時間の短縮、コアファイルのサイズの縮小を実現することにある。
【課題を解決するための手段】
【０００７】
第１の本発明に係るコアファイル取得装置は、プログラムを実行する実行手段と、プログラムの故障を検知する検知手段と、検知手段がプログラムの故障を検知したときに、実行手段からソースファイル名を含む各スタックフレームの実行位置情報を取得する取得手段と、ダンプ対象判定条件としてソースファイル名を記載した設定情報を格納した記憶手段と、スタックフレーム毎に、当該スタックフレームの実行位置情報と記憶手段から読み出した設定情報に記載されたダンプ対象判定条件とを比較して当該スタックフレームがダンプ対象であるか否か判定する判定手段と、判定手段がダンプ対象であると判定したスタックフレームから参照可能な情報を再帰的に全て辿って実行手段から取得してコアファイルに出力する出力手段と、を有することを特徴とする。
【０００８】
上記コアファイル取得装置において、判定手段は、検知手段がプログラムの故障を検知したときに、設定情報を記憶手段から読み出すことを特徴とする。
【０００９】
第２の本発明に係るコアファイル取得方法は、実行手段が実行するプログラムの故障を検知するステップと、プログラムの故障を検知したときに、実行手段からソースファイル名を含む各スタックフレームの実行位置情報を取得するステップと、ダンプ対象判定条件としてソースファイル名を記載した設定情報を格納した記憶手段から当該設定情報を読み出すステップと、スタックフレーム毎に、当該スタックフレームの実行位置情報とダンプ対象判定条件とを比較して当該スタックフレームがダンプ対象であるか否か判定するステップと、ダンプ対象であると判定したスタックフレームから参照可能な情報を再帰的に全て辿って実行手段から取得してコアファイルに出力するステップと、を有することを特徴とする。
【００１０】
上記コアファイル取得方法において、プログラムの故障を検知したときに、記憶手段から設定情報を読み出すことを特徴とする。
【００１１】
第３の本発明に係るコアファイル取得プログラムは、上記コアファイル取得装置を構成する各手段としてコンピュータを機能させることを特徴とする。
【発明の効果】
【００１２】
本発明によれば、コアダンプ時間の短縮、コアファイルのサイズの縮小を実現することができる。
【図面の簡単な説明】
【００１３】
【図１】実施例１におけるコアファイル取得装置の構成を示す機能ブロック図である。
【図２】実施例１におけるコアファイル取得装置の処理の流れを示すフローチャートである。
【図３】上記コアファイル取得装置によりコアファイルに出力される情報を説明するための概略説明図である。
【図４】実施例２におけるコアファイル取得装置の構成を示す機能ブロック図である。
【図５】実施例２におけるコアファイル取得装置の処理の流れを示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下、本発明の実施の形態について図面を用いて説明する。
【実施例１】
【００１５】
図１は、実施例１におけるコアファイル取得装置の構成を示す機能ブロック図である。同図に示すコアファイル取得装置１は、実行部１１、検知部１２、取得部１３、判定部１４、および記憶部１５を備える。以下、各部の詳細について説明する。
【００１６】
実行部１１は、演算処理装置、メモリ等を備え、コアダンプ取得対象プログラムを実行する。コアダンプ取得対象プログラム内で故障が発生すると、実行部１１は検知部１２に故障発生通知を送信する。コアダンプ取得対象プログラム内で発生する故障は、例えば、変数の値が不正な値になることなどである。
【００１７】
検知部１２は、実行部１１から故障発生通知を受信することでコアダンプ取得対象プログラムの故障を検知し、取得部１３へコアファイル取得要求を発行する。故障発生通知およびコアファイル取得要求には、コアダンプ取得対象プログラムを識別する識別子が含まれる。なお、検知部１２が実行部１１にアクセスして故障を検知するものでもよい。
【００１８】
取得部１３は、検知部１２からのコアファイル取得要求に応じてコアダンプ取得対象プログラムに接続し、スタックフレームの実行位置情報を取得する。そして、スタックフレーム単位でダンプ対象であるか否かを判定部１４に問い合わせ、ダンプ対象と判定されたスタックフレームから参照可能な情報を実行部１１から取得してコアファイル１５１に出力する。スタックフレームは、メソッドが呼び出されたときに実行部１１のメモリに確保される記憶領域であり、メソッド内で利用される変数などの情報が格納される。メソッド内で別のメソッドを呼び出すと別のメソッド用のスタックフレームがメモリに確保される。スタックフレームの実行位置情報は、ソースファイル名、ソースファイル中の行番号、クラス名、メソッド名などの情報を含み、コアダンプ取得対象プログラムの現在の実行位置を知ることができる情報である。スタックフレームから参照可能な情報は主に変数であり、スタックフレーム内の変数だけでなく、スタックフレーム内の変数が参照し、その変数から辿ることができる変数もコアファイル１５１に出力する参照可能な情報である。
【００１９】
判定部１４は、取得部１３が指定したスタックフレームがダンプ対象であるか否かを判定する。スタックフレームがダンプ対象であるか否かの判定は、取得部１３から判定するスタックフレームの実行位置情報を受信し、受信した実行位置情報と記憶部１５に格納された設定ファイル１５２とを比較することで行う。設定ファイル１５２には、ダンプ対象から除外するソースファイル名、クラス名の一部などのダンプ対象判定条件が記載されている。例えば、あるスタックフレームの実行位置情報のソースファイル名が設定ファイル１５２に除外対象として記載されている場合は、そのスタックフレームはダンプ対象ではないと判定する。また、設定ファイル１５２にソースファイル名に加えてクラス名の一部が記載されているときは、ソースファイル名が一致し、さらに、実行位置情報のクラス名が設定ファイル１５２に記載されたクラス名の一部を含む場合は、そのスタックフレームはダンプ対象ではないと判定する。なお、判定部１４が故障発生前に設定ファイル１５２を取得してもよいが、検知部１２が故障発生通知を受信したときに判定部１４が設定ファイル１５２を取得する場合は、コアダンプ取得対象プログラム内で故障が発生するまでは設定ファイル１５２を取得しないので、実際に検知部１２が故障を検知するまではコアダンプ取得対象プログラムの挙動への影響がほとんどない。
【００２０】
記憶部１５は、上述した設定ファイル１５２を記憶するのに加えて、取得部１３が出力した情報をコアファイル１５１に記憶する。
【００２１】
次に、コアファイル取得装置１の処理の流れについて説明する。図２は、実施例１におけるコアファイル取得装置１の処理の流れを示すフローチャートである。
【００２２】
まず、検知部１２が実行部１１から故障発生通知を受信してコアダンプ取得対象プログラムの故障を検知すると、検知部１２は、取得部１３へコアファイル取得要求を発行する（ステップＳ１１）。取得部１３がコアファイル取得要求を受信すると、取得部１３は、コアダンプ取得対象プログラムに接続してコアファイル取得対象プログラムの動作を停止させ、全スタックフレームを列挙し、スタックフレーム毎に以下の処理を行う。
【００２３】
取得部１３は、スタックフレームの実行位置情報を実行部１１から取得する（ステップＳ１２）。取得した実行位置情報は、記憶部１５のコアファイル１５１に出力する。実行位置情報の取得時間もサイズも他のダンプする情報に比べてかなり小さいため、本実施例では、ダンプ対象であるか否かに関わらず、全てのスタックフレームの実行位置情報をコアファイル１５１に出力する。もちろん、ダンプ対象と判定されたスタックフレームの実行位置情報のみをコアファイル１５１に出力するものでもよい。
【００２４】
その後、取得部１３が実行位置情報を判定部１４に渡すと、判定部１４は実行位置情報と設定ファイル１５２のダンプ対象判定条件とを比較してスタックフレームがダンプ対象であるか否か判定する（ステップＳ１３）。スタックフレームがダンプ対象でない場合は、次のスタックフレームを処理するためにステップＳ１５へ進む。
【００２５】
スタックフレームがダンプ対象の場合、取得部１３は、そのスタックフレームから参照可能な情報を実行部１１から取得してコアファイル１５１に出力する（ステップＳ１４）。
【００２６】
そして、全てのスタックフレームについて処理したか否か判定する（ステップＳ１５）。まだ処理していないスタックフレームが存在する場合はステップＳ１２へ戻る。全てのスタックフレームについて処理したときは、コアファイル取得装置１の処理を終了する。
【００２７】
図３は、コアファイル取得装置１によりコアファイル１５１に出力される情報を説明するための概略説明図である。図３に示す例では、＃０から＃４の５つのスタックフレームが列挙される。スタックフレームの右側に示す○印は、スタックフレームから辿ることができる情報を示している。列挙したスタックフレームのうち、＃０，＃３は他社プログラムによるスタックフレームである。＃０，＃３のスタックフレームをダンプ対象外とすると、そこからのみ参照されている情報のダンプを除外できる。図３では、白○印で示す情報がダンプされ、網掛け○印で示す情報はダンプされない。ダンプ対象外スタックフレーム（例えば＃０）から参照される情報であっても、ダンプ対象スタックフレーム（例えば＃１）から参照可能な情報であればコアファイル１５１に出力される。
【００２８】
スタックフレームから参照可能な情報は、スタックフレームが保持する情報だけでなく、その情報が参照する情報も含む。したがって、取得部１３は、スタックフレームから情報を辿ってコアファイル１５１に出力する。具体的には、ある変数が別の変数を有する場合は別の変数もコアファイル１５１に出力し、その別の変数がさらに別の変数を有する場合はさらに別の変数もコアファイル１５１に出力する。情報の参照関係もコアファイル１５１に出力する。
【実施例２】
【００２９】
図４は、実施例２のコアファイル取得装置の構成を示す機能ブロック図である。同図に示すコアファイル取得装置１００は、ＪＶＭ（Ｊａｖａ  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ）１１０、故障検知部１２０、コアファイル取得部１３０、およびダンプ対象判定部１４０を備え、二次記憶装置１５０に接続されている。
【００３０】
ＪＶＭ１１０は、Ｊａｖａ（登録商標）言語で記述されたプログラム１１１を実行する仮想マシンである。プログラム１１１内で故障が発生すると、故障検知部１２０に故障発生通知を送信する。故障の検知は、例えばＪａｖａの例外キャッチ命令であるｃａｔｃｈ節の中に故障発生通知送信機能を記述することで実現できる。また、ｉｆ文を用いて変数値の異常を故障として判定し、故障発生通知を送信することでも実現できる。他にも、アスペクト指向を用い、ある条件を満たす場合を故障として検知する方法や、ＢＣＩ（Ｂｙｔｅ  Ｃｏｄｅ  Ｉｎｓｔｒｕｍｅｎｔａｔｉｏｎ）を用いて故障を検知する方法がある。
【００３１】
故障検知部１２０は、故障発生通知を受信すると、コアファイル取得部１３０へコアファイル取得要求を発行するとともに、ダンプ対象判定部１４０へ初期化要求を発行する。
【００３２】
コアファイル取得部１３０は、故障検知部１２０からのコアファイル取得要求に応じてＪＶＭ１１０を介してプログラム１１１に接続し、スタックフレーム単位でダンプ対象であるか否かをダンプ対象判定部１４０に問い合わせ、ダンプ対象と判定されたスタックフレームから参照可能な情報を取得してコアファイル１５１に出力する。プログラム１１１により複数のスレッドが実行される場合は、全スレッドそれぞれの全スタックフレームそれぞれについてダンプ対象であるか否かを問い合わせる。コアファイル取得部１３０は、スタックフレームの実行位置情報（パッケージ名、ソースファイル名、ソースファイル中の行番号、クラス名、メソッド名など）を取得し、実行位置情報をダンプ対象判定部１４０に渡して、そのスタックフレームがダンプ対象であるか否かを問い合わせる。
【００３３】
本実施例では、プログラム１１１に接続する方法として、ＪＤＩ（Ｊａｖａ  Ｄｅｂｕｇ  Ｉｎｔｅｒｆａｃｅ）を用いる。プログラムがＪａｖａ言語で記述されたものであれば、ＪＶＭＤＩ（Ｊａｖａ  Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ  Ｄｅｂｕｇ  Ｉｎｔｅｒｆａｃｅ）やＪＤＷＰ（Ｊａｖａ  Ｄｅｂｕｇ  Ｗｉｒｅ  Ｐｒｏｔｏｃｏｌ）も用いることができる。プログラムがＣ言語で記述されたものであれば、ｐｔｒａｃｅシステムコールや、ｐｔｒａｃｅを使用して作られたｇｄｂを用いることができる。
【００３４】
ダンプ対象判定部１４０は、コアファイル取得部１３０が指定したスタックフレームがダンプ対象であるか否かを判定する。本実施例では、スタックフレームの実行位置情報のクラス名が設定ファイル１５２に記載されたクラス名の一部を含む場合に、そのスタックフレームはダンプ対象ではないと判定する。つまり、スタックフレームの実行位置情報のクラス名が設定ファイル１５２に記載されたクラス名の一部を含まない場合に、そのスタックフレームはダンプ対象となる。なお、ダンプ対象であるか否かの判定条件に、パッケージ名、ソースファイル名、ソースファイル中の行番号、あるいはメソッド名を用いてもよい。もちろん、ダンプ対象の判定条件に正規表現を用いることも、行番号の大小関係を用いることも可能である。
【００３５】
ダンプ対象判定部１４０は、故障検知部１２０からの初期化要求に応じて二次記憶装置１５０から設定ファイル１５２を読み出し、ダンプ対象判定部１４０の有するメモリにロードする。
【００３６】
二次記憶装置１５０は、ダンプ対象の判定条件を記載した設定ファイル１５２を記憶し、コアファイル取得部１３０が出力した情報をコアファイル１５１として記憶する。
【００３７】
次に、コアファイル取得装置１００の処理の流れについて説明する。図５は、本実施例におけるコアファイル取得装置１００の処理の流れを示すフローチャートである。
【００３８】
まず、故障検知部１２０が故障発生通知を受信してプログラム１１１の故障を検知すると、故障検知部１２０は、コアファイル取得部１３０へコアファイル取得要求を発行するとともに、ダンプ対象判定部１４０へ初期化要求を発行する（ステップＳ１０１）。ダンプ対象判定部１４０は、初期化要求に応じて二次記憶装置１５０から設定ファイル１５２のダンプ対象判定条件を読み出す。
【００３９】
コアファイル取得部１３０がコアファイル取得要求を受信すると、コアファイル取得部１３０はプログラム１１１にデバッガのＡＰＩを経由してアタッチする（ステップＳ１０２）。コアファイル取得部１３０は、プログラム１１１にアタッチ後、プログラム１１１の動作を停止させ、ＪＤＩの VirtualMachine.allThreads() メソッドを利用してプログラム１１１の全スレッドを列挙し、スレッド毎に以下の処理を行う。
【００４０】
コアファイル取得部１３０は、対象スレッドのスレッドＩＤ、スレッド名、モニター取得待ちオブジェクト、およびモニターを保持しているオブジェクト一覧を取得し、ダンプ情報として二次記憶装置１５０のコアファイル１５１に出力する（ステップＳ１０３）。スレッドに関する情報は全てＪＤＩのＡＰＩにより取得可能である。コアファイル取得部１３０は、対象スレッドについて、ＪＤＩの ThreadReference.frames() メソッドを利用して全スタックフレームを列挙し、スタックフレーム毎に以下の処理を行う。
【００４１】
コアファイル取得部１３０は、スタックフレームの実行位置情報（パッケージ名、ソースファイル名、ソースファイル中の行番号、クラス名、メソッド名）を取得し、スタックフレーム情報として二次記憶装置１５０のコアファイル１５１に出力する（ステップＳ１０４）。本実施例では、スタックフレームがダンプ対象であるか否かに関わらず、取得した実行位置情報をコアファイル１５１に出力する。
【００４２】
コアファイル取得部１３０が実行位置情報をダンプ対象判定部１４０に渡すと、ダンプ対象判定部１４０は実行位置情報とダンプ対象判定条件とを比較してスタックフレームがダンプ対象であるか否かを判定する（ステップＳ１０５）。そのスタックフレームがダンプ対象でない場合は、次のスタックフレームを処理するためにステップＳ１１０へ進む。
【００４３】
スタックフレームがダンプ対象の場合、コアファイル取得部１３０は、ＪＤＩの StackFrame.visibleVariables() メソッドを利用し、そのスタックフレームが保持する全変数を列挙し、列挙した変数のうち、プリミティブ型変数をコアファイル１５１に出力する（ステップＳ１０６）。プリミティブ型変数とは整数値、浮動小数値、あるいは文字値などを値として持ち、他の変数を値として持たない変数である。一方、プリミティブ型変数以外の変数としてオブジェクト型変数が存在する。オブジェクト型変数は、プリミティブ型変数や別のオブジェクト型変数など他の変数を持つ変数である。
【００４４】
続いて、列挙した変数のうち、オブジェクト型変数のオブジェクトＩＤ、型名、文字列表現値をオブジェクト情報としてコアファイル１５１に出力する（ステップＳ１０７）。オブジェクト型変数の情報は、ＪＤＩの ObjectReference.uniqueID() メソッド、ObjectReference.referenceType().name() メソッド、および ObjectReference.toString() メソッドにより取得する。
【００４５】
そして、ＪＤＩの StackFrame.visibleVariables() メソッドを利用し、オブジェクト型変数が保持する全メンバ変数を列挙し、列挙した変数のうち、プリミティブ型変数をコアファイル１５１に出力する（ステップＳ１０８）。メンバ変数にオブジェクト型変数が存在する場合は（ステップＳ１０９）、そのオブジェクト型変数に対してステップＳ１０７以降の処理を再帰的に実行する。
【００４６】
スタックフレームから辿ることができる全ての変数の出力が終わると、全てのスタックフレームについて処理したか否か判定し（ステップＳ１１０）、まだ処理していないスタックフレームが存在する場合はステップＳ１０４へ戻る。
【００４７】
全てのスタックフレームについて処理した場合には、全てのスレッドについて処理したか否か判定し（ステップＳ１１１）、まだ処理していないスレッドが存在する場合はステップＳ１０３へ戻る。全てのスレッドについて処理したときは、コアファイル取得装置１００の処理を終了する。
【００４８】
なお、実施例１，２に示したコアファイル取得装置が備える各部は、演算処理装置、記憶装置、メモリ等を備えたコンピュータにより構成して、各部の処理がプログラムによって実行されるものとしてもよい。このプログラムはコアファイル取得装置が備える記憶装置に記憶されており、磁気ディスク、光ディスク、半導体メモリ等の記録媒体に記録することも、ネットワークを通して提供することも可能である。また、各実施例のコアファイル取得装置の構成は一例であり、各部を別々のコンピュータにより構成してもよい。
【００４９】
以上説明したように、全てのスタックフレームを列挙し、スタックフレーム毎にダンプ対象であるか否かを判断し、ダンプ対象と判定されたスタックフレームから参照可能な情報のみコアファイルに出力することで、コアファイルのサイズを縮小し、コアダンプ時間を短縮することが可能となる。スタックフレーム単位でダンプの要否が指定可能であるので、例えば、外部ライブラリ等のスタックフレームを除外することで、つまり、相対的に故障する可能性の高いライブラリ等のスタックフレームをダンプ対象とすることで、プログラムの故障の解析に必要な情報の全てを残しつつ、コアファイルのサイズを縮小することができる。
【符号の説明】
【００５０】
１…コアファイル取得装置
１１…実行部
１２…検知部
１３…取得部
１４…判定部
１５…記憶部
１００…コアファイル取得装置
１１０…ＪＶＭ
１１１…プログラム
１２０…故障検知部
１３０…コアファイル取得部
１４０…ダンプ対象判定部
１５０…二次記憶装置
１５１…コアファイル
１５２…設定ファイル
【図１】
0005421735.tif 000002
【図２】
0005421735.tif 000003
【図３】
0005421735.tif 000004
【図４】
0005421735.tif 000005
【図５】
0005421735.tif 000006