(57)【要約】【課題】システムへの負荷の増大なしに、スタックトレース情報を格納するのに必要なメモリ容量を削減し、かつ、障害を起こしているプロセス／スレッドを特定する。【解決手段】スタックトレース採取システムは、プロセスが実行単位であるスレッド毎に実行される実行部３０と、トレースデータ格納部３３を有する。実行部３０は、実行中のスレッドが別のスレッドに切り替わる際に、該実行中のスレッドの切り替え直前における処理状態を示す第１のスタックトレース情報とスレッドの切り替え後に実行された別のスレッドの切り替え直後の処理状態を示す第２のスタックトレース情報をそれぞれ採取し、該採取した第１及び第２のスタックトレース情報をトレースデータ格納部３３に格納するスタックトレース採取部３１と、トレースデータ格納部３３に格納された第１および第２のスタックトレース情報を外部記憶装置に出力するトレースデータ出力部３２を有する。【選択図】図９
2010182237.tif 000002
【特許請求の範囲】
【請求項１】
プログラムにより提供されるプロセスが実行単位であるスレッド毎に実行される実行部と、
トレースデータ格納部と、を有し、
前記実行部は、
実行中のスレッドが別のスレッドに切り替わる際に、該実行中のスレッドの切り替え直前における処理状態を示す第１のスタックトレース情報とスレッドの切り替え後に実行された前記別のスレッドの切り替え直後の処理状態を示す第２のスタックトレース情報をそれぞれ採取し、該採取した第１及び第２のスタックトレース情報を前記トレースデータ格納部に格納するスタックトレース採取部と、
前記トレースデータ格納部に格納された第１および第２のスタックトレース情報を外部記憶装置に出力するトレースデータ出力部と、を有する、スタックトレース採取システム。
【請求項２】
前記スタックトレース採取部は、採取した前記第１または第２のスタックトレース情報を格納するための空き領域が前記トレースデータ格納部に無い場合は、前記トレースデータ出力部に対して、スタックトレース情報の出力要求を行い、
前記トレースデータ出力部は、前記スタックトレース採取部からの出力要求に従い、前記トレースデータ格納部に格納された第１および第２のスタックトレース情報を前記外部記憶装置に出力する、請求項１に記載のスタックトレース採取システム。
【請求項３】
当該スタックトレース採取システムの状態を監視し、特定の状態を検出すると、前記トレースデータ出力部に対して、スタックトレース情報の出力要求を行うスタックトレース監視部をさらに有し、
前記トレースデータ出力部は、前記スタックトレース監視部からの出力要求に従い、前記トレースデータ格納部に格納された第１および第２のスタックトレース情報を前記外部記憶装置に出力する、請求項１または２に記載のスタックトレース採取システム。
【請求項４】
前記スタックトレース監視部は、前記特定の状態として、外部入力装置からの所定のコマンド信号を受信する、請求項３に記載のスタックトレース採取システム。
【請求項５】
前記実行部は、オペレーティングシステムを実行し、該オペレーティングシステムの機能として、前記スタックトレース採取部、トレースデータ出力部およびスタックトレース監視部が構成されている、請求項３または４に記載のスタックトレース採取システム。
【請求項６】
前記実行部は、第１および第２のＣＰＵを有し、
前記第１のＣＰＵは、オペレーティングシステムを実行し、該オペレーティングシステムの機能として、前記スタックトレース採取部およびスタックトレース監視部が構成され、
前記トレースデータ出力部は、前記第２のＣＰＵにより構成されている、請求項３または４に記載のスタックトレース採取システム。
【請求項７】
前記プロセスは、前記オペレーティングシステムを構成する管理プログラムにより提供されるプロセスを含む、請求項５または６に記載のスタックトレース採取システム。
【請求項８】
前記スタックトレース採取部は、採取した前記第１または第２のスタックトレース情報に、採取対象であるプロセスおよびスレッドの識別情報と切り替えの直前および直後を識別するための直前／直後識別情報を付与し、
前記トレースデータ出力部は、前記トレースデータ格納部に格納された第１および第２のスタックトレース情報を前記外部記憶装置に出力した場合に、前記プロセスおよびスレッドの識別情報および直前／直後識別情報を検索キーとして、過去に前記外部記憶装置へ出力したスタックトレース情報と今回出力したスタックトレース情報との間で対応するスタックトレース情報を抽出し、該抽出した対応するスタックトレース情報の内容を比較し、比較結果が不一致となった場合に、該比較したスタックトレース情報の内容を、前記プロセスおよびスレッドの識別情報および直前／直後識別情報を示す情報と一緒に、前記外部記憶装置の所定の領域へ格納する、請求項１から７のいずれか１項に記載のスタックトレース採取システム。
【請求項９】
プログラムにより提供されるプロセスを実行単位であるスレッド毎に実行し、
前記実行中のスレッドが別のスレッドに切り替わる際に、前記実行中のスレッドの切り替え直前における処理状態を示す第１のスタックトレース情報とスレッドの切り替え後に実行された前記別のスレッドの切り替え直後の処理状態を示す第２のスタックトレース情報をそれぞれ採取し、
採取した前記第１及び第２のスタックトレース情報をトレースデータ格納部に格納し、
前記トレースデータ格納部に格納された第１および第２のスタックトレース情報を外部記憶装置に出力する、スタックトレース採取方法。
【請求項１０】
プログラムにより提供されるプロセスを実行単位であるスレッド毎に実行する処理と、
前記実行中のスレッドが別のスレッドに切り替わる際に、前記実行中のスレッドの切り替え直前における処理状態を示す第１のスタックトレース情報とスレッドの切り替え後に実行された前記別のスレッドの切り替え直後の処理状態を示す第２のスタックトレース情報をそれぞれ採取する処理と、
採取した前記第１及び第２のスタックトレース情報をトレースデータ格納部に格納する処理と、
前記トレースデータ格納部に格納された第１および第２のスタックトレース情報を外部記憶装置に出力する処理と、をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータシステムに生じた障害の原因を究明するために必要となるスタックトレース情報の採取技術に関する。
【背景技術】
【０００２】
システムに障害が発生した際に、障害の原因を究明するためにメモリダンプ情報をシステムから採取する方法が、一般に用いられている（特許文献１参照）。メモリダンプ情報は、障害発生時点におけるシステムのメモリの内容を採取した情報であるので、障害発生時点におけるシステムの動作状態（プログラムに従って実行されたプロセスのスレッドの状態）を確認することができる。
【０００３】
しかし、メモリ破壊を起こした障害の場合は、その障害のトリガとなった痕跡が残っていないために、メモリダンプ情報だけでは真の原因追求が困難な場合がある。
【０００４】
特許文献１には、上記の問題を解決するため、各プロセスにトレースセグメントを持たせて、オペレーティングシステムが各プログラムへトレース情報を書き込む方式が提案されている。この方式によれば、オペレーティングシステムのトレース制御機能が、プログラムの実行状態をトレース情報としてトレースセグメントに格納する。メモリ破壊等のシステム障害が生じた場合は、トレースセグメントに格納したトレース情報に基づいて、障害発生時からさかのぼってトレース情報を調査することができる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平６−９５９２５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかし、特許文献１に記載の方式においては、プログラムにしたがって呼び出される各関数の実行状態をトレース情報として記録しているため、トレース情報量が増大し、トレース情報を採取するために必要なメモリの容量が多くなる。このように、プロセス毎に多くのトレース情報をメモリに格納するために、大容量のメモリが必要とされるという問題がある。
【０００７】
また、トレース情報の欠落を防ぐために、通常、メモリに格納されたトレース情報をディスク装置等へ書き出す処理が行われるが、トレース情報が増大すると、トレース情報をメモリからディスク装置へ書き出すための処理の実行回数が増大する。その結果、システム全体の処理の負荷を増加させるという問題が生じる。
【０００８】
本発明の目的は、上記の各問題を解決し、システムへの負荷の増大なしに、スタックトレース情報を格納するのに必要とされるメモリ容量を削減することができ、かつ、障害を起こしているプロセス／スレッドを特定することができる、スタックトレース採取システム、方法およびプログラムを提供することにある。
【課題を解決するための手段】
【０００９】
上記目的を達成するため、本発明のスタックトレース採取システムは、
プログラムにより提供されるプロセスが実行単位であるスレッド毎に実行される実行部と、
トレースデータ格納部と、を有し、
前記実行部は、
実行中のスレッドが別のスレッドに切り替わる際に、該実行中のスレッドの切り替え直前における処理状態を示す第１のスタックトレース情報とスレッドの切り替え後に実行された前記別のスレッドの切り替え直後の処理状態を示す第２のスタックトレース情報をそれぞれ採取し、該採取した第１及び第２のスタックトレース情報を前記トレースデータ格納部に格納するスタックトレース採取部と、
前記トレースデータ格納部に格納された第１および第２のスタックトレース情報を外部記憶装置に出力するトレースデータ出力部と、を有することを特徴とする。
【００１０】
本発明のスタックトレース採取方法は、
プログラムにより提供されるプロセスを実行単位であるスレッド毎に実行し、
前記実行中のスレッドが別のスレッドに切り替わる際に、前記実行中のスレッドの切り替え直前における処理状態を示す第１のスタックトレース情報とスレッドの切り替え後に実行された前記別のスレッドの切り替え直後の処理状態を示す第２のスタックトレース情報をそれぞれ採取し、
採取した前記第１及び第２のスタックトレース情報をトレースデータ格納部に格納し、
前記トレースデータ格納部に格納された第１および第２のスタックトレース情報を外部記憶装置に出力することを特徴とする。
【００１１】
本発明のプログラムは、
プログラムにより提供されるプロセスを実行単位であるスレッド毎に実行する処理と、
前記実行中のスレッドが別のスレッドに切り替わる際に、前記実行中のスレッドの切り替え直前における処理状態を示す第１のスタックトレース情報とスレッドの切り替え後に実行された前記別のスレッドの切り替え直後の処理状態を示す第２のスタックトレース情報をそれぞれ採取する処理と、
採取した前記第１及び第２のスタックトレース情報をトレースデータ格納部に格納する処理と、
前記トレースデータ格納部に格納された第１および第２のスタックトレース情報を外部記憶装置に出力する処理と、をコンピュータに実行させることを特徴とする。
【発明の効果】
【００１２】
本発明によれば、関数が呼ばれる度にスタックトレース情報を残すのではなく、スレッドの切り替わり前後に限り、スタックトレース情報を採取する。これにより、スタックトレース情報を採取するために必要なメモリ容量を削減し、システムに与える負荷の低減を図ることができるとともに、より少ないスタックトレース情報で障害を起こしているプロセス／スレッドを特定することができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の第１の実施形態であるスタックトレース採取システムの構成を示すブロック図である。
【図２】スレッドの切り替え時におけるスタックトレース採取部がスタックトレース情報をトレースデータ格納領域に格納する様子を示す模式図である。
【図３】スタックトレース採取部によるスタックトレース情報の格納動作を説明するためのフローチャートである。
【図４】スタックトレース監視部によるトレースデータ格納領域内の内容を出力させるための通知処理を説明するためのフローチャートである。
【図５】トレースデータ出力部によるトレースデータ出力動作を説明するためのフローチャートである。
【図６】スタックトレース出力コマンドにより実施される動作を説明するためのフローチャートである。
【図７Ａ】スタックトレース出力例を示す模式図である。
【図７Ｂ】スタックトレース情報の比較結果の出力例を示す模式図である。
【図８】本発明の第２の実施形態であるスタックトレース採取システムの構成を示すブロック図である。
【図９】本発明の他の実施形態であるスタックトレース採取システムの構成を示すブロック図である。
【発明を実施するための形態】
【００１４】
次に、本発明の実施形態について図面を参照して説明する。
【００１５】
（第１の実施形態）
図１は、本発明の第１の実施形態であるスタックトレース採取システムの構成を示すブロック図である。図１を参照すると、スタックトレース採取システム１は、プログラムを実行するＣＰＵ（Central Processing Unit）１と、ＣＰＵ１上で動作するオペレーティングシステム（ＯＳ）３と、メモリ８を有する。
【００１６】
プログラムにより提供されるプロセス２は、オペレーティングシステム３がＣＰＵ１に処理を割り当てる最小単位となるスレッド４を有する。図１中、オペレーティングシステム３外のプロセス２は、アプリケーション等のプログラムにより提供されるものであり、オペレーティングシステム３内のプロセス２は、管理プログラムにより提供されるものである。管理プログラムは、プリンタ管理プログラム、ディスク装置管理プログラム、メモリ管理プログラム等である。
【００１７】
１つのスレッドまたは１つのプロセスにおいて、多くの関数が呼ばれる。スレッド４を実行するために、オペレーティングシステム３によって、メモリ８内のメモリ領域の一部がスタックエリアとして割り当てられる。スレッド４が実行されると、そのスレッド４に関するオペレーティングシステム３にて処理が必要になるレジスタの値やスタック情報を含むスタックトレース情報５がメモリ８内のスタックエリアに格納される。
【００１８】
ハードウェアの機能（例外処理）によりスレッド切り替えが起こる。スレッド切り替えが起こる例外としては、スレッドに割り当てられたＣＰＵの利用時間を消費することによる例外、スレッドに割り当てられたＣＰＵの利用時間を消費しなくてもスレッドがＣＰＵの利用をやめた際に発生する例外、および入出力デバイスからの割り込み処理によって発生する例外等がある。
【００１９】
スレッド切り替わり時点において、オペレーティングシステム３は、スタックエリアに残っている呼び出した関数への因数や呼び出した関数の処理が終わった際の戻り値をスタックトレース情報５としてメモリ８内のトレースデータ格納領域８aに格納する。
【００２０】
オペレーティングシステム３は、スタックトレース監視部６、スタックトレース採取部７およびトレースデータ出力部９を有する。
【００２１】
スタックトレース採取部７は、オペレーティングシステム３におけるスレッド切り替え時に呼び出される機能である。スタックトレース採取部７は、実行中のスレッドが別のスレッドに切り替わる際に、該実行中のスレッドの切り替え直前におけるスタックトレース情報５をトレースデータ格納領域８aに格納する。さらに、スレッドが別のスレッドに切り替わった後、スタックトレース採取部７は、その切り替え直後における別のスレッドのスタックトレース情報５をトレースデータ格納部８ａに格納する。
【００２２】
図２に、スレッドの切り替え時におけるスタックトレース採取部７がスタックトレース情報５をトレースデータ格納領域８aに格納する様子を模式的に示す。
【００２３】
例外処理によりスレッド切り替えが起こる。図２に示す例では、スレッドがスレッド番号「１」のスレッドに切り替わり、その後、スレッド番号「２」のスレッドに切り替わる様子が示されている。スレッドがスレッド番号「１」のスレッドに切り替わると、スタックトレース採取部７は、スレッド番号「１」のスレッドの、切り替わり直後におけるスタックトレース情報をトレースデータ格納領域８aに格納する。
【００２４】
その後、スタックトレース採取部７は、例外処理を通じて、スレッド番号「１」のスレッドからスレッド番号「２」のスレッドへの切り替え要求を受け付ける。切り替え要求を受け付けると、スタックトレース採取部７は、現在実行中のスレッド番号「１」のスレッドの、切り替わり直前におけるスタックトレース情報をトレースデータ格納領域８aに格納する。スレッド番号「１」のスレッドからスレッド番号「２」のスレッドに切り替わると、スタックトレース採取部７は、スレッド番号「２」のスレッドの切り替わり直後におけるスタックトレース情報をトレースデータ格納領域８aに格納する。
【００２５】
上述のように、スタックトレース採取部７は、例外処理によりスレッドが別のスレッドに切り替わる際に、その切り替わり直前および直後のスレッドのスタックトレース情報をそれぞれ取得し、それら取得したスタックトレース情報をトレースデータ格納領域８aに格納する。スタックトレース情報は、取得日時情報、スレッドやプロセスを識別可能な情報（プロセス名／プロセス番号／スレッド番号）、切り替え直前／直後（スレッド開始／終了）を示す情報などが付与されて、取得した順番でトレースデータ格納領域８aに格納される。
【００２６】
なお、スタックトレース情報をトレースデータ格納領域８aに格納する際に、スタックトレース採取部７は、トレースデータ格納領域８a内にそのスタックトレース情報を格納できるだけの空き領域があるか否かを判定する。もし、空き領域が無い場合は、スタックトレース採取部７は、トレースデータ出力部９に対して、トレースデータ格納領域８a内の内容を出力させるための通知（データ出力指示）を行う。
【００２７】
スタックトレース監視部６は、スタックトレース採取システム１の状態を監視し、特定の状態を検出すると、トレースデータ出力部９に対して、トレースデータ格納領域８a内の内容を出力させるための通知（データ出力指示）を行う。特定の状態は、例えば、トレースデータ格納領域８aの空きがなくなった場合、スタックトレース採取システム１にエラーログが記録された場合、メモリダンプ情報が出力された場合、プロセス２が異常終了した場合、ユーザがマウスやキーボード等の入力装置２１を通じてスタックトレース出力コマンド１０を実行した場合などである。
【００２８】
スタックトレース出力コマンド１０は、入力装置２１にてトレースデータ格納領域８aの内容をディスクに出力するための所定の入力操作を行うことにより、入力装置２１からスタックトレース監視部６に供給されるコマンド信号である。
【００２９】
トレースデータ出力部９は、トレースデータ監視部６およびスタックトレース採取部７からの通知（データ出力指示）に従って、トレースデータ格納領域８a内の内容（スタックトレース情報）を外部記憶装置であるディスク２０に出力し、トレースデータ格納領域８aの内容をクリアする。トレースデータ格納領域８a内に格納されたスタックトレース情報は、格納された順番（古い順番）に従って、トレースデータ格納領域８a内から出力される（図２参照）。
【００３０】
また、トレースデータ格納領域８a内のスタックトレース情報をディスク２０へ出力した際、トレースデータ出力部９は、過去にディスク２０へ出力したスタックトレース情報と今回出力したスタックトレース情報とを比較する。この比較において、プロセス番号、スレッド番号、およびスレッド切り替わりの直前／直後を示す情報を検索キーとして、過去のスタックトレース情報と今回出力したスタックトレース情報との間で対応するスタックトレース情報を抽出する。そして、抽出した対応するスタックトレース情報の内容を比較する。
【００３１】
システム障害が生じていない場合（正常動作の場合）、プロセス番号およびスレッド番号が同一のスレッド（すなわち、同じプロセス）では、同じスタックトレース情報が得られる。一方、システム障害が生じた場合は、障害が生じたスレッドのスタックトレース情報の内容は、正常時における内容と異なる。したがって、プロセス番号およびスレッド番号が同一のスレッドの間で、スタックトレース情報の内容を比較することで、障害の原因となったスレッドを特定することができる。また、その特定したスレッドのスタックトレース情報の内容を調べることで、障害の原因を特定することできる場合もある。
【００３２】
上記の比較において、スタックトレース情報の内容が不一致となった場合に、トレースデータ出力部９は、その不一致となったスレッドのスタックトレース情報を、プロセス番号、スレッド番号、スレッド切り替わりの直前／直後を示す情報と一緒に、ディスク２０内の障害抽出領域へ出力する。なお、システム障害が生じた場合に、例えば、全ての値が０となるといった、明らかに通常時の値とは異なる特定のスタックトレース情報が採取される場合がある。この場合、トレースデータ出力部９は、過去のスタックトレース情報との比較は行わずに、特定のスタックトレース情報を、プロセス番号、スレッド番号、スレッド切り替わりの直前／直後を示す情報と一緒に、ディスク２０内の障害抽出領域へ出力してもよい。
【００３３】
また、トレースデータ出力部９は、スタックトレース情報の内容が不一致となった場合に、その不一致となったスレッドのスタックトレース情報を、プロセス番号、スレッド番号、スレッド切り替わりの直前／直後を示す情報と一緒に、不図示の表示装置へ出力してもよい。
【００３４】
さらに、ＣＰＵ１１が、入力装置２１からの指示を受け付けて、ディスク２０内の障害抽出領域に格納された情報を、不図示の表示装置に表示させてもよい。
【００３５】
次に、本実施形態のスタックトレース採取システム１の動作を説明する。
【００３６】
まず、スタックトレース採取部７の動作を説明する。
【００３７】
図３は、スタックトレース採取部７によるスタックトレース情報の格納動作を説明するためのフローチャートである。
【００３８】
例外処理を通じて、スレッド切り替えの要求を受け付けると、スタックトレース採取部７が呼び出され、スタックトレース採取部７によるスタックトレース採取処理が開始される。スタックトレース採取処理では、図３に示すように、スタックトレース採取部７は、まず、トレースデータ格納領域８a内に空き領域があるか否かを判定する（ステップＳ１）。
【００３９】
ステップＳ１で空き領域が無いと判定された場合は、スタックトレース採取部７は、トレースデータ出力部９に対して、トレースデータ格納領域８a内の内容を出力させるための通知（データ出力指示）を行う（ステップＳ２）。
【００４０】
ステップＳ１で空き領域があると判定された場合またはステップＳ２の実行後、スタックトレース採取部７は、現在実行中のスレッドの切り替え直前におけるスタックトレース情報をトレースデータ格納領域８aへコピーする。スタックトレース情報のコピー後、スレッドの切り替えが行われる（ステップＳ４）。
【００４１】
ステップＳ４でスレッド切り替えがなされると、スタックトレース採取部７は、スレッド切り替え後に実行されたスレッドにおける切り替え直後のスタックトレース情報をトレースデータ格納領域８aへコピーする（ステップＳ５）。その後、スタックトレース採取処理およびスレッド切り替え処理は終了する。
【００４２】
上述した図３の処理が、スレッドが切り替わるたびに実行される。
【００４３】
次に、スタックトレース監視部６の動作を説明する。
【００４４】
図４は、スタックトレース監視部６によるトレースデータ格納領域８a内の内容を出力させるための通知処理を説明するためのフローチャートである。
【００４５】
図４に示すように、スタックトレース監視部６は、スタックトレース採取システム１の状態を監視し、次の第１乃至第５の判定のいずれかが真であるか否かを判定する（ステップＳ２１）。ここで、第１の判定は、トレースデータ格納領域８aの空き領域がなくなったか否かの判定である。第２の判定は、スタックトレース採取システム１にエラーログが記録されたか否かの判定である。第３の判定は、メモリダンプ情報が出力されたか否かの判定である。第４の判定は、プロセス２が異常終了したか否かの判定である。第５の判定は、スタックトレース出力コマンド１０を受信したか否かの判定である。第１乃至第４の判定はいずれも、スタックトレース採取システム１のログ情報を調べることで行うことができる。
【００４６】
ステップＳ２１で、いずれかの判定が真になった場合、スタックトレース監視部６は、トレースデータ出力部９に対して、トレースデータ格納領域８a内の内容を出力させるための通知を行う（ステップＳ２２）。
【００４７】
次に、トレースデータ出力部９の動作を説明する。
【００４８】
図５は、トレースデータ出力部９によるトレースデータ出力動作を説明するためのフローチャートである。
【００４９】
スタックトレース監視部６またはスタックトレース採取部７からの通知により、トレースデータ出力部９によるトレースデータ出力処理が開始される。トレースデータ出力処理では、図５に示すように、トレースデータ格納領域８aの内容をディスク２０へ出力し（ステップＳ１１）、トレースデータ格納領域８aの内容をクリアする（ステップＳ１２）。
【００５０】
次に、プロセス番号、スレッド番号、およびスレッド切り替わりの直前／直後を示す情報を検索キーとして、ディスク２０へ出力した過去のスタックトレース情報と今回出力したスタックトレース情報との間で対応するスタックトレース情報を抽出する。そして、抽出した対応するスタックトレース情報の内容を比較する（ステップＳ１３）。比較結果が不一致となった場合は、比較したスタックトレース情報の内容を、プロセス番号、スレッド番号、およびスレッド切り替わりの直前／直後を示す情報と一緒に、ディスク２０内の障害抽出領域へ出力する（ステップＳ１４）。比較結果が一致した場合は、トレースデータ出力処理を終了する。
【００５１】
次に、スタックトレース出力コマンド１０により実施される動作について説明する。
【００５２】
図６は、スタックトレース出力コマンド１０により実施される動作を説明するためのフローチャートである。スタックトレース監視部６に対して、スタックトレース出力コマンド１０により、トレースデータ格納領域８aの内容をディスク２０に出力する旨の通知がなされる（ステップＳ３１）。この通知後、図５に示したトレースデータ出力処理が実施される。
【００５３】
以上説明した本実施形態のスタックトレース採取システム１によれば、例外処理を通じて、実行中のスレッドを別のスレッドへ切り替えるための要求を受け付けると、スタックトレース採取部７が、現在実行中のスレッドにおけるスレッド切り替え直前のスタックトレース情報をトレースデータ格納領域８aに格納する。さらに、スタックトレース採取部７は、スレッド切り替え後に実行された別のスレッドにおける切り替え直後のスタックトレース情報をトレースデータ格納領域８aに格納する。トレースデータ格納領域８aに格納されたスタックトレース情報は、トレースデータ出力部９によってディスク２０に出力される。
【００５４】
図７Ａに、スタックトレース出力例を示す。スタックトレース情報は、採取日時、プロセス名、スレッド番号、スレッドの切り替わりの直前／直後を示す情報等と一緒にディスク２０に供給される。メモリ破壊等のシステム障害を起こした場合は、その障害にいたるまでに実行された各スレッドのスレッド切り替え直前および直後のスタックトレース情報がディスク２０に格納される。このように、障害が発生する前の各スレッドの処理状態をトレースすることが可能である。したがって、ディスク２０に格納されたスタックトレース情報に基づいて、障害発生時からさかのぼってスタックトレース情報を調査することにより、どの時点からメモリ破壊が起こっているか突き止めることが出来る。例えば、スレッドの切り替わり直後のスタックトレース情報、スレッドの切り替わり直前のスタックトレース情報、さらには同じスレッドの次回の切り替わり直後のスタックトレース情報を比較する。そして、ある時点のスタックトレース情報以降、それまでと大きく違いがある場合や０クリアされていた場合、メモリ破壊等の障害が生じた可能性があると判断することができる。また、障害発生時点で、どのプロセス／スレッドがどのような動作をしていたかを調べることにより、障害を起こしていると思われるプロセス／スレッドを容易に特定することができる。
【００５５】
また、本実施形態のスタックトレース採取システムでは、トレースデータ出力部９が、プロセス番号およびスレッド番号が同一のスレッドの間で、スタックトレース情報の内容を比較する。そして、内容が不一致となった場合に、トレースデータ出力部９が、その不一致となったスレッドのスタックトレース情報を、プロセス番号、スレッド番号、スレッド切り替わりの直前／直後を示す情報と一緒に、ディスク２０内の障害抽出領域へ出力する。
【００５６】
図７Ｂに、障害抽出領域に格納されるスタックトレース情報の一例を示す。障害抽出領域に格納される情報は、採取日時、プロセス名、プロセス番号、スレッド番号、スレッドの切り替わりの直前または直後を示す情報、スレッドトレース情報の項目からなる。プロセス番号およびスレッド番号が同一のスレッドの間で、スタックトレース情報の内容が不一致となった場合、それらスレッドのスタックトレース情報が、採取日時、プロセス名、スレッド番号、スレッドの切り替わりの直前または直後を示す情報と一緒に障害抽出領域に格納される。これにより、ユーザは、ディスク２０内の障害抽出領域内の情報から障害が生じたプロセスやスレッドを容易に特定することができる。なお、図７Bに示した例では、スレッドトレース情報の項目には、比較したスレッドトレース情報がともに格納されるようになっているが、これに代えて、比較したスレッドトレース情報の差分データをスレッドトレース情報の項目に格納してもよい。これにより、障害抽出領域の容量の削減を図ることが可能となる。ただし、この場合は、採取日時、プロセス名、プロセス番号、スレッド番号、スレッドの切り替わりの直前または直後を示す情報、スレッドトレース情報の差分データに基づいて、ディスク20内に格納された全スレッドトレース情報から該当するスレッドトレース情報を抽出する必要がある。この抽出処理は、CPUが実行するように構成してもよい。
【００５７】
また、本実施形態のスタックトレース採取システムでは、関数が呼ばれる度にスタックトレース情報を残すのではなく、スレッドの切り替わり前後に限り、スタックトレース情報を採取する。これにより、スタックトレース情報を採取するために必要なメモリ容量を削減し、システムに与える負荷の低減を図ることができる。
【００５８】
１つのスレッドまたは１つのプロセスでは、多くの関数が呼ばれる。関数が呼ばれるたびにスタックトレース情報を採取すると、膨大な採取データ量となる。本実施形態によれば、スレッドの切り替わり前後のスタックトレース情報のみ、即ちスレッドが実行されている間の関数呼び出しや関数の戻りのトレース情報は採取しないため、採取するデータ量は少なくて済む。
【００５９】
また、本実施形態のスタックトレース採取システムによれば、オペレーティングシステム３を構成する管理プログラムにより提供されるプロセス／スレッドについても、スタックトレース情報の採取対象とされている。これにより、オペレーティングシステム自身のスタックトレース情報を採取する仕組を提供することができる。
【００６０】
（第２の実施形態）
図８は、本発明の第２の実施形態であるスタックトレース採取システムの構成を示すブロック図である。
【００６１】
本実施形態のスタックトレース採取システム１は、専用ＣＰＵ１２を有し、トレースデータ出力部９が専用ＣＰＵ１２上で動作する点が第１の実施形態のものと異なる。その他の構成は、第１の実施形態と基本的に同じである。
【００６２】
スタックトレース採取システム１において、専用ＣＰＵ１２上でトレースデータ出力部９を実行する。第１の実施形態で説明したトレースデータ出力部９の処理が専用ＣＰＵ１２にて実行されるので、その分、ＣＰＵ１１の負担を軽減することができる。
【００６３】
（他の実施形態）
図９は、本発明の他の実施形態であるスタックトレース採取システムの構成を示すブロック図である。
【００６４】
図９を参照すると、本実施形態のスタックトレース採取システムは、プログラムにより提供されるプロセスが実行単位であるスレッド毎に実行される実行部３０と、トレースデータ格納部３３を有する。
【００６５】
実行部３０は、実行中のスレッドが別のスレッドに切り替わる際に、該実行中のスレッドの切り替え直前における処理状態を示す第１のスタックトレース情報とスレッドの切り替え後に実行された別のスレッドの切り替え直後の処理状態を示す第２のスタックトレース情報をそれぞれ採取し、該採取した第１及び第２のスタックトレース情報をトレースデータ格納部３３に格納するスタックトレース採取部３１と、トレースデータ格納部３３に格納された第１および第２のスタックトレース情報を外部記憶装置に出力するトレースデータ出力部３２を有する。ここで、スタックトレース採取部３１、トレースデータ出力部３２およびトレースデータ格納部３３はそれぞれ、第１または第２の実施形態における、スタックトレース採取部７、トレースデータ出力部９およびトレースデータ格納領域８aに対応する。
【００６６】
本実施形態によれば、関数が呼ばれる度にスタックトレース情報を残すのではなく、スレッドの切り替わり前後に限り、スタックトレース情報を採取する。これにより、より少ないスタックトレース情報で障害を起こしているプロセス／スレッドを特定することができるとともに、スタックトレース情報を採取するために必要なメモリ容量を削減し、システムに与える負荷の低減を図ることができる。
【００６７】
また、システム全体のスレッドの実行状態が外部記憶装置に格納される。したがって、メモリ破壊等の障害のようにメモリダンプ情報だけでは真の原因追求が困難な障害についても、障害発生時からさかのぼってスタックトレース情報を調査することにより、どの時点から障害が起こっているか突き止めることができる。さらに、障害発生時点で、どのプロセス／スレッドがどう動いていたかを調べることにより、障害の原因を特定することができる。
【００６８】
本実施形態において、当該スタックトレース採取システムの状態を監視し、特定の状態を検出すると、トレースデータ出力部３３に対して、スタックトレース情報の出力要求を行うスタックトレース監視部をさらに有してもよい。このスタックトレース監視部は、第１または第２の実施形態におけるスタックトレース監視部６に対応する。
【００６９】
また、実行部３０は、オペレーティングシステムを実行し、該オペレーティングシステムの機能として、スタックトレース採取部、トレースデータ出力部およびスタックトレース監視部が構成されてもよい。
【００７０】
さらに、実行部３０は、第１および第２のＣＰＵを有し、第１のＣＰＵが、オペレーティングシステムを実行し、該オペレーティングシステムの機能として、スタックトレース採取部およびスタックトレース監視部が構成され、トレースデータ出力部が、第２のＣＰＵにより構成されてもよい。
【００７１】
さらに、トレース対象であるプロセスは、オペレーティングシステムを構成する管理プログラムにより提供されるプロセスであってもよい。これにより、オペレーティングシステム自身のスタックトレース情報を採取する仕組も提供することができる。ここで、オペレーティングシステム自身のトレース情報とは、オペレーティングシステムの管理プログラム（プリンタ管理プログラム、ディスク装置管理プログラム、メモリ管理プログラム等）にしたがって実行されるプロセスに関するトレースデータである。
【００７２】
以上説明した各実施形態におけるスタックトレース採取部、トレースデータ格納部、スタックトレース監視部およびトレースデータ出力部の各動作（処理）は、プログラムをコンピュータが実行することにより実現することが可能である。そのようなプログラムは、ＣＤやＤＶＤ等の記録媒体により提供されてもよく、また、インターネットを通じて提供されてもよい。
【００７３】
また、各実施形態で説明したスタックトレース採取システムは、本発明の一例であり、その構成は、発明の趣旨を逸脱しない範囲で適宜に変更することができる。
【符号の説明】
【００７４】
１  スタックトレース採取システム
２  プロセス
３  オペレーティングシステム
４  スレッド
５  スタックトレース情報
６  スタックトレース監視部
７、３１  スタックトレース採取部
８  メモリ
８a トレースデータ格納領域
９、３２  トレースデータ出力部
１０  スタックトレース出力コマンド
２０  ディスク
２１  入力装置
３０  実行部
３３  トレースデータ格納部
【図１】
2010182237.tif 000003
【図２】
2010182237.tif 000004
【図３】
2010182237.tif 000005
【図４】
2010182237.tif 000006
【図５】
2010182237.tif 000007
【図６】
2010182237.tif 000008
【図７Ａ】
2010182237.tif 000009
【図７Ｂ】
2010182237.tif 000010
【図８】
2010182237.tif 000011
【図９】
2010182237.tif 000012