(57)【要約】  プログラムの呼び出し時に情報解析を行うことによる、プログラムの呼び出し元の処理の遅延を抑止する。  判定手段（２）は、解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する第１の手法と、該解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、残りの情報の解析をリアルタイムに実行する第２の手法とのうち、応答時間が短い方の手法を判定する。解析管理手段（３）は、第１の手法の方が応答時間が短い場合、解析要求で指定された情報のすべての情報の解析を、第１の処理手段（４）にリアルタイムに実行させる。また解析管理手段（３）は、第２の手法の方が応答時間が短い場合、非リアルタイムに解析する情報以外の情報の解析を、第１の処理手段（４）にリアルタイムに実行させ、非リアルタイムに解析する情報の解析を、第２の処理手段（５）に非リアルタイムに実行させる。
2012131933.tif 000002
【特許請求の範囲】
【請求項１】
第１のプログラムの呼び出しに関する情報の解析要求に基づき、該解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する第１の手法と、該解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、非リアルタイムに解析する情報以外情報の解析をリアルタイムに実行する第２の手法とのうち、前記第１のプログラムの呼び出しが行われたときの呼び出し元への応答時間が短い方の手法を判定する判定手段と、
前記第１の手法の方が応答時間が短い場合、前記第１のプログラムの呼び出し命令が記述された第２のプログラムの実行過程における該呼び出し命令の実行時に、解析要求で指定された情報のすべての情報の解析、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、第１の処理手段にリアルタイムに実行させ、前記第２の手法の方が応答時間が短い場合、前記第２のプログラムの実行過程における前記呼び出し命令の実行時に、解析要求で指定された情報のうちの非リアルタイムに解析する情報以外情報の解析、非リアルタイムに解析する情報の第２の処理手段への解析依頼、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、前記第１の処理手段にリアルタイムに実行させ、非リアルタイムに解析する情報の解析を、前記第２の処理手段に非リアルタイムに実行させる解析管理手段と、
を有することを特徴とする情報処理装置。
【請求項２】
前記判定手段は、解析要求で指定された情報の一部を非リアルタイムで解析させることにより前記第１の処理手段で行わずにすむ処理の処理時間と、解析要求で指定された情報の一部を非リアルタイムで解析させることにより前記第１の処理手段で新たに行うこととなる処理の処理時間とを比較し、新たに行うこととなる処理の処理時間の方が長ければ、前記第１の手法の方が応答時間が短いと判断し、行わずにすむ処理の処理時間の方が長ければ、前記第２の手法の方が応答時間が短いと判断することを特徴とする請求の範囲第１項記載の情報処理装置。
【請求項３】
前記第１の処理手段で行わずにすむ処理の処理時間は、非リアルタイムに解析する情報の解析に要する時間と、解析結果を出力する時間とを加算した時間であることを特徴とする請求の範囲第２項記載の情報処理装置。
【請求項４】
前記第１の処理手段で新たに行うこととなる処理の処理時間は、前記第１の処理手段から前記第２の処理手段への非リアルタイムに解析する情報の解析の依頼に要する時間であることを特徴とする請求の範囲第２項または第３項のいずれかに記載の情報処理装置。
【請求項５】
前記解析管理手段はユーザ空間内で動作し、解析要求による解析対象の指定内容を、カーネル空間内に確保した共通域を介して、前記第１の処理手段に解析要求の内容を通知することを特徴とする請求の範囲第１項乃至第４項のいずれかに記載の情報処理装置。
【請求項６】
解析要求による解析対象の指定内容には、前記第２のプログラムの実行過程における前記呼び出し命令の実行時に、前記第１のプログラムの呼び出しに関する情報の解析を実行するための条件が指定されており、
前記第１の処理手段は、解析要求で指定された条件が満たされる場合に情報の解析を行うことを特徴とする請求の範囲第１項乃至第５項のいずれかに記載の情報処理装置。
【請求項７】
解析要求には、前記第１のプログラムの呼び出しに関する情報の少なくとも一部が出力対象に指示されており、
前記第１の処理手段と前記第２の処理手段とは、前記第１のプログラムの呼び出しに関する情報から解析要求で出力対象に指定された情報を取得し、該取得した情報を出力することを特徴とする請求の範囲第１項乃至第６項のいずれかに記載の情報処理装置。
【請求項８】
非リアルタイムに実行する情報は、データ構造上、記憶領域の解放を抑止させる設定項目を有する情報であり、
前記第１の処理手段は、非リアルタイムに解析する情報の記憶領域の解放を抑止した後、前記第２の処理手段に非リアルタイムに解析する情報の解析依頼を行うことを特徴とする請求の範囲第１項乃至第７項のいずれかに記載の情報処理装置。
【請求項９】
前記解析管理手段は、前記第１の手法と前記第２の手法のうちの応答時間が短い方の手法の処理が記述された第３のプログラムを生成し、前記第２のプログラム内の前記第１のプログラムの呼び出し命令を、前記第３のプログラムの呼び出し命令に変更することを特徴とする請求の範囲第１項乃至第８項のいずれかに記載の情報処理装置。
【請求項１０】
コンピュータに、
第１のプログラムの呼び出しに関する情報の解析要求に基づき、該解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する第１の手法と、該解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、非リアルタイムに解析する情報以外情報の解析をリアルタイムに実行する第２の手法とのうち、前記第１のプログラムの呼び出しが行われたときの呼び出し元への応答時間が短い方の手法を判定し、
前記第１の手法の方が応答時間が短い場合、前記第１のプログラムの呼び出し命令が記述された第２のプログラムの実行過程における該呼び出し命令の実行時に、解析要求で指定された情報のすべての情報の解析、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、第１の処理手段にリアルタイムに実行させ、前記第２の手法の方が応答時間が短い場合、前記第２のプログラムの実行過程における前記呼び出し命令の実行時に、解析要求で指定された情報のうちの非リアルタイムに解析する情報以外情報の解析、非リアルタイムに解析する情報の第２の処理手段への解析依頼、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、前記第１の処理手段にリアルタイムに実行させ、非リアルタイムに解析する情報の解析を、前記第２の処理手段に非リアルタイムに実行させる、
処理を実行させることを特徴とするプログラム。
【請求項１１】
コンピュータが、
第１のプログラムの呼び出しに関する情報の解析要求に基づき、該解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する第１の手法と、該解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、非リアルタイムに解析する情報以外情報の解析をリアルタイムに実行する第２の手法とのうち、前記第１のプログラムの呼び出しが行われたときの呼び出し元への応答時間が短い方の手法を判定し、
前記第１の手法の方が応答時間が短い場合、前記第１のプログラムの呼び出し命令が記述された第２のプログラムの実行過程における該呼び出し命令の実行時に、解析要求で指定された情報のすべての情報の解析、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、第１の処理手段にリアルタイムに実行させ、前記第２の手法の方が応答時間が短い場合、前記第２のプログラムの実行過程における前記呼び出し命令の実行時に、解析要求で指定された情報のうちの非リアルタイムに解析する情報以外情報の解析、非リアルタイムに解析する情報の第２の処理手段への解析依頼、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、前記第１の処理手段にリアルタイムに実行させ、非リアルタイムに解析する情報の解析を、前記第２の処理手段に非リアルタイムに実行させる、
ことを特徴とする解析方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの呼び出しに関する情報を解析する情報処理装置、プログラム、および解析方法に関する。
【背景技術】
【０００２】
プログラムのデバッグに有用な技術の１つとして、関数が呼ばれたときのタイムスタンプなどのデータを出力する技術がある。関数とは、他のプログラムから所定の関数名によって呼び出されることで実行されるプログラムである。例えば、関数が呼び出されたときのタイムスタンプを取得することで、プログラムの実行時に関数や変数がどのような頻度でアクセスされるかなど、プログラム実行時の特性に関する情報を得ることができる。プログラム実行時の特性に関する情報は、例えばメモリ配置の最適化やダウンロードの最適化などに利用できる。このように、関数が呼ばれるたびに所定の情報を解析して出力することを、その関数をトレースすると言い、この機能を「関数呼び出しのトレース機能」と呼ぶ。【０００３】
例えば、プログラムの実行時のデータ参照をトレース関数呼び出しという形で得ることを可能とする技術がある。この技術では、プログラム中のデータ参照命令をトレース関数呼び出し命令に置き換える。そしてプログラムの実行がデータ参照命令に初めて到達すると、データ参照命令の代わりにトレース関数呼び出し命令を実行する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００３−１４０９２１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかし、従来の技術では、関数の呼び出しに伴うトレースのための情報解析を行っている間、関数の呼び出し元の処理が応答待ちの状態となっているため、トレースのための情報解析が、呼び出し元の処理の遅延要因となっていた。例えば、関数の呼び出しに伴うトレースにおいて、詳細な解析処理や大量のコピー処理が必要になった場合、トレースのための情報解析に時間がかかり、処理の呼び出し元の処理が大幅に遅延してしまう。【０００６】
なお処理の呼び出しに応じたトレースのための情報解析は、関数と呼ばれるプログラムの呼び出しの場合に限定されず、各種プログラムの呼び出し時に実行できる。関数以外のプログラムの呼び出し時にトレースのための情報解析を行う場合にも、関数の呼び出し時と同様に、プログラムの呼び出し元の処理が遅延するという問題がある。【０００７】
１つの側面では、本発明は、プログラムの呼び出し時に情報解析を行うことによる、プログラムの呼び出し元の処理の遅延を抑止した情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上記課題を解決するために、第１のプログラムの呼び出しに関する情報の解析要求に基づき、該解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する第１の手法と、該解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、非リアルタイムに解析する情報以外情報の解析をリアルタイムに実行する第２の手法とのうち、第１のプログラムの呼び出しが行われたときの呼び出し元への応答時間が短い方の手法を判定する判定手段と、第１の手法の方が応答時間が短い場合、第１のプログラムの呼び出し命令が記述された第２のプログラムの実行過程における該呼び出し命令の実行時に、解析要求で指定された情報のすべての情報の解析、第１のプログラムの処理の実行、および呼び出しに対する応答を、第１の処理手段にリアルタイムに実行させ、第２の手法の方が応答時間が短い場合、第２のプログラムの実行過程における呼び出し命令の実行時に、解析要求で指定された情報のうちの非リアルタイムに解析する情報以外情報の解析、非リアルタイムに解析する情報の第２の処理手段への解析依頼、第１のプログラムの処理の実行、および呼び出しに対する応答を、第１の処理手段にリアルタイムに実行させ、非リアルタイムに解析する情報の解析を、第２の処理手段に非リアルタイムに実行させる解析管理手段と、を有することを特徴とする情報処理装置が提供される。
【発明の効果】
【０００９】
プログラムの呼び出し時にトレースを実行することによる、プログラムの呼び出し元の処理の遅延を抑止することができる。
本発明の上記および他の目的、特徴および利点は本発明の例として好ましい実施の形態を表す添付の図面と関連した以下の説明により明らかになるであろう。
【図面の簡単な説明】
【００１０】
【図１】第１の実施の形態に係る装置の機能構成の一例を示す図である。
【図２】第１の実施の形態の処理手順の一例を示すフローチャートである。
【図３】第１の実施の形態による解析処理の一例を示す図である。
【図４】第２の実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。
【図５】第２の実施の形態のコンピュータの機能を示すブロック図である。
【図６】パケット情報のデータ構造の一例を示す図である。
【図７】トレース情報を取得しない場合の処理状況を示す第１の図である。
【図８】トレース情報を取得しない場合の処理状況を示す第２の図である。
【図９】第１の手法によりトレース情報を取得する場合の処理状況を示す第１の図である。
【図１０】第１の手法によりトレース情報を取得する場合の処理状況を示す第２の図である。
【図１１】第２の手法によりトレース情報を取得する場合の処理状況を示す第１の図である。
【図１２】第２の手法によりトレース情報を取得する場合の処理状況を示す第２の図である。
【図１３】トレース管理処理の手順を示すフローチャートである。
【図１４】トレースコマンドと出力情報指定ファイルとのデータ形式の一例を示す図である。
【図１５】トレースコマンドと出力情報指定ファイルとに応じた出力結果の第１の例を示す図である。
【図１６】トレースコマンドと出力情報指定ファイルとに応じた出力結果の第２の例を示す図である。
【図１７】共通域のデータ構造の一例を示す図である。
【図１８】デバッグ要求構造体のデータ構造の一例を示す図である。
【図１９】デバッグ結果構造体のデータ構造の一例を示す図である。
【図２０】情報連鎖構造体のデータ構造の一例を示す図である。
【図２１】情報連鎖構造体による連鎖関係の一例を示す図である。
【図２２】処理時間情報記憶部のデータ構造の一例を示す図である。
【図２３】トレース準備処理の手順を示すフローチャートである。
【図２４】非リアルタイム解析情報の解析時間の算出処理の手順の一例を示すフローチャートである。
【図２５】トレース管理部への情報引渡時間の算出処理の手順の一例を示すフローチャートである。
【図２６】デバッグスレッドへの情報引渡時間の算出処理の手順の一例を示すフローチャートである。
【図２７】時間見積もりテーブルに設定された情報の一例を示す図である。
【図２８】第１のデバッグ処理の手順の一例を示すフローチャートである。
【図２９】第２のデバッグ処理の手順の一例を示すフローチャートである。
【図３０】デバッグスレッドへの情報引渡準備処理の手順の一例を示すフローチャートである。
【図３１】デバッグスレッドの処理の手順の一例を示す図である。
【発明を実施するための形態】
【００１１】
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第１の実施の形態〕
図１は、第１の実施の形態に係る装置の機能構成の一例を示す図である。情報処理装置Ａは、記憶手段１、判定手段２、解析管理手段３、第１の処理手段４、および第２の処理手段５を有する。
【００１２】
記憶手段１は、解析対象となる第１のプログラム１ａと、第１のプログラム１ａの呼び出し命令が記述された第２のプログラム１ｂとを記憶する。
判定手段２には、第１のプログラム１ａの呼び出しに関する情報の解析手法として、第１の手法と第２の手法とが定義されている。第１の手法は、解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する手法である。第２の手法は、解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、非リアルタイムに解析する情報以外情報の解析をリアルタイムに実行する手法である。判定手段２は、第１のプログラム１ａの呼び出しに関する情報の解析要求に基づき、第１の手法と第２の手法とのうち、第１のプログラム１ａの呼び出しが行われたときの呼び出し元への応答時間が短い方の手法を判定する。
【００１３】
なお第１のプログラム１ａの呼び出しに関する情報には、例えば、呼び出し命令に付加された引数の情報や、引数に設定されたアドレスで指定された記憶領域に格納されている情報が含まれる。
【００１４】
解析管理手段３は、第１の処理手段４と第２の処理手段５とを制御し、応答時間が短い方の手法による解析を管理する。第１の処理手段４は処理をリアルタイムに実行し、第２の処理手段５は処理を非リアルタイムに実行する。
【００１５】
解析管理手段３は、第１の手法の方が応答時間が短い場合、第１のプログラム１ａの呼び出し命令が記述された第２のプログラム１ｂの実行過程における該呼び出し命令の実行時に、第１の処理手段４に処理を実行させる。例えば解析管理手段３は、解析要求で指定された情報のすべての情報の解析、第１のプログラム１ａの処理の実行、および呼び出しに対する応答を、第１の処理手段４にリアルタイムに実行させる。
【００１６】
また解析管理手段３は、第２の手法の方が応答時間が短い場合、第２のプログラム１ｂの実行過程における呼び出し命令の実行時に、第１の処理手段４と第２の処理手段５とに処理を実行させる。例えば解析管理手段３は、次の処理を第１の処理手段４にリアルタイムに実行させる。第１の処理手段４に実行させる処理は、解析要求で指定された情報のうちの非リアルタイムに解析する情報以外情報の解析、非リアルタイムに解析する情報の第２の処理手段５への解析依頼、第１のプログラム１ａの処理の実行、および呼び出しに対する応答である。また解析管理手段３は、非リアルタイムに解析する情報の解析を、第２の処理手段５に非リアルタイムに実行させる。
【００１７】
なお図１に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
また第１の処理手段４と第２の処理手段５とは、例えば解析要求に応じて解析管理手段３が生成したプログラムを実行することによって実現できる。この場合、解析管理手段３は、例えば第２のプログラム１ｂにおける第１のプログラム１ａの呼び出し命令の記述を、第１の処理手段４に対応するプログラムの呼び出し命令に書き換える。さらに解析管理手段３は、第１の処理手段４に対応するプログラム内に、第１のプログラム１ａの呼び出し命令を記述することによって、間接的に第１のプログラム１ａが呼び出されるようにする。
【００１８】
次に、図１に示した構成の情報処理装置Ａによる処理手順について説明する。
図２は、第１の実施の形態の処理手順の一例を示すフローチャートである。以下、図２に示す処理をステップ番号に沿って説明する。
【００１９】
［ステップＳ１］判定手段２は、第１のプログラム１ａの呼び出しに関する情報の解析要求を取得すると、解析要求で指定された情報の一部を非リアルタイムで解析させることにより第１の処理手段４で行わずにすむ処理の処理時間（短縮時間）を計算する。短縮時間は、例えば非リアルタイムで解析する情報の解析に要する時間と、解析結果を出力する時間とを加算した時間である。
【００２０】
［ステップＳ２］判定手段２は、第１のプログラム１ａの呼び出しに関する情報の解析要求を取得すると、解析要求で指定された情報の一部を非リアルタイムで解析させることにより第１の処理手段４で新たに発生する処理の処理時間（増加時間）を計算する。増加時間は、例えば、第１の処理手段４から第２の処理手段５への非リアルタイムに解析する情報の解析の依頼に要する時間である。
【００２１】
［ステップＳ３］判定手段２は、短縮時間と増加時間とを比較し、第１の手法と第２の手法とのうち、呼び出し元への応答時間が短い手法を判定する。例えば判定手段２は、第１の処理手段４の処理の短縮時間の方が短ければ、第１の手法の方が応答時間が短いと判断する。また判定手段２は、第１の処理手段４の処理の短縮時間の方が長ければ、第２の手法の方が応答時間が短いと判断する。応答時間が短くなる手法が第１の手法であれば、判定手段２は、処理をステップＳ４に進める。また応答時間が短くなる手法が第２の手法であれば、判定手段２は、処理をステップＳ５に進める。
【００２２】
［ステップＳ４］解析管理手段３は、応答時間が短くなると判定された第１の手法により処理を実行する第１の処理手段４の処理内容を記述したプログラムを生成する。例えば、解析管理手段３は、予め用意された第１の手法用の雛形のプログラムに、第１のプログラム１ａの呼び出し命令を追加することで、第１の処理手段４の処理内容を記述したプログラムを生成する。解析管理手段３は、その後、処理をステップＳ６に進める。
【００２３】
［ステップＳ５］解析管理手段３は、応答時間が短くなると判定された第２の手法により処理を実行する第１の処理手段４の処理内容を記述したプログラムを生成する。例えば、解析管理手段３は、予め用意された第２の手法用の雛形のプログラムに、第１のプログラム１ａの呼び出し命令を追加することで、第１の処理手段４の処理内容を記述したプログラムを生成する。解析管理手段３は、その後、処理をステップＳ６に進める。
【００２４】
［ステップＳ６］解析管理手段３は、第２のプログラム１ｂを編集し、第２のプログラム１ｂの実行過程における第１のプログラム１ａの呼び出し命令の実行時に、第１の処理手段４に対応するプログラムが呼び出されるようにする。例えば解析管理手段３は、第２のプログラム１ｂにおける第１のプログラム１ａの呼び出し命令を、第１の処理手段４に対応するプログラムの呼び出し命令に書き換える。第２のプログラムが既に主記憶装置に読み込まれている場合、命令の書き換えは、例えば主記憶装置に格納された第２のプログラムに対して行われる。また第２のプログラムが主記憶装置に読み込まれていなければ、命令の書き換えは、例えば二次記憶装置に格納された第２のプログラムに対して行われる。
【００２５】
ＯＳ（Operating System）により第２のプログラム１ｂが実行され、第１のプログラム１ａの実行タイミングになると、第１の処理手段４に対応するプログラムの呼び出し命令が実行される。するとＯＳにより第１の処理手段４が実行される。第１の手法で解析を行う場合、第１の処理手段４が、解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する。第２の手法で解析を行う場合、第１の処理手段４が、非リアルタイムで解析する情報以外情報の解析をリアルタイムに実行し、第２の処理手段５が、非リアルタイムで解析する情報の解析を非リアルタイムに実行する。
【００２６】
［ステップＳ７］解析管理手段３は、第１の処理手段４または第２の処理手段５から解析結果を取得する。
［ステップＳ８］解析管理手段３は、解析結果を出力する。
【００２７】
このようにして、応答時間が短くなる手法により、第１のプログラム１ａの呼び出しに関する情報の解析が行われる。
図３は、第１の実施の形態による解析処理の一例を示す図である。図３には、判定手段２による判定結果に応じて、解析管理手段３の管理下で行われる解析処理を模式的に示している。
【００２８】
第１の手法の方が応答時間が短くなると判断された場合、第２のプログラム１ｂを実行する第３の処理手段６が生成され、第２のプログラム１ｂが実行される。第３の処理手段６は、第１の処理手段４に対応するプログラムの呼び出し命令「call func＿dbg1」の実行タイミングになると、そのプログラムの呼び出しを行い、応答待ちの状態となる。するとＯＳにより第１の処理手段４が起動され、解析要求で指定されたすべての情報の解析、解析結果の出力が行われる。その後、第１の処理手段４から、第１のプログラム１ａの呼び出し命令「call func＿a」が実行される。するとＯＳにより、第１のプログラム１ａを実行する第４の処理手段７が起動され、第１のプログラム１ａが実行される。第４の処理手段７は、処理が完了すると、処理結果を第１の処理手段４に応答する。第１の処理手段４は、第４の処理手段７の処理結果を第３の処理手段６に応答する。すると、第３の処理手段６により、第１の処理手段４に対応するプログラムの呼び出し命令「call func＿dbg1」以降の処理が開始される。
【００２９】
第２の手法の方が応答時間が短くなると判断された場合、第２のプログラム１ｂを実行する第３の処理手段６が生成され、第２のプログラム１ｂが実行される。第３の処理手段６は、第１の処理手段４に対応するプログラムの呼び出し命令「call func＿dbg2」の実行タイミングになると、そのプログラムの呼び出しを行い、応答待ちの状態となる。するとＯＳにより第１の処理手段４が起動され、解析要求で指定されたすべての情報のうちのリアルタイムに解析する情報の解析、第２の処理手段５への非リアルタイムに解析する情報の解析依頼が行われる。その後、第１の処理手段４から、第１のプログラム１ａの呼び出し命令「call func＿a」が実行される。するとＯＳにより、第１のプログラム１ａを実行する第４の処理手段７が起動され、第１のプログラム１ａが実行される。第４の処理手段７は、処理が完了すると、処理結果を第１の処理手段４に応答する。第１の処理手段４は、第４の処理手段７の処理結果を第３の処理手段６に応答する。すると、第３の処理手段６により、第１の処理手段４に対応するプログラムの呼び出し命令「call func＿dbg2」以降の処理が開始される。
【００３０】
一方、第２の処理手段５では、非リアルタイムに解析する情報の解析を行う。そして、第２の処理手段５は、解析要求で指定されたすべての情報の解析結果をまとめて出力する。
【００３１】
このように、応答時間が短くなる手法を選択して、プログラムの呼び出しに関する情報の解析を行うようにしたため、第３の処理手段６が応答待ちをする時間が抑止される。その結果、第３の処理手段６による処理に大きな影響を与えずに、解析が可能となる。
【００３２】
例えば、システムの運用中に、プログラムの呼び出しに関する情報を解析する場合もある。このような場合、第１の実施の形態によって解析を行えば、運用中のシステムの処理性能の低下を最小限に抑えることができる。
【００３３】
また第３の処理手段６の応答待ちの時間が長期化すると、正しい解析を行うことができない場合がある。例えば呼び出し元である第２のプログラム１ｂにおいて、第１のプログラム１ａの呼び出し命令実行時の応答時間が所定時間を過ぎると、エラー処理を実行するように記述されている場合がある。このような場合、プログラムの呼び出しに関する情報の解析を実行したことでエラー処理が開始されてしまうと、平常時の動作を正しく解析できなくなってしまう。第１の実施の形態によって解析を行えば、平常時の動作を正しく解析できる可能性が高くなる。
【００３４】
なお、図１または図３に示した判定手段２、解析管理手段３、第１の処理手段４、第２の処理手段５、第３の処理手段６、第４の処理手段７は、情報処理装置Ａが有するＣＰＵ（Central Processing Unit）により実現することができる。また、記憶手段１は、情報処理装置Ａが有するＲＡＭ（Random Access Memory）やハードディスクドライブ（ＨＤＤ:Hard Disk Drive）などにより実現することができる。
【００３５】
〔第２の実施の形態〕
次に第２の実施の形態について説明する。第２の実施の形態は、第１の実施の形態に示した機能に加え、出力する情報の条件を設定し、必要な情報のみを出力することができるようにしたものである。
【００３６】
図４は、第２の実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。ＯＳ１２０は、ＣＰＵ１０１によって装置全体が制御されている。ＣＰＵ１０１には、バス１０８を介してＲＡＭ１０２と複数の周辺機器が接続されている。
【００３７】
ＲＡＭ１０２は、コンピュータ１００の主記憶装置として使用される。ＲＡＭ１０２には、ＣＰＵ１０１に実行させるＯＳのプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ１０２には、ＣＰＵ１０１による処理に必要な各種データが格納される。
【００３８】
バス１０８に接続されている周辺機器としては、ＨＤＤ１０３、グラフィック処理装置１０４、入力インタフェース１０５、光学ドライブ装置１０６、および通信インタフェース１０７がある。
【００３９】
ＨＤＤ１０３は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、コンピュータ１００の二次記憶装置として使用される。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。なお、二次記憶装置としては、フラッシュメモリなどの半導体記憶装置を使用することもできる。
【００４０】
グラフィック処理装置１０４には、モニタ１１が接続されている。グラフィック処理装置１０４は、ＣＰＵ１０１からの命令に従って、画像をモニタ１１の画面に表示させる。モニタ１１としては、ＣＲＴ（Cathode Ray Tube）を用いた表示装置や液晶表示装置などがある。
【００４１】
入力インタフェース１０５には、キーボード１２とマウス１３とが接続されている。入力インタフェース１０５は、キーボード１２やマウス１３から送られてくる信号をＣＰＵ１０１に送信する。なお、マウス１３は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【００４２】
光学ドライブ装置１０６は、レーザ光などを利用して、光ディスク１４に記録されたデータの読み取りを行う。光ディスク１４は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク１４には、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。
【００４３】
通信インタフェース１０７は、ネットワーク１０に接続されている。通信インタフェース１０７は、ネットワーク１０を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
【００４４】
以上のようなハードウェア構成によって、本実施の形態の処理機能を実現することができる。なお、図１に示した第１の実施の形態の情報処理装置も、図４に示したコンピュータと同様のハードウェアにより実現することができる。
【００４５】
図５は、第２の実施の形態のコンピュータの機能を示すブロック図である。ＯＳ１２０は、プログラム記憶部１１０、ＯＳ１２０、およびトレース管理部１３０を有する。
プログラム記憶部１１０は、デバッグ対象となるデバッグ対象関数１１１と、そのプログラムを呼び出す呼び出し元関数１１２とを記憶する。また、トレース管理部１３０内のデバッグ関数生成部１３４によりデバッグプログラムが生成された場合、生成されたデバッグプログラムもプログラム記憶部１１０に格納される。例えばＲＡＭ１０２またはＨＤＤ１０３の記憶領域の一部が、プログラム記憶部１１０として使用される。
【００４６】
ＯＳ１２０は、プログラムの実行要求に応じて、そのプログラムを実行するプロセスを生成し、生成したプロセスによってプログラムを実行する。プロセスは、ＯＳからＣＰＵ１０１、ＲＡＭ１０２、その他のＩ／Ｏ機器などのハードウェア資源の割り当てを受け、割り当てられたハードウェア資源によりプログラムを実行するものである。
【００４７】
なおＯＳ１２０は、仮想記憶方式により、仮想メモリ空間をカーネル空間とユーザ空間に分離している。カーネル空間は、ＯＳ１２０のカーネルやデバイスドライバの実行のためのメモリ空間であり、ユーザから直接の操作は制限される。ユーザ空間は、アプリケーションプログラムなどの実行のためのメモリ空間である。図５の例では、トレース管理部１３０の各機能は、ユーザ空間を利用して実行される。また呼び出し元関数１１２やデバッグ対象関数１１１は、例えばデバイスドライバ用のプログラムであり、カーネル空間を利用してＯＳ１２０により実行されるものとする。
【００４８】
トレース管理部１３０は、トレースコマンドの実行要求に応じて、デバッグ対象関数１１１実行時の情報をトレースする。トレース管理部１３０は、トレース条件記憶部１３１、処理時間情報記憶部１３２、処理時間解析部１３３、デバッグ関数生成部１３４、呼び出し命令変更部１３５、およびトレース情報出力部１３６を有する。
【００４９】
トレース条件記憶部１３１は、プログラム実行時のデータをトレースする際の条件を記憶する。例えばトレース条件記憶部１３１には、トレース条件が記述された出力情報指定ファイル１３１ａが格納される。なお、トレース条件記憶部１３１としては、例えばＲＡＭ１０２またはＨＤＤ１０３の記憶領域の一部が使用される。
【００５０】
処理時間情報記憶部１３２は、情報のトレースに要する時間の算出の基礎となる情報を記憶する。例えば処理時間情報記憶部１３２は、処理内容ごとの処理時間を記憶する。なお、処理時間情報記憶部１３２としては、例えばＲＡＭ１０２またはＨＤＤ１０３の記憶領域の一部が使用される。
【００５１】
処理時間解析部１３３は、トレースコマンドで指定された出力情報指定ファイル１３１ａの内容に基づいて、２つの手法それぞれにおいて、トレース処理に要する時間を計算する。
【００５２】
第１の手法は、リアルタイムに解析する情報（リアルタイム解析情報）と、リアルタイムに解析を行わない情報（非リアルタイム解析情報）との解析を、共にリアルタイムにデバッグ処理を実行するプロセスで行う手法である。
【００５３】
第２の手法は、リアルタイム解析情報の解析についてはリアルタイムにデバッグ処理を実行するプロセスで行い、非リアルタイム解析情報の解析については、デバッグ処理を実行するプロセスとは別のデバッグスレッドで、並列的に行う手法である。
【００５４】
処理時間解析部１３３は、２つの手法それぞれにおけるデバッグ関数の処理時間を比較し、処理時間が短くなる手法を、適用手法に決定する。処理時間解析部１３３は、決定した適用手法を、デバッグ関数生成部１３４に通知する。
【００５５】
デバッグ関数生成部１３４は、適用手法を実行するデバッグプログラムを生成する。例えばデバッグ関数生成部１３４は、第１の手法と第２の手法とのそれぞれ用に予め用意された雛形のプログラムを用いて、デバッグプログラムを生成することができる。雛形のプログラムを用いる場合、デバッグ関数生成部１３４は、雛形のプログラムに対して、リアルタイムに解析するトレース処理に関する記述の後に、デバッグ対象関数１１１の呼び出し命令を挿入する。そしてデバッグ関数生成部１３４は、生成したデバッグプログラムをプログラム記憶部１１０に格納する。またデバッグ関数生成部１３４は、デバッグ処理におけるデータのトレースに第２の手法を適用する場合、ＯＳ１２０に対してデバッグスレッドの生成を要求する。
【００５６】
呼び出し命令変更部１３５は、呼び出し元関数１１２内のデバッグ対象関数１１１の呼び出し命令を、デバッグ関数生成部１３４が生成したデバッグ関数の呼び出し命令に置き換える。例えば、呼び出し命令変更部１３５は、呼び出し元関数１１２をカーネル空間にロードした後、カーネル空間内で関数の呼び出し命令の置き換えを行うことができる。ここでロードとは、ＨＤＤ１０３などの二次記憶装置に格納されたプログラムを、ＲＡＭ１０２などの主記憶装置にコピーすることである。
【００５７】
トレース情報出力部１３６は、デバッグ関数を実行中のＯＳ１２０、またはＯＳ１２０がカーネル空間内に生成したデバッグスレッドからトレース情報を取得する。そしてトレース情報出力部１３６は、取得したトレース情報を出力する。例えばトレース情報出力部１３６は、所定のファイルに、解析結果であるトレース情報を出力する。
【００５８】
このようなコンピュータ１００において、ユーザがトレースコマンドを入力することで、呼び出し元関数１１２の実行時にデバッグ対象関数１１１の呼び出しが行われると、その呼び出し処理に関するトレース情報を取得することができる。
【００５９】
なお、図５に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
また、図５に示すプログラム記憶部１１０は、図１に示した第１の実施の形態の記憶手段１の一例である。図５に示す処理時間解析部１３３は、図１に示した第１の実施の形態の判定手段２の一例である。図５に示すデバッグ関数生成部１３４、呼び出し命令変更部１３５、およびトレース情報出力部１３６は、図１に示した第１の実施の形態の解析管理手段３の一例である。
【００６０】
次に、リアルタイム解析情報と非タイム解析情報とについて説明する。
リアルタイム解析情報としては、例えばタイムスタンプやスタックがある。
タイムスタンプは、関数呼び出し命令が実行された時刻の情報であり、関数呼び出し命令に実行時にリアルタイムに取得することで、正確な時刻が取得でききる。
【００６１】
スタックは、その関数がどの関数から呼び出されていたのかを示す。関数Ａが関数Ｂから呼ばれ、関数Ｂは関数Ｃから呼ばれ、関数Ｃは関数Ｄから呼ばれていた場合、関数Ａのスタックは、関数Ａ←関数Ｂ←関数Ｃ←関数Ｄとなる。
【００６２】
非リアルタイム解析情報としては、例えばネットワークドライバで受け渡しされるパケット情報がある。パケット情報は、例えば関数呼び出し命令の引数に設定されたアドレスで示される記憶領域に格納されている。
【００６３】
図６は、パケット情報のデータ構造の一例を示す図である。ネットワークドライバで受け渡しされるパケット情報は、メッセージブロック構造体２１〜２３が連鎖され、各メッセージブロック構造体２１〜２３がバッファ２４〜２６の先頭アドレス／末尾アドレスを持つデータ構造となっている。メッセージブロック構造体２１〜２３は、各メッセージブロック構造体２１〜２３に設定された、次のメッセージブロック構造体の位置を示すポインタによって、連鎖関係が示される。
【００６４】
ネットワークドライバの送信関数や受信関数で受け渡されるのは、先頭のメッセージブロック構造体２１の先頭アドレスである。なお、メッセージブロック構造体の個数は、何個でもよい（１個でもよいし１０個でもよい）。
【００６５】
パケット情報２７は、複数のモジュールで使用されることが前提となっているため、メッセージブロック構造体２１〜２３の持つ参照カウンタが、現在いくつのモジュールから参照されているのかを示している。先頭のメッセージブロック構造体２１の持つ参照カウンタの値が「０」にならない限り、連鎖関係にあるメッセージブロック構造体２１〜２３およびバッファ２４〜２６のメモリが解放されてしまうことはない。
【００６６】
そのため、ネットワークドライバで受け渡しされるパケット情報２７については、メッセージブロック構造体２１の持つ参照カウンタに１を加えておけば、そのパケット情報２７が格納されたメモリ領域が開放されるのを抑止できる。
【００６７】
パケット情報２７のように、格納されたメモリ領域の開放を容易に抑止できる情報については、リアルタイムに解析しなくてもよい。つまり、リアルタイムに解析しなくても、情報が格納された領域の解放を抑止しておけば、非リアルタイムにその情報を解析することができる。
【００６８】
このように、デバッグ時にトレースする情報には、非リアルタイムに解析可能な情報（非リアルタイム解析情報）が含まれることがある。そこで、非リアルタイム解析情報の解析に要する時間が長い場合、デバッグ処理を実行するプロセスとは別個のデバッグスレッドに非リアルタイム解析情報の解析を実行させることで、デバッグ処理を実行することによる応答遅延を低減できる。ただし、非リアルタイム解析情報の解析をデバッグスレッドに依頼するのにも、ある程度の時間がかかる。そのため、デバッグスレッドへの処理の依頼に要する時間よりも、非リアルタイム解析情報の解析をリアルタイムに実行しないことにより短縮される処理時間の方が短い場合もあり得る。このような場合、デバッグ処理を実行する過程で、非リアルタイム解析情報の解析も含めて、リアルタイムに解析処理を行う方が効率的である。第２の実施の形態では、トレース情報を取得する手法として、第１の手法と第２の手法とのうち、呼び出し元への応答時間が短くなる方の手法により、トレース情報を取得する。
【００６９】
以下、図７〜図１２を参照し、トレース情報を取得しない場合、第１の手法でトレース情報を取得する場合、および第２の手法でトレース情報を取得する場合のそれぞれについて、呼び出し元関数１１２の実行状況の概要を説明する。
【００７０】
図７、図８は、トレース情報を取得しない場合の例を示している。図７、図８の例では、トレースコマンドの実行要求がコンピュータ１００に入力されず、トレース管理部１３０は起動されない。
【００７１】
図７は、トレース情報を取得しない場合の処理状況を示す第１の図である。ＯＳ１２０の起動時に、呼び出し元関数１１２とデバッグ対象関数１１１が、メモリのカーネル空間にロードされる。これにより、カーネル空間内に呼び出し元関数３１とデバッグ対象関数３２とが記憶される。またＯＳ１２０の内部では、呼び出し元関数３１の関数名「ｆｕｎｃ＿ｂ」により呼び出し元関数３１を呼び出すコードが生成される。ＯＳ１２０は、各種処理の実行過程で、呼び出し元関数３１の実行タイミングになると、生成されたコードに基づいて呼び出し元関数３１の実行要求（関数呼び出し）を行う。
【００７２】
なお、ＯＳ１２０の起動後の任意のタイミングで呼び出し元関数１１２とデバッグ対象関数１１１とを、メモリのカーネル空間にロードすることもできる。
カーネル空間にロードされた関数などのプログラムは、ＯＳ１２０の一機能として実行される。そこで、以下の説明では、カーネル空間内でロードしたプログラムは、ＯＳ１２０が実行するものとする。
【００７３】
図８は、トレース情報を取得しない場合の処理状況を示す第２の図である。この状況で、ＯＳ１２０の処理中で呼び出し元関数３１の実行要求（関数呼び出し）が発生したときに、ＯＳ１２０で呼び出し元関数３１が実行される。
【００７４】
呼び出し元関数３１の処理が実行され、デバッグ対象関数３２の関数呼び出し命令（ｃａｌｌ  ｆｕｎｃ＿ａ）の実行タイミングになると、デバッグ対象関数３２が呼び出される。するとデバッグ対象関数３２が実行される。
【００７５】
デバッグ対象関数３２の処理が終了すると、デバッグ対象関数３２の処理結果が、戻り値として呼び出し元関数３１に通知される。そしてデバッグ対象関数３２の処理が終了する。デバッグ対象関数３２から戻り値に基づいて、呼び出し元関数３１における、デバッグ対象関数３２の呼び出し命令以降の命令から処理が続行される。
【００７６】
このように、トレース情報を取得しない場合、呼び出し元関数３１の実行時に、デバッグ対象関数３２の関数呼び出し行われる。一方、トレース情報を取得する場合、呼び出し元関数３１の実行時には、デバッグ関数が呼び出されるように、呼び出し元関数３１の内容が書き換えられる。
【００７７】
図９、図１０は、第１の手法によりトレース情報を取得する場合の例を示している。第１の手法によりトレース情報を取得する場合、ＯＳ１２０起動時の処理は、トレース情報を取得しない場合と同様である。すなわち、図７に示すように、ＯＳ１２０の起動時に、呼び出し元関数１１２とデバッグ対象関数１１１とが、カーネル空間にロードされる。その後、トレースコマンドの実行指示が入力されることで、トレース処理部１３０の処理時間解析部１３３によって、応答時間が短くなるトレース情報の取得手法が判定される。ここで、処理時間解析部１３３により、第１の手法の方が応答時間が短くなると判定されたものとする。
【００７８】
図９は、第１の手法によりトレース情報を取得する場合の処理状況を示す第１の図である。第１の手法でトレース情報を取得する場合、デバッグ関数生成部１３４により、第１の手法でトレース情報を取得するための処理が記述された第１のデバッグ関数３３が生成される。生成された第１のデバッグ関数３３は、カーネル空間にロードされる。
【００７９】
また第１の手法でトレース情報を取得する場合、呼び出し命令変更部１３５により、呼び出し元関数３１内の関数呼び出し命令の内容が書き換えられる。例えば呼び出し命令変更部１３５は、カーネル空間内にロードされた呼び出し元関数３１内のデバッグ対象関数３２の呼び出し命令（ｃａｌｌ  ｆｕｎｃ＿ａ）を、第１のデバッグ関数３３の呼び出し命令（ｃａｌｌ  ｆｕｎｃ＿ｄｂｇ１）に書き換える。
【００８０】
図１０は、第１の手法によりトレース情報を取得する場合の処理状況を示す第２の図である。その後、ＯＳ１２０から呼び出し元関数の実行要求が出されると、コンピュータ１００で呼び出し元関数３１の処理が実行される。
【００８１】
呼び出し元関数３１の処理が実行され、呼び出し元関数３１内の第１のデバッグ関数３３の関数呼び出し命令の実行タイミングになると、第１のデバッグ関数３３が呼び出され、コンピュータ１００で実行される。第１のデバッグ関数３３が実行されている間は、呼び出し元関数３１の処理状態は、戻り値の待ち状態となっている。
【００８２】
ＯＳ１２０は、第１のデバッグ関数３３に記述された命令に従って、処理を実行する。例えば最初にsave命令が実行される。save命令は、ＣＰＵ１０１内のレジスタに格納されたデータのＲＡＭ１０２への退避を一括して行う命令である。save命令を、例えば関数呼び出しが行われたときに先頭で実行することで、呼び出し元関数３１の処理によりレジスタに設定されたデータを、呼び出し先の第１のデバッグ関数３３の処理により書き換えてしまうことを抑止できる。
【００８３】
またＯＳ１２０は、第１のデバッグ関数３３に記述された命令に従い、リアルタイム解析情報の解析を行う。また第１のデバッグ関数３３の処理では、解析対象のデータが、第１のデバッグ関数３３の実行要求時に指定された限定条件に合致する場合には、非リアルタイム解析情報が解析される。解析結果は、トレース管理部１３０内のトレース情報出力部１３６に引き渡される。限定条件とは、デバッグ対象関数３２の関数呼び出しに関連する情報を、トレース処理の対象とするための条件である。関数呼び出しに関連する情報には、例えば関数呼び出し命令の引数や、その引数に設定されたアドレスで示される記憶領域内の情報が含まれる。第１のデバッグ関数３３の処理では、限定条件が満たされていなければ、非リアルタイム解析情報の解析や解析結果の出力は行われない。
【００８４】
また、トレース情報出力部１３６に引き渡される解析結果には、解析対象として指定された情報が含まれる。例えば第１のデバッグ関数３３の処理では、解析結果が、トレース管理部１３０が管理している記憶領域にコピーされる。これにより、解析結果の引き渡しが行われる。
【００８５】
解析結果を取得したトレース管理部１３０のトレース情報出力部１３６は、デバッグスレッドから通知された解析結果を、例えば解析結果ファイル３９に書き出す。解析結果ファイル３９は、例えばＨＤＤ１０３に格納される。
【００８６】
また第１のデバッグ関数３３の処理では、トレース処理終了後、restore命令が実行される。restore命令は、save命令によりレジスタの復元を一括して行う命令である。その後、第１のデバッグ関数３３の処理では、デバッグ対象関数３２の実行要求（関数呼び出し）が行われる。するとコンピュータ１００により、デバッグ対象関数３２が実行される。デバッグ対象関数３２を実行されている間は、第１のデバッグ関数３３の処理状態は、戻り値の待ち状態となっている。
【００８７】
ＯＳ１２０は、デバッグ対象関数３２の実行が終了すると、デバッグ対象関数３２の処理結果を第１のデバッグ関数３３への戻り値とする。デバッグ対象関数３２から戻り値が得られると、ＯＳ１２０は第１のデバッグ関数３３の処理に復帰し、デバッグ対象関数３２から取得したその戻り値を、呼び出し元関数３１への戻り値とする。そして第１のデバッグ関数３３の処理が終了する。
【００８８】
ＯＳ１２０は、第１のデバッグ関数３３からの戻り値に基づき、呼び出し元関数３１における関数呼び出し命令の次の命令から処理を続行する。
なお図９、図１０に示した呼び出し元関数３１に基づくＯＳ１２０の処理機能は、図３に示した第１の実施の形態の第３の処理手段６の一例である。また図９、図１０に示した第１のデバッグ関数３３に基づくＯＳ１２０の処理機能は、図３に示した第１の実施の形態の第１の手法適用時の第１の処理手段４の一例である。さらに図９、図１０に示したデバッグ対象関数３２に基づくＯＳ１２０の処理機能は、図３に示した第１の実施の形態の第４の処理手段７の一例である。
【００８９】
図１１、図１２は、第２の手法によりトレース情報を取得する場合の処理状況を示す図である。第２の手法でトレース情報を取得する場合、ＯＳ１２０起動時の処理は、トレース情報を取得しない場合と同様である。すなわち、図７に示すように、ＯＳ１２０の起動時に、呼び出し元関数１１２とデバッグ対象関数１１１とが、カーネル空間にロードされる。その後、トレースコマンドの実行指示が入力されることで、トレース処理部１３０の処理時間解析部１３３によって、応答時間が短くなるトレース情報の取得手法が判定される。ここで、処理時間解析部１３３により、第２の手法の方が応答時間が短くなると判定されたものとする。
【００９０】
図１１は、第２の手法によりトレース情報を取得する場合の処理状況を示す第１の図である。第２の手法でトレース情報を取得する場合、デバッグ関数生成部１３４により、第２の手法でトレース情報を取得するための処理が記述された第２のデバッグ関数３４が生成される。生成された第２のデバッグ関数３４は、カーネル空間にロードされる。またデバッグ関数生成部１３４は、デバッグスレッド３５のプログラムをカーネル空間内にロードする。この時点では、デバッグスレッド３５はスリープ状態である。デバッグスレッド３５は、呼び出し元関数３１、デバッグ対象関数３２、および第２のデバッグ関数３４の処理と並列的に処理を実行可能な、処理機能である。
【００９１】
また第２の手法でトレース情報を取得する場合、呼び出し命令変更部１３５により、呼び出し元関数３１内の関数呼び出し命令の内容が書き換えられる。例えば呼び出し命令変更部１３５は、カーネル空間内にロードされた呼び出し元関数３１内のデバッグ対象関数３２の呼び出し命令（ｃａｌｌ  ｆｕｎｃ＿ａ）を、第２のデバッグ関数３４の呼び出し命令（ｃａｌｌ  ｆｕｎｃ＿ｄｂｇ２）に書き換える。
【００９２】
図１２は、第２の手法によりトレース情報を取得する場合の処理状況を示す第２の図である。その後、ＯＳ１２０から呼び出し元関数の実行要求が出されると、コンピュータ１００で呼び出し元関数３１が実行される。
【００９３】
呼び出し元関数３１の処理が実行され、呼び出し元関数３１内の第２のデバッグ関数３４の関数呼び出し命令の実行タイミングになると、第２のデバッグ関数３４が呼び出され、コンピュータ１００で実行される。第２のデバッグ関数３４が実行されている間は、呼び出し元関数３１の処理状態は、戻り値の待ち状態となっている。
【００９４】
ＯＳ１２０は、第２のデバッグ関数３４に記述された命令に従って、処理を実行する。例えば最初にsave命令が実行される。またＯＳ１２０は、第２のデバッグ関数３４に記述された命令に従い、リアルタイム解析情報の解析を行う。
【００９５】
また第２のデバッグ関数３４の処理では、デバッグスレッド３５への情報の引渡準備を行った後、デバッグスレッド３５のウェイクアップ指示が実行される。スリープ（sleep）状態のデバッグスレッド３５が動作状態に移行される。その後、第２のデバッグ関数３４の処理では、restore命令が実行される。さらに第２のデバッグ関数３４の処理では、デバッグ対象関数３２の実行要求が行われる。するとコンピュータ１００により、デバッグ対象関数３２を実行される。デバッグ対象関数３２を実行されている間は、第２のデバッグ関数３４の処理状態は、戻り値の待ち状態となっている。
【００９６】
ＯＳ１２０は、デバッグ対象関数３２の実行が終了すると、デバッグ対象関数３２の処理結果を第２のデバッグ関数３４への戻り値とする。デバッグ対象関数３２から戻り値が得られると、ＯＳ１２０は第２のデバッグ関数３４の処理に復帰し、デバッグ対象関数３２から取得したその戻り値を、呼び出し元関数３１への戻り値とする。そして第２のデバッグ関数３４の処理が終了する。
【００９７】
ＯＳ１２０は、第２のデバッグ関数３４からの戻り値に基づき、呼び出し元関数３１における関数呼び出し命令の次の命令から処理を続行する。
一方、デバッグスレッド３５は、解析対象が、第２のデバッグ関数３４の実行要求時に指定された限定条件に合致する場合には、非リアルタイム解析情報を解析し、解析結果をトレース管理部１３０内のトレース情報出力部１３６に引き渡す。例えばデバッグスレッド３５は、解析結果を、トレース管理部１３０が管理する記憶領域内にコピーする。なおデバッグスレッド３５は、限定条件が満たされていなければ、非リアルタイム解析情報の解析や解析結果の出力を行わずに、スリープ状態に移行する。
【００９８】
解析結果を取得したトレース情報出力部１３６は、デバッグスレッド３５から通知された解析結果を、例えば解析結果ファイル３９に書き出す。解析結果ファイル３９は、例えばＨＤＤ１０３に格納される。
【００９９】
このように、第２の手法では、非リアルタイム解析情報の解析は、第２のデバッグ関数３４の処理と並列で実行可能なデバッグスレッド３５で実行される。そのため、第２のデバッグ関数３４を実行する第２のデバッグ関数３４は、非リアルタイム解析情報の解析を待たずに、処理を進めることができる。
【０１００】
なお図１１、図１２に示した第２のデバッグ関数３４に基づくＯＳ１２０の処理機能は、図３に示した第１の実施の形態の第２の手法適用時の第１の処理手段４の一例である。また図１１、図１２に示したデバッグスレッド３５を用いたＯＳ１２０の処理機能は、図３に示した第１の実施の形態の第２の処理手段５の一例である。
【０１０１】
次に、トレース管理部１３０が実行するトレース管理処理を詳細に説明する。
図１３は、トレース管理処理の手順を示すフローチャートである。以下、図１３に示す処理をステップ番号に沿って説明する。
【０１０２】
［ステップＳ１１］ＯＳ１２０は、トレースコマンドの入力を受け付ける。ＯＳ１２０は、トレースコマンドが入力されると、トレース管理部１３０を起動する。
［ステップＳ１２］トレース管理部１３０は、トレース準備処理を行う。トレース準備処理は、デバッグプログラムの生成や、デバッグ対象関数内の関数呼び出し命令の変更などの処理である。トレース準備処理の詳細は後述する（図２３参照）。
【０１０３】
［ステップＳ１３］トレース情報出力部１３６は、所定時間待機し、処理をステップＳ１４に進める。
［ステップＳ１４］トレース情報出力部１３６は、管理者からの操作などによるトレース終了指示が入力されたか否かを判断する。トレース情報出力部１３６は、トレース終了指示が入力された場合、処理をステップＳ１７に進める。またトレース情報出力部１３６は、トレース終了指示が入力されていなければ、処理をステップＳ１５に進める。
【０１０４】
［ステップＳ１５］トレース情報出力部１３６は、解析結果が通知されたか否かを判断する。例えばトレース情報出力部１３６は、共通域に解析結果が格納された場合に、解析結果が通知されたと判断する。トレース情報出力部１３６は、解析結果が通知された場合、処理をステップＳ１６に進める。またトレース情報出力部１３６は、解析結果が通知されていなければ、処理をステップＳ１３に進める。
【０１０５】
［ステップＳ１６］トレース情報出力部１３６は、通知された解析結果を、ファイルなどに出力する。その後、トレース情報出力部１３６は、処理をステップＳ１３に進める。
［ステップＳ１７］呼び出し命令変更部１３５は、トレース準備処理内で行った呼び出し元関数３１に対する関数呼び出し命令の変更を、元の呼び出し命令に戻す。
【０１０６】
［ステップＳ１８］デバッグ関数生成部１３４は、デバッグスレッド３５の有無を判断する。デバッグ関数生成部１３４は、デバッグスレッド３５が存在していれば、処理をステップＳ１９に進める。またデバッグ関数生成部１３４は、デバッグスレッド３５が存在していなければ、トレース管理処理を終了する。
【０１０７】
［ステップＳ１９］デバッグ関数生成部１３４は、ＯＳ１２０に対してデバッグスレッド３５の消去を指示する。その後、トレース管理処理を終了する。
このような手順でトレース情報が取得される。
【０１０８】
ここで、ステップＳ１１で入力されるトレースコマンドに基づくトレース条件の定義例について説明する。
図１４は、トレースコマンドと出力情報指定ファイルとのデータ形式の一例を示す図である。
【０１０９】
トレースコマンド５１は、図１４に示すように「ctrace （出力情報指定ファイル）」という形式で入力される。ここで「ctrace」が、トレースコマンドのコマンド名であり、「出力情報指定ファイル」がトレースコマンド５１に設定する引数である。「出力情報指定ファイル」には、トレース処理に関する限定条件などの定義されたファイル（出力情報指定ファイル５２）の位置（ディレクトリパス）と、ファイル名とが設定される。
【０１１０】
出力情報指定ファイル５２には、例えば、複数の記述子が設定される。記述子５３には呼び出し元関数、デバッグ対象関数、１つ以上の限定条件、および出力情報が設定される。
【０１１１】
呼び出し元関数名は、デバッグの対象となるデバッグ対象関数１１１を呼び出す呼び出し元関数の名称である。なお呼び出し元関数は複数指定することもできる。例えば、「func＿b1」と「func＿b2」と「func＿b3」の３個の呼び出し元関数を指定する場合は、「func＿b1:func＿b2:func＿b3」のように設定する。また呼び出し元関数として、カーネル空間で実行されるすべての関数を指定することも可能である。その場合は、例えば、呼び出し元関数名として「kernel」と記述する。
【０１１２】
一方、第２の実施の形態では、デバッグ対象関数は１個の記述子５３に１個のみ指定するものとする。
記述子５３には、複数の限定条件を設定できる。限定条件５４には、引数番号、引数種別、および任意の数の条件が設定できる。引数番号は、例えば「argN (N=0,1,2,…)」で指定する。これは、引数番号が「Ｎ」の引数に関する条件指定であることを意味する。引数種別は、例えば「plain」、「mblk＿t」などのキーワードで指定される。「plain」は、引数に設定されている情報がプレーンデータ（プレーンテキスト）の先頭アドレスであることを示す。「mblk＿t」は、引数に設定されている情報がメッセージブロック構造体の先頭アドレスであることを示す。
【０１１３】
条件は、「Ａ＝Ｂ」や「Ａ＜Ｂ」（Ａ，Ｂは実数）といった形、あるいは、「ftp」などのキーワードで示される。例えば、「Ethertype=0x800」と条件に指定すれば、引数種別が「mblk＿t」であった場合に、その引数が示すパケットの「Ethertype」が「0x800」（つまりＩＰ（Internet Protocol）のパケット）である場合だけ、情報出力を行うことを意味する。また「pattern="abc"」と条件に指定すれば、パケット中に"abc"（１６進だと 0x626364）というパターンが含まれる場合のみ情報出力することを意味する。また「LEN<101」と条件に指定すれば、パケット長（ＭＡＣ（Media Access Control）ヘッダを含む）が１０１より小さい場合だけ情報出力を行うことを意味する。キーワード「ftp」を条件に指定すれば、「Ethertype=0x800, protocol=tcp, port=21」を指定したのと同じ意味となる。つまりＦＴＰ（File Transfer Protocol）で送受信されたパケットを意味する。
【０１１４】
また記述子５３における出力情報の形式は、「argN (N=0,1,2,…)」、「timestamp」、「stack」などのキーワード、または、「引数番号：引数種別：範囲」の形式で示される。「argN」は引数番号「Ｎ」の値を出力せよという指定である。「timestamp」は、その関数を通過した時刻を出力せよという指定である。「stack」は、その関数のスタックを出力せよという指定である。「引数番号：引数種別：範囲」の指定は、引数番号で指定された引数に設定されたアドレスの、引数種別で指定された種別の情報から、範囲で指定された部分を出力せよという指定である。引数番号と引数種別の指定方法は、限定条件の指定方法と同様である。
【０１１５】
出力情報における範囲は、例えば「Ａ−Ｂ」という形式で指定する。例えば以下のような指定を可能とする。範囲を「０−６４」と指定すると、パケットの０バイト目〜６４バイト目までを出力せよという指定となる。範囲を、「０−ＩＰ＿ｈｅａｄｅｒ」と指定すると、パケットの０バイト目〜ＩＰヘッダの末尾までを出力せよという指定となる。範囲を「１４−６４」と指定すると、１４バイト目〜６４バイト目までを出力せよという指定となる。範囲を「０−ｅｎｄ」と指定すると、パケット全体を出力せよという指定となる。
【０１１６】
図１５は、トレースコマンドと出力情報指定ファイルとに応じた出力結果の第１の例を示す図である。図１５の例では、トレースコマンド６１において、ファイル名「ｆｉｌｅ＿１」の出力情報指定ファイル６２が指定されている。
【０１１７】
この出力情報指定ファイル６２の例では、関数「ｆｕｎｃ＿ｂ」に対応する呼び出し元関数を実行する呼び出し元関数３１から、関数「ｆｕｎｃ＿ａ」が呼ばれるたびに、トレース情報の取得処理が実行される。トレース情報の取得処理では、関数「ｆｕｎｃ＿ａ」の引数「０」をネットワークで受け渡されるパケット情報であると考えた場合に、「Ethertype」が「0x800」（つまりＩＰパケットである）場合に限って出力が行われる。出力情報は、引数「０」の値、引数「１」の値、タイムスタンプ、スタック、パケットの０バイト目〜ＩＰヘッダの末尾までである。解析結果としては、例えば図１５の解析結果ファイル６３に示す内容が出力される。
【０１１８】
図１６は、トレースコマンドと出力情報指定ファイルとに応じた出力結果の第２の例を示す図である。図１６の例では、トレースコマンド６４において、ファイル名「ｆｉｌｅ＿２」の出力情報指定ファイル６５が指定されている。
【０１１９】
この出力情報指定ファイル６５の例では、関数「ｆｕｎｃ＿ｂ」に対応するプログラムを実行する呼び出し元関数３１から、関数「ｆｕｎｃ＿ａ」が呼ばれるたびに、トレース情報の取得処理が実行される。トレース情報の取得処理では、関数「ｆｕｎｃ＿ａ」の引数０をネットワークで受け渡されるパケット情報であると考えた場合に、ＦＴＰのパケットで、かつ、「abc」というパターンを含むパケットのみ出力される。出力情報は、引数０の値、引数１の値、タイムスタンプ、スタック、パケットの全体である。解析結果としては、例えば図１６の解析結果ファイル６６に示す内容が出力される。
【０１２０】
このように、予め出力情報指定ファイルを用意しておくことで、出力情報に関する条件を詳細に指定できる。トレース管理部１３０は、出力情報指定ファイルに示された出力情報の条件を、例えば共通域を介して、カーネル空間内の第１のデバッグ関数３３または第２のデバッグ関数３４に渡す。共通域は、カーネル空間内のプロセスとユーザ空間内のプロセスとの両方が使用できる、カーネル空間内のメモリ領域である。
【０１２１】
図１７は、共通域のデータ構造の一例を示す図である。共通域４０には、例えば３つのフィールド４１〜４３が設けられている。
最初のフィールド４１には、情報連鎖構造体のアドレスが設定される。情報連鎖構造体は、複数の呼び出し元から、トレース対象の関数の呼び出しが重複した場合に、複数の関数呼び出しそれぞれの解析結果を連鎖的に関連付ける情報である。共通域４０の情報連鎖構造体のアドレスのフィールド４１には、連鎖関係の先頭にある情報連鎖構造体のアドレスが設定される。
【０１２２】
２つめのフィールド４２には、デバッグ結果構造体の大きさが設定される。デバッグ結果構造体は、デバッグによる解析結果の格納領域である。
３つめのフィールド４３には、デバッグ要求構造体が設定される。デバッグ要求構造体は、トレース管理部１３０からのデバッグ要求の内容を示す情報である。
【０１２３】
なおデバッグ要求構造体は、トレースコマンドで指定された出力情報指定ファイルに基づいて、デバッグ関数生成部１３４によって生成される。
図１８は、デバッグ要求構造体のデータ構造の一例を示す図である。デバッグ要求構造体７０には、基本情報領域７１と拡張情報領域７２とが含まれる。
【０１２４】
基本情報領域７１には、構造体の大きさ、引数ごとの引数要求フラグ、タイムスタンプ要求フラグ、およびスタック要求フラグの各フィールドが設けられている。
構造体の大きさのフィールドには、デバッグ要求構造体７０のデータサイズが設定される。
【０１２５】
引数ごとの引数要求フラグのフィールドには、関数呼び出し命令に設定された引数の値を出力するか否かを示すフラグが設定される。図１８の例では、関数呼び出し命令に対して最大で１６個の引数が設定される場合が想定されている。関数呼び出し命令に設定される引数は、例えば、左から順番に０〜１５の引数番号が設定される。例えば、引数番号の引数の値を出力しない場合、その引数番号に対応する引数要求フラグのフィールドに「０」が設定される。引数番号の引数の値を出力する場合、その引数番号に対応する引数要求フラグのフィールドに「１」が設定される。
【０１２６】
タイムスタンプ要求フラグのフィールドには、タイムスタンプを出力するか否かを示すフラグが設定される。例えばタイムスタンプを出力しない場合、タイムスタンプ要求フラグのフィールドに「０」が設定される。また呼び出し元関数３１による関数呼び出し命令実行時を示すタイムスタンプを出力する場合、タイムスタンプ要求フラグのフィールドに「１」が設定される。
【０１２７】
スタック要求フラグのフィールドには、スタックの情報を出力するか否かを示すフラグが設定される。例えばスタックの情報を出力しない場合、スタック要求フラグのフィールドに「０」が設定される。またスタックの情報を出力する場合、スタック要求フラグのフィールドに「１」が設定される。
【０１２８】
拡張情報領域７２には、引数番号、引数種別、限定条件個数、複数の限定条件、および複数の取り出し部分の各フィールドが設けられている。
引数番号のフィールドには、出力する情報が格納された記憶領域のアドレスが設定された引数の番号が設定される。
【０１２９】
引数種別のフィールドには、出力する情報の種別が設定される。例えば出力する情報が、ネットワーク送受信データを表すメッセージブロック構造体であれば、引数種別のフィールドに「１」が設定される。また出力する情報が、プレーンデータのファイルであれば、引数種別のフィールドに「２」が設定される。
【０１３０】
限定条件個数のフィールドには、限定条件の個数が設定される。
限定条件のフィールドには、情報の出力を行うか否かの判断基準となる限定条件が設定される。例えば、引数種別が「１」の場合、限定条件のフィールドに、「Ethertype」、「送信元／送信先ＩＰアドレス」、「パケット長」などの条件が設定される。
【０１３１】
取り出し部分のフィールドには、出力する情報から解析結果として取り出す部分を指定する情報が設定される。例えば、引数種別が「１」の場合、先頭からＭＡＣヘッダまで、先頭からＩＰヘッダまで、先頭からＴＣＰヘッダまで、ＩＰヘッダのみ、ＴＣＰヘッダのみ、ＴＣＰチェックサム値のみ、xxバイト目〜yyバイト目までなどが、取り出し部分として指定できる。
【０１３２】
図１９は、デバッグ結果構造体のデータ構造の一例を示す図である。デバッグ結果構造体７３には、引数番号ごとの引数要求フラグのフィールドと、引数要求フラグのフィールドそれぞれに対応する引数の値のフィールドが設けられている。引数要求フラグのフィールドには、対応する引数番号で示される引数を取得したか否かを示すフラグが設定される。引数の値のフィールドには、対応する引数番号で示された引数の値が設定される。
【０１３３】
またデバッグ結果構造体７３には、タイムスタンプ要求フラグのフィールドと、タイムスタンプの値のフィールドが設けられている。タイムスタンプ要求フラグのフィールドには、タイムスタンプを取得したか否かを示すフラグが設定される。タイムスタンプの値のフィールドには、取得したタイムスタンプの値が設定される。
【０１３４】
またデバッグ結果構造体７３には、スタック要求フラグのフィールド、スタックの深さのフィールド、およびスタックに示される関数名のフィールドが設けられている。スタック要求フラグのフィールドには、スタックを取得したか否かを示すフラグが設定される。スタックの深さのフィールドには、何段階の関数呼び出しが行われたか（スタックに示される関数名の数）が設定される。関数名のフィールドには、スタックに含まれる関数名が設定される。例えば関数名のフィールドには順番が設定されており、呼び出し元の関数から順に、その関数の関数名が関数名のフィールドに設定される。
【０１３５】
またデバッグ結果構造体７３には、取り出し部分の大きさのフィールドと、取り出し部分のフィールドとが設けられている。取り出し部分の大きさのフィールドには、引数に設定されたアドレスで示された記憶領域内の情報から取り出した部分データのサイズが設定される。取り出し部分のフィールドには、引数に設定されたアドレスで示された記憶領域内の情報から取り出した部分データが設定される。
【０１３６】
図２０は、情報連鎖構造体のデータ構造の一例を示す図である。情報連鎖構造体７４には、次の情報連鎖構造体のアドレスのフィールド、デバッグ結果構造体のアドレスのフィールド、非リアルタイム解析情報種別のフィールド、および非リアルタイム解析情報領域のアドレスのフィールドが設けられている。
【０１３７】
次の情報連鎖構造体のアドレスのフィールドには、次に連鎖された情報連鎖構造体が格納された記憶領域の先頭のアドレスが設定される。なお、次に連鎖された情報連鎖構造体が存在しない場合、次の情報連鎖構造体のアドレスのフィールドには、例えば「０」が設定される。
【０１３８】
デバッグ結果構造体のアドレスのフィールドには、デバッグ結果構造体が格納された記憶領域の先頭のアドレスが設定される。
非リアルタイム解析情報種別のフィールドには、非リアルタイム解析情報が格納された記憶領域のデータ構造の種別が設定される。例えば非リアルタイム解析情報のデータ構造がメッセージブロック構造体であれば、非リアルタイム解析情報種別のフィールドに「１」が設定される。また非リアルタイム解析情報のデータ構造がプレーンデータであれば、非リアルタイム解析情報種別のフィールドに「２」が設定される。
【０１３９】
非リアルタイム解析情報領域のアドレスのフィールドには、非リアルタイム解析情報が格納された記憶領域の先頭のアドレスが設定される。
図２０に示した情報連鎖構造体７４は、複数の情報連鎖構造体によって連鎖関係を定義できる。
【０１４０】
図２１は、情報連鎖構造体による連鎖関係の一例を示す図である。図２１の例では、３つの情報連鎖構造体８１〜８３が連鎖関係となっている。共通域４０の情報連鎖構造体のアドレスのフィールド４１には、情報連鎖構造体８１が格納された記憶領域の先頭のアドレスが設定されている。情報連鎖構造体８１の次の情報連鎖構造体のアドレスのフィールドには、情報連鎖構造体８２が格納された記憶領域の先頭のアドレスが設定されている。情報連鎖構造体８２の次の情報連鎖構造体のアドレスのフィールドには、情報連鎖構造体８３が格納された記憶領域の先頭のアドレスが設定されている。情報連鎖構造体８３の次の情報連鎖構造体のアドレスのフィールドには、連鎖の最後であることを示す値「０」が設定されている。
【０１４１】
また、情報連鎖構造体８１〜８３それぞれに設定されたデバッグ結果構造体のアドレスにより、情報連鎖構造体８１〜８３それぞれに、デバッグ結果構造体８４〜８５が関連付けられている。さらに情報連鎖構造体８１〜８３それぞれに設定された非リアルタイム解析情報領域のアドレスにより、情報連鎖構造体８１〜８３それぞれに、非リアルタイム解析情報を含む記憶領域（非リアルタイム解析情報領域）８７〜８９が関連付けられている。
【０１４２】
次に、処理時間情報記憶部１３２のデータ構造について説明する。
図２２は、処理時間情報記憶部のデータ構造の一例を示す図である。処理時間情報記憶部１３２には、時間見積もりテーブル１３２ａが格納されている。時間見積もりテーブル１３２ａには、解析情報、リアルタイム解析の要否、解析時間、情報引渡時間、および依頼準備時間の列が設けられている。
【０１４３】
解析情報の列には、トレース処理で解析対象となる情報（解析情報）の種別が設定される。解析情報には、出力情報指定ファイルによって出力対象として指定可能な情報（出力情報）と、限定条件との照合対象となる情報とが含まれる。リアルタイム解析の要否の列には、対応する解析情報が、リアルタイムに解析する対象か否かが設定される。解析時間の列には、解析情報の解析に要する時間の見積もり値が設定される。情報引渡時間の列には、解析結果のトレース情報をトレース管理部１３０に引き渡すのに要する時間の見積もり値が設定される。依頼準備時間の列には、非リアルタイム解析情報の解析をデバッグスレッド３５に依頼するための準備処理に要する時間の見積もり値が設定される。
【０１４４】
このような時間見積もりテーブル１３２ａに基づいて、トレース準備処理（図１３のステップＳ１２）において、トレース取得手法を第１の手法にするのか第２の手法にするのかを、適切に判断することができる。
【０１４５】
図２３は、トレース準備処理の手順を示すフローチャートである。以下、図２３に示す処理をステップ番号に沿って説明する。
［ステップＳ３１］トレース管理部１３０のデバッグ関数生成部１３４は、カーネル空間内に共通域４０を獲得する。次に、デバッグ関数生成部１３４は、トレースコマンドの引数で指定された出力情報指定ファイルの内容に従って、デバッグ要求構造体を生成する。そしてデバッグ関数生成部１３４は、生成したデバッグ要求構造体を共通域４０に格納する。またデバッグ関数生成部１３４は、デバッグ結果構造体の大きさを計算し、共通域４０に格納する。
【０１４６】
［ステップＳ３２］処理時間解析部１３３は、非リアルタイム解析情報の解析時間の算出処理を行う。ここで、算出された非リアルタイム解析情報の解析時間を変数「ａ」に設定する。この処理の詳細は後述する（図２４参照）。
【０１４７】
［ステップＳ３３］処理時間解析部１３３は、トレース管理部１３０への情報引渡時間の算出処理を行う。ここで、算出されたトレース管理部１３０への情報引渡時間を変数「ｂ」に設定する。この処理の詳細は後述する（図２５参照）。
【０１４８】
［ステップＳ３４］処理時間解析部１３３は、デバッグスレッド３５への情報引渡時間の算出処理を行う。ここで、算出されたデバッグスレッド３５への情報引渡時間を変数「ｃ」に設定する。この処理の詳細は後述する（図２６参照）。
【０１４９】
［ステップＳ３５］処理時間解析部１３３は、トレース取得手法として第１の手法が適切か、第２の手法が適切かの判定を行う。例えば処理時間解析部１３３は、非リアルタイム解析情報の解析時間（ａ）とトレース管理部１３０への情報引渡時間（ｂ）との加算結果と、デバッグスレッド３５への情報引渡時間（ｃ）とを比較する。時間が等しいか、またはデバッグスレッド３５への情報引渡時間（ｃ）の方が長ければ、処理時間解析部１３３は、第１の手法が適切であると判定し、処理をステップＳ３６に進める。非リアルタイム解析情報の解析時間（ａ）とトレース管理部１３０への情報引渡時間（ｂ）との加算結果の方が長ければ、処理時間解析部１３３は、第２の手法が適切であると判定し、処理をステップＳ３８に進める。
【０１５０】
［ステップＳ３６］処理時間解析部１３３において第１の手法が適切であると判定された場合、デバッグ関数生成部１３４は、関数名「ｆｕｎｃ＿ｄｂｇ１」の第１のデバッグ関数３３を生成する。デバッグ関数生成部１３４は、生成した第１のデバッグ関数３３をカーネル空間にロードする。そして、デバッグ関数生成部１３４は、生成した第１のデバッグ関数３３が関数名「ｆｕｎｃ＿ｄｂｇ１」の呼び出しに応じて実行されるように、ＯＳ１２０に対して設定する。
【０１５１】
［ステップＳ３７］処理時間解析部１３３において第１の手法が適切であると判定された場合、呼び出し命令変更部１３５は、呼び出し元関数３１内の関数呼び出し先を、第１のデバッグ関数３３に変更する。例えば呼び出し命令変更部１３５は、カーネル空間内において、呼び出し元関数３１内のデバッグ対象関数３２の呼び出し命令を、第１のデバッグ関数３３の呼び出し命令に書き換える。その後、トレース準備処理が終了する。
【０１５２】
［ステップＳ３８］処理時間解析部１３３において第２の手法が適切であると判定された場合、デバッグ関数生成部１３４は、関数名「ｆｕｎｃ＿ｄｂｇ２」の第２のデバッグ関数３４を生成する。デバッグ関数生成部１３４は、生成した第２のデバッグ関数３４をカーネル空間にロードする。そしてデバッグ関数生成部１３４は、生成した第２のデバッグ関数３４が、関数名「ｆｕｎｃ＿ｄｂｇ２」の呼び出しに応じて実行されるように、ＯＳ１２０に対して設定する。
【０１５３】
［ステップＳ３９］処理時間解析部１３３において第２の手法が適切であると判定された場合、呼び出し命令変更部１３５は、呼び出し元関数３１内の関数呼び出し先を、第２のデバッグ関数に変更する。例えば呼び出し命令変更部１３５は、カーネル空間内において、呼び出し元関数３１内のデバッグ対象関数３２の呼び出し命令を、第２のデバッグ関数３４の呼び出し命令に書き換える。その後、トレース準備処理が終了する。
【０１５４】
次に、非リアルタイム解析情報の解析時間の算出処理の手順について説明する。
図２４は、非リアルタイム解析情報の解析時間の算出処理の手順の一例を示すフローチャートである。以下、図２４に示す処理をステップ番号に沿って説明する。
【０１５５】
［ステップＳ４１］処理時間解析部１３３は、時間見積もりテーブル１３２ａの解析情報の列において、トレースコマンドによってユーザが指定した解析情報が設定されたエントリ（行）を選択する。例えば処理時間解析部１３３は、共通域４０に格納されたデバッグ要求構造体７０の基本情報領域７１において情報出力を行うことが示されている（例えばフラグの値が「１」）引数要求フラグに対応する引数の引数番号を判断する。次に処理時間解析部１３３は、トレース対象の関数（ｆｕｎｃ＿ａ）の引数の記述フォーマットに基づいて、情報出力を行う引数に対応する情報の種別を判断する。そして処理時間解析部１３３は、情報出力の対象となる種別の情報の行を、時間見積もりテーブル１３２ａからすべて選択する。また処理時間解析部１３３は、デバッグ要求構造体７０の拡張情報領域７２において、設定されている限定条件の照合対象となる情報、および取り出し部分として指定されている情報の行を、時間見積もりテーブル１３２ａからすべて選択する。
【０１５６】
［ステップＳ４２］処理時間解析部１３３は、選択した各行の情報について、何個の引数から解析情報として指定されているのかを計数し、ＲＡＭ１０２などに記録する。
［ステップＳ４３］処理時間解析部１３３は、ステップＳ４１で選択した列の情報のうち、リアルタイム解析が不要な情報をすべて選択する。例えば処理時間解析部１３３は、時間見積もりテーブル１３２ａにおけるステップＳ４１で選択した行のリアルタイム解析の要否の列の値を参照して、リアルタイム解析が不要と設定されている情報の行をすべて選択する。
【０１５７】
［ステップＳ４４］処理時間解析部１３３は、ステップＳ４３で選択した行の解析時間を合計し、変数「ａ」に設定する。なお処理時間解析部１３３は、複数の引数から解析情報として指定されている情報については、合計する前に、その情報の解析時間に対して、指定を行っている引数の個数を乗算する。
【０１５８】
このようにして、非リアルタイム解析情報の解析時間が算出される。
次に、トレース管理部１３０への情報引渡時間の算出処理の手順について説明する。
図２５は、トレース管理部への情報引渡時間の算出処理の手順の一例を示すフローチャートである。以下、図２５に示す処理をステップ番号に沿って説明する。
【０１５９】
［ステップＳ５１］処理時間解析部１３３は、時間見積もりテーブル１３２ａの解析情報の列において、トレースコマンドによってユーザが指定した解析情報が設定されたエントリ（行）を選択する。この処理の詳細は、図２４のステップＳ４１と同様である。
【０１６０】
［ステップＳ５２］処理時間解析部１３３は、選択した各行の情報について、何個の引数から解析情報として指定されているのかを計数し、ＲＡＭ１０２などに記録する。
［ステップＳ５３］処理時間解析部１３３は、ステップＳ５１で選択した行の情報引渡時間を合計し、変数「ｂ」に設定する。なお処理時間解析部１３３は、複数の引数から解析情報として指定されている情報については、合計する前に、その情報の情報引渡時間に対して、指定を行っている引数の個数を乗算する。
【０１６１】
このようにして、トレース管理部１３０への情報引渡時間が算出される。
次に、デバッグスレッドへの情報引渡時間の算出処理の手順について説明する。
図２６は、デバッグスレッドへの情報引渡時間の算出処理の手順の一例を示すフローチャートである。以下、図２６に示す処理をステップ番号に沿って説明する。
【０１６２】
［ステップＳ６１］処理時間解析部１３３は、時間見積もりテーブル１３２ａの解析情報の列において、トレースコマンドによってユーザが指定した解析情報が設定されたエントリ（行）を選択する。この処理の詳細は、図２４のステップＳ４１と同様である。
【０１６３】
［ステップＳ６２］処理時間解析部１３３は、選択した各行の情報について、何個の引数から解析情報として指定されているのかを計数し、ＲＡＭ１０２などに記録する。
［ステップＳ６３］処理時間解析部１３３は、ステップＳ６１で選択した行の依頼準備時間を合計する。なお処理時間解析部１３３は、複数の引数から解析情報として指定されている情報については、合計する前に、その情報の依頼準備時間に対して、指定を行っている引数の個数を乗算する。
【０１６４】
［ステップＳ６４］処理時間解析部１３３は、ステップＳ６３で計算した合計値に、デバッグスレッドをウェイクアップ（wakeup）させる時間を加算し、変数「ｃ」に設定する。なお、デバッグスレッドをウェイクアップさせる時間は、例えば予め処理時間解析部１３３に設定されている。
【０１６５】
このようにして、デバッグスレッドへの情報引渡時間が算出される。
このようにして算出された非リアルタイム解析情報の解析時間、トレース管理部への情報引渡時間、およびデバッグスレッドへの情報引渡時間に基づいて、適用するトレース手法が判定される。以下、具体的な計算例について説明する。
【０１６６】
図２７は、時間見積もりテーブルに設定された情報の一例を示す図である。図２７の時間見積もりテーブル１３２ａの例では、解析時間、情報引渡時間、依頼準備時間の各時間が、マイクロ秒（μｓ）単位で示されている。また解析情報ごとの解析時間、情報引渡時間、依頼準備時間には、例えば所定の環境で実測した値が設定されている。
【０１６７】
なお、図２７には示していないが、デバッグスレッドをウェイクアップさせるのに要する時間は、「１０μｓ」であるものとする。
図２７に示したような時間見積もりテーブル１３２ａに基づく、トレース手法の２つの判定例を以下に示す。
【０１６８】
＜第１のトレース手法判定例＞
第１の例では、トレースコマンドで、スタック、タイムスタンプ、引数「０」に設定されたアドレス、引数「１」に設定されたアドレスを出力するように指定されたものとする。この場合の非リアルタイム解析情報の解析時間、トレース管理部への情報引渡時間、およびデバッグスレッドへの情報引渡時間は、以下のようにして算出される。
【０１６９】
非リアルタイム解析情報の解析時間（変数「ａ」）＝０μｓである。
これは、トレースコマンドで指定された解析情報が、全てリアルタイム解析が必要な情報だからである。
【０１７０】
トレース管理部への情報引渡時間（変数「ｂ」）＝１０μｓ（スタックを渡すのにかかる時間）＋１μｓ（タイムスタンプを渡すのにかかる時間）＋１μｓ×２(引数を渡すのにかかる時間×２個)＝１３μｓである。
【０１７１】
デバッグスレッドへの情報引渡時間（変数「ｃ」）＝１０μｓ（スタックを渡すのにかかる時間）＋１μｓ（タイムスタンプを渡すのにかかる時間）＋１μｓ×２（引数を渡すのにかかる時間×２個）＋１０μｓ（デバッグスレッドのwakeup時間）＝２３μｓである。
【０１７２】
この場合、ａ＋ｂ＝０＋１３＝１３μｓ、ｃ＝２３μｓなので、図２３のステップＳ３５の「ａ＋ｂ≦ｃ」の判定は、ＹＥＳとなる。その結果、第１の手法と判定される。
＜第２のトレース手法判定例＞
第２の例では、引数「１」の引数に、メッセージブロック構造体の先頭アドレスが設定されている場合を想定する。このときトレースコマンドで、スタック、タイムスタンプ、引数「０」に設定されたアドレス、引数「１」に設定されたアドレス、引数「１」が示すパケットのEthertypeが0x800のものだけについて、そのパケットの全体を出力するように指定されたものとする。この場合の非リアルタイム解析情報の解析時間、トレース管理部への情報引渡時間、およびデバッグスレッドへの情報引渡時間は、以下のようにして算出される。
【０１７３】
非リアルタイム解析情報の解析時間（変数「ａ」）＝２μｓ（Ethertype=0x800であることの解析にかかる時間）
トレース管理部への情報引渡時間（変数「ｂ」）＝１０μｓ（スタックを渡すのにかかる時間）＋１μｓ（タイムスタンプを渡すのにかかる時間）＋１μｓ×２（引数を渡すのにかかる時間×２個）＋１００μｓ（パケット全体を渡すのにかかる時間）＝１１３μｓ
デバッグスレッドへの情報引渡時間（変数「ｃ」）＝１０μｓ（スタックを渡すのにかかる時間）＋１μｓ（タイムスタンプを渡すのにかかる時間）＋１μｓ×２（引数を渡すのにかかる時間×２個）＋２μｓ（パケット全体を渡すのにかかる時間）＋１０μｓ（デバッグスレッドのwakeup時間）＝２５μｓ
この場合、ａ＋ｂ＝２＋１１３＝１１５μｓ、ｃ＝２５μｓなので、図２３のステップＳ３５の「ａ＋ｂ≦ｃ」の判定は、ＮＯとなる。その結果、第２の手法と判定される。
【０１７４】
以上のようにして、第１の手法と第２の手法とのうち、デバッグ処理を行うプロセスから呼び出し元のプロセスへの応答時間が短くなる方の手法によって、トレース処理を含むデバッグ処理が実行される。以下、デバッグ処理の手順について詳細に説明する。
【０１７５】
まず第１の手法でトレース処理を実行する第１のデバッグ処理について説明する。
図２８は、第１のデバッグ処理の手順の一例を示すフローチャートである。以下、図２８に示す処理をステップ番号に沿って説明する。以下の処理は、第１のデバッグ関数３３に記述された命令に基づいて、コンピュータ１００が実行する。
【０１７６】
［ステップＳ７１］ＯＳ１２０は、呼び出し元関数３１から第１のデバッグ関数３３呼び出しがあるか否かを判断する。第１のデバッグ関数の呼び出しがある場合、ＯＳ１２０は第１のデバッグ関数３３を起動し、処理をステップＳ７２に進める。第１のデバッグ関数の呼び出しがなければ、ＯＳ１２０は、ステップＳ７１の処理を繰り返す。
【０１７７】
［ステップＳ７２］ＯＳ１２０は、save命令を実行し、レジスタ内の情報をメモリに退避する。
［ステップＳ７３］コンピュータ１００３３は、デバッグ結果構造体を生成する。ＯＳ１２０は、生成したデバッグ結果構造体をＲＡＭ１０２などのメモリに格納する。
【０１７８】
［ステップＳ７４］ＯＳ１２０は、リアルタイム解析情報を解析する。例えばＯＳ１２０は、共通域４０に格納されたデバッグ要求構造体７０に基づいて、出力対象の情報を判断する。次にＯＳ１２０は、出力対象の情報のうち、リアルタイムの解析が必要な情報について解析する。なおデバッグ結果構造体に設定する情報のうち、どの情報がリアルタイムに解析する情報なのかは、例えば第１のデバッグ関数３３内に定義しておくことができる。
【０１７９】
［ステップＳ７５］ＯＳ１２０は、リアルタイム解析情報の解析結果を、デバッグ結果構造体に格納する。
［ステップＳ７６］ＯＳ１２０は、デバッグ対象関数３２の関数呼び出しに関連する情報が限定条件に合致するか否かを判断する。なおＯＳ１２０は、共通域４０に格納されたデバッグ要求構造体７０に基づいて、限定条件を認識する。第１のデバッグ関数３３は、限定条件に合致する場合、処理をステップＳ７７に進める。またＯＳ１２０は、限定条件に合致しない場合、処理をステップＳ８０に進める。
【０１８０】
［ステップＳ７７］ＯＳ１２０は、出力対象の情報のうちの非リアルタイム解析情報を解析する。
［ステップＳ７８］ＯＳ１２０は、非リアルタイム解析情報の解析結果を、デバッグ結果構造体に格納する。
【０１８１】
［ステップＳ７９］ＯＳ１２０は、デバッグ結果構造体の情報を、トレース管理部１３０に引き渡す。例えばＯＳ１２０は、デバッグ結果構造体の先頭のアドレスが設定された情報連鎖構造体を生成し、共通域４０の生成した情報連鎖構造体の先頭のアドレスを設定する。するとトレース管理部１３０のトレース情報出力部１３６は、共通域４０を参照して情報連鎖構造体の先頭アドレスを認識し、その情報連鎖構造体を参照してデバッグ結果構造体の先頭アドレスを認識する。そして、トレース情報出力部１３６は、デバッグ結果構造体の内容を取得する。
【０１８２】
［ステップＳ８０］ＯＳ１２０は、レジスタの内容をＲＡＭ１０２からレジスタに戻すrestore命令を実行する。
［ステップＳ８１］ＯＳ１２０は、トレース対象の関数（ｆｕｎｃ＿ａ）の呼び出しを行う。
【０１８３】
［ステップＳ８２］ＯＳ１２０は、デバッグ対象関数３２から戻り値を取得したか否かを判断する。ＯＳ１２０は、戻り値を取得した場合、処理をステップＳ８３に進める。またＯＳ１２０は、戻り値を取得していなければ、ステップＳ８２の処理を繰り返し、デバッグ対象関数３２の処理の実行による戻り値を待つ。
【０１８４】
［ステップＳ８３］ＯＳ１２０は、復帰命令を実行し、呼び出し元関数３１に処理を復帰させる。この際、ＯＳ１２０は、デバッグ対象関数３２から取得した戻り値を、呼び出し元関数３１への戻り値とする。その後、第１のデバッグ関数３３は、処理をステップＳ７１に進める。
【０１８５】
このようにして、第１の手法によるトレース処理を伴うデバッグ処理が実行される。
次に、第２の手法でトレース処理を実行する第２のデバッグ処理について説明する。
図２９は、第２のデバッグ処理の手順の一例を示すフローチャートである。以下、図２９に示す処理をステップ番号に沿って説明する。図２９に示す処理は、第２のデバッグ関数３４に記述された命令に基づいて、コンピュータ１００が実行する。なお、ステップＳ９１〜Ｓ９５、ステップＳ９８〜Ｓ１０１の処理は、それぞれ図２８に示したステップＳ７１〜Ｓ７５，Ｓ８０〜Ｓ８３の処理と同じである。
【０１８６】
［ステップＳ９６］ＯＳ１２０は、デバッグスレッドへの情報引渡準備処理を行う。この処理の詳細は後述する（図３０参照）。
［ステップＳ９７］ＯＳ１２０は、デバッグスレッド３５のウェイクアップ信号を送信する。ウェイクアップ信号に応じて、デバッグスレッド３５がスリープ状態から起動状態に移行する。
【０１８７】
図３０は、デバッグスレッドへの情報引渡準備処理の手順の一例を示すフローチャートである。以下、図３０に示す処理をステップ番号に沿って説明する。
［ステップＳ１１１］ＯＳ１２０は、非リアルタイム解析情報が参照カウンタを有する領域に格納されているか否かを判断する。例えば変数に設定されたアドレスで示された領域内の情報が出力情報の対象として指定されており、その情報が図６に示したようなメッセージブロック構造体の場合、参照カウンタを有する領域に格納されていると判断される。ＯＳ１２０は、参照カウンタを有する領域に格納されている場合、処理をステップＳ１１２に進める。またＯＳ１２０は、参照カウンタを有する領域に格納されていない場合、処理をステップＳ１１３に進める。
【０１８８】
［ステップＳ１１２］ＯＳ１２０は、出力対象として指定されている情報が格納されている領域の参照カウンタに１を加算する。その後、ＯＳ１２０は、処理をステップＳ１１４に進める。
【０１８９】
［ステップＳ１１３］ＯＳ１２０は、出力対象の非リアルタイム解析情報を含む情報を、ＲＡＭ１０２内の新たな記憶領域にコピーする。
［ステップＳ１１４］ＯＳ１２０は、情報連鎖構造体を生成する。
【０１９０】
［ステップＳ１１５］ＯＳ１２０は、情報連鎖構造体に、デバッグ結果構造体のアドレス、非リアルタイム解析情報を含む領域の種別、非リアルタイム解析情報を含む領域の先頭のアドレスを設定する。非リアルタイム解析情報を含む領域の種別は、例えば、メッセージブロック構造体であれば「１」、プレーンデータであれば「２」が設定される。
【０１９１】
［ステップＳ１１６］ＯＳ１２０は、共通域４０に設定されている情報連鎖構造体アドレスから始まる情報連鎖構造体の連鎖の先端に、ステップＳ１１４で生成した情報連鎖構造体を連鎖させる。例えばＯＳ１２０は、最後に連鎖された情報連鎖構造体の「次の情報連鎖構造体のアドレス」のフィールドに、ステップＳ１１４で生成した情報連鎖構造体の記憶領域の先頭のアドレスを設定する。またＯＳ１２０は、ステップＳ１１４で生成した情報連鎖構造体の「次の情報連鎖構造体のアドレス」のフィールドには「０」を設定する。
【０１９２】
このようにしてデバッグスレッド３５へ情報を引き渡す準備が完了する。この状況でデバッグスレッド３５がwakeupされると、デバッグスレッド３５は共通域４０から情報連鎖構造体のアドレスを順にたどることで、デバッグスレッド３５はすべての情報連鎖構造体の情報を取得可能となる。またデバッグスレッド３５は、各情報連鎖構造体に設定されているデバッグ結果構造体のアドレスを参照することで、リアルタイム解析情報を取得できる。またデバッグスレッド３５は、共通域４０に設定されたデバッグ要求構造体７０を参照することで、非リアルタイムで解析する情報を認識できる。
【０１９３】
次に、情報の引き渡しを受けたデバッグスレッド３５の処理について説明する。なお、デバッグスレッド３５はＯＳ１２０の機能の一部であるが、第２のデバッグ処理など処理と並行して処理を実行することができる。
【０１９４】
図３１は、デバッグスレッドの処理の手順の一例を示す図である。以下、図３１の処理をステップ番号に沿って説明する。
［ステップＳ１２１］デバッグスレッド３５は、生成された直後、および共通域４０の情報連鎖構造体のアドレスが「０」となったとき、スリープ状態に移行する。
【０１９５】
［ステップＳ１２２］デバッグスレッド３５は、第２のデバッグ関数３４の処理によってウェイクアップ信号が入力されたか否かを判断する。デバッグスレッド３５は、ウェイクアップ信号が入力された場合、処理をステップＳ１２３に進める。またデバッグスレッド３５は、ウェイクアップ信号が入力されていなければ、ステップＳ１２２の処理を繰り返し、ウェイクアップ信号の入力を待つ。
【０１９６】
［ステップＳ１２３］デバッグスレッド３５は、ウェイクアップ信号の入力に応じて、ウェイクアップする（動作状態に移行する）。
［ステップＳ１２４］デバッグスレッド３５は、共通域４０の情報連鎖構造体のアドレスが「０」か否かを判断する。デバッグスレッド３５は、アドレスが「０」の場合、デバッグスレッド３５は、解析する情報連鎖構造体が無いと判断し、処理をステップＳ１２１に進める。またアドレスが「０」以外の場合、デバッグスレッド３５は処理をステップＳ１２５に進める。
【０１９７】
［ステップＳ１２５］デバッグスレッド３５は、共通域４０の情報連鎖構造体のアドレスのフィールド４１に設定されたアドレスで示される領域に格納された情報連鎖構造体を、解析対象と判断する。次にデバッグスレッド３５は、解析対象の情報連鎖構造体に設定された非リアルタイム解析情報のアドレスを参照する。そしてデバッグスレッド３５は、参照したアドレスが示す領域に格納されている非リアルタイム解析情報が、デバッグ要求構造体に示される限定条件に合致するか否かを判断する。デバッグスレッド３５は、限定条件に合致する場合、処理をステップＳ１２６に進める。またデバッグスレッド３５は、限定条件に合致しない場合、処理をステップＳ１２４に進める。
【０１９８】
［ステップＳ１２６］デバッグスレッド３５は、非リアルタイム解析情報を解析する。例えばデバッグスレッド３５は、解析対象の情報連鎖構造体に設定された非リアルタイム解析情報のアドレスを参照する。そしてデバッグスレッド３５は、参照したアドレスが示す領域に格納されている非リアルタイム解析情報から、デバッグ要求構造体において指定されている取り出し部分を抽出し、解析結果とする。
【０１９９】
［ステップＳ１２７］デバッグスレッド３５は、解析対象の情報連鎖構造体に設定されたデバッグ結果構造体のアドレスで示されるデバッグ結果構造体に、解析結果を格納する。
【０２００】
［ステップＳ１２８］デバッグスレッド３５は、解析結果をトレース管理部１３０に通知する。例えばデバッグスレッド３５は、解析対象の情報連鎖構造体に設定されたデバッグ結果構造体のアドレスで示される領域のデバッグ結果構造体のコピーを、トレース管理部１３０に通知する。
【０２０１】
［ステップＳ１２９］デバッグスレッド３５は、解析処理が終了した情報連鎖構造体を連鎖から外す。例えばデバッグスレッド３５は、解析対象の情報連鎖構造体の「次の情報連鎖構造体のアドレス」のフィールドに設定されていたアドレスを、共通域４０の情報連鎖構造体のアドレスのフィールド４１に設定する。
【０２０２】
［ステップＳ１３０］デバッグスレッド３５は、メモリ解放処理を行う。例えばデバッグスレッド３５は、情報連鎖構造体、デバッグ結果構造体、非リアルタイム解析情報のメモリ解放処理を行う。なおデバッグスレッド３５は、解放した領域が参照カウンタを持つ領域であった場合、参照カウンタから１を引き、参照カウンタが０になった場合のみ、メモリ解放処理を行う。その後、デバッグスレッド３５は、処理をステップＳ１２４に進める。
【０２０３】
以上のようにして、詳細な解析処理や大量のコピー処理を行っても、呼び出し元の処理を遅延させずにすむ。すなわち、詳細な解析が発生するのは、非リアルタイム解析情報の解析を行うときであると考えられる。また、大量のコピーが発生するのは、トレース管理部１３０へ結果を通知するときであると考えられる。このことから、詳細な解析処理が発生した場合や大量のコピーが発生する場合は、非リアルタイム解析情報の解析処理は別スレッドで行うことで、呼び出し元の処理への応答の遅延を抑止できる。その結果、トレース処理の実施による呼び出し元の処理の遅延が抑止される。
【０２０４】
なお、呼び出し元関数は１つに限定されず、複数のプログラムにすることもできる。例えば、トレース対象となるデバッグ対象関数３２の呼び出し命令を含むすべてのプログラムを、呼び出し元関数とすることもできる。
【０２０５】
また、第２の実施の形態では、呼び出し元関数３１におけるデバッグ対象関数３２の呼び出し命令をデバッグプログラムの呼び出し命令に書き換えることで、デバッグ対象関数３２の呼び出し時のトレース処理の実施を可能としている。これにより、デバッグ対象関数のsave命令が存在していなくても、トレース処理の実施が可能となる。すなわち、デバッグ対象関数の先頭にsave命令があれば、save命令をデバッグ関数の呼び出し命令に書き換えることでトレース処理を実施することも可能である。しかし、このような手法を用いた場合、save命令を有していないデバッグ対象関数３２の呼び出しに関するトレース処理が実施できない。第２の実施の形態に示すように関数呼び出し命令をデバッグプログラムの呼び出し命令に変更することで、save命令を有していないデバッグ対象関数３２の呼び出しに関してもトレース処理が可能となり、トレース処理の汎用性が向上する。
【０２０６】
また第２の実施の形態では、カーネル空間からユーザ空間に通知する情報を、限定条件や出力情報によって制限することができ、処理の効率化が可能である。すなわち、ユーザ空間内のアプリケーションプログラムによって、トレースした情報の一部をユーザ向けに出力することが可能である。しかし、この場合、カーネル空間で動作する機能からユーザ空間で動作する機能へ、トレースした情報のすべてを転送した後、ユーザアプリケーションで情報の要否を判断し、不要な場合破棄することとなる。すると、本来不要な情報の解析や解析結果の転送が発生し、処理効率が悪くなる。一方、第２の実施の形態では、限定条件に合致しない情報については、解析結果のトレース管理部１３０への転送が抑止されている。これによりデバッグ処理の効率化が図られると共に、カーネル空間からユーザ空間へ転送されるデータ量が削減される。
【０２０７】
また第２の実施の形態では、指定された出力情報のみをカーネル空間内で動作するデバッグ処理部またはデバッグスレッドで抽出し、トレース管理部１３０に通知するようにしている。これにより、解析する情報の低減が可能となり、デバッグ処理の効率化が図られると共に、カーネル空間からユーザ空間へ転送されるデータ量が削減される。
【０２０８】
さらに、第２の実施の形態では、限定条件の指定を、カーネル空間内のデータの表現に依存せずに行うことができる。すなわち、第２の実施の形態では、トレース管理部１３０とカーネル空間内の機能との間でデータ受け渡しのインタフェース（データ構造）が、デバッグ要求構造体７０として規定されている。トレース管理部１３０は、指定された情報を、規定されたインタフェース（データ構造）に従った形式にして、カーネル空間内に共通域４０を獲得し、その領域にデバッグ要求構造体をコピーする。これにより、カーネル空間内でのデータ表現に関しては、カーネル空間内で判断すればよいことになり、トレース管理部１３０から容易に出力情報や限定条件を指定することができる。
【０２０９】
〔その他の実施の形態〕
なお、上記の各実施の形態に示した処理機能は、コンピュータによって実現することができる。その場合、コンピュータが有する機能の処理内容を記述したプログラムが提供される。そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置（ＨＤＤ）、フレキシブルディスク（ＦＤ）、磁気テープなどがある。光ディスクには、ＤＶＤ、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ／ＲＷなどがある。光磁気記録媒体には、ＭＯ（Magneto-Optical disc）などがある。
【０２１０】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【０２１１】
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、サーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
【０２１２】
また、上記の処理機能の少なくとも一部を、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現することもできる。
【０２１３】
上記については単に本発明の原理を示すものである。さらに、多数の変形、変更が当業者にとって可能であり、本発明は上記に示し、説明した正確な構成および応用例に限定されるものではなく、対応するすべての変形例および均等物は、添付の請求項およびその均等物による本発明の範囲とみなされる。
【符号の説明】
【０２１４】
１  記憶手段
１ａ  第１のプログラム
１ｂ  第２のプログラム
２  判定手段
３  解析管理手段
４  第１の処理手段
５  第２の処理手段
【図１】
2012131933.tif 000003
【図２】
2012131933.tif 000004
【図３】
2012131933.tif 000005
【図４】
2012131933.tif 000006
【図５】
2012131933.tif 000007
【図６】
2012131933.tif 000008
【図７】
2012131933.tif 000009
【図８】
2012131933.tif 000010
【図９】
2012131933.tif 000011
【図１０】
2012131933.tif 000012
【図１１】
2012131933.tif 000013
【図１２】
2012131933.tif 000014
【図１３】
2012131933.tif 000015
【図１４】
2012131933.tif 000016
【図１５】
2012131933.tif 000017
【図１６】
2012131933.tif 000018
【図１７】
2012131933.tif 000019
【図１８】
2012131933.tif 000020
【図１９】
2012131933.tif 000021
【図２０】
2012131933.tif 000022
【図２１】
2012131933.tif 000023
【図２２】
2012131933.tif 000024
【図２３】
2012131933.tif 000025
【図２４】
2012131933.tif 000026
【図２５】
2012131933.tif 000027
【図２６】
2012131933.tif 000028
【図２７】
2012131933.tif 000029
【図２８】
2012131933.tif 000030
【図２９】
2012131933.tif 000031
【図３０】
2012131933.tif 000032
【図３１】
2012131933.tif 000033
【手続補正書】
【提出日】平成25年10月15日(2013.10.15)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの呼び出しに関する情報を解析する情報処理装置、プログラム、および解析方法に関する。
【背景技術】
【０００２】
プログラムのデバッグに有用な技術の１つとして、関数が呼ばれたときのタイムスタンプなどのデータを出力する技術がある。関数とは、他のプログラムから所定の関数名によって呼び出されることで実行されるプログラムである。例えば、関数が呼び出されたときのタイムスタンプを取得することで、プログラムの実行時に関数や変数がどのような頻度でアクセスされるかなど、プログラム実行時の特性に関する情報を得ることができる。プログラム実行時の特性に関する情報は、例えばメモリ配置の最適化やダウンロードの最適化などに利用できる。このように、関数が呼ばれるたびに所定の情報を解析して出力することを、その関数をトレースすると言い、この機能を「関数呼び出しのトレース機能」と呼ぶ。
【０００３】
例えば、プログラムの実行時のデータ参照をトレース関数呼び出しという形で得ることを可能とする技術がある。この技術では、プログラム中のデータ参照命令をトレース関数呼び出し命令に置き換える。そしてプログラムの実行がデータ参照命令に初めて到達すると、データ参照命令の代わりにトレース関数呼び出し命令を実行する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００３−１４０９２１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかし、従来の技術では、関数の呼び出しに伴うトレースのための情報解析を行っている間、関数の呼び出し元の処理が応答待ちの状態となっているため、トレースのための情報解析が、呼び出し元の処理の遅延要因となっていた。例えば、関数の呼び出しに伴うトレースにおいて、詳細な解析処理や大量のコピー処理が必要になった場合、トレースのための情報解析に時間がかかり、関数の呼び出し元の処理が大幅に遅延してしまう。
【０００６】
なお処理の呼び出しに応じたトレースのための情報解析は、関数と呼ばれるプログラムの呼び出しの場合に限定されず、各種プログラムの呼び出し時に実行できる。関数以外のプログラムの呼び出し時にトレースのための情報解析を行う場合にも、関数の呼び出し時と同様に、プログラムの呼び出し元の処理が遅延するという問題がある。
【０００７】
１つの側面では、本発明は、プログラムの呼び出し時に情報解析を行うことによる、プログラムの呼び出し元の処理の遅延を抑止した情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上記課題を解決するために、第１のプログラムの呼び出しに関する情報の解析要求に基づき、該解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する第１の手法と、該解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、非リアルタイムに解析する情報以外の情報の解析をリアルタイムに実行する第２の手法とのうち、第１のプログラムの呼び出しが行われたときの呼び出し元への応答時間が短い方の手法を判定する判定手段と、第１の手法の方が応答時間が短い場合、第１のプログラムの呼び出し命令が記述された第２のプログラムの実行過程における該呼び出し命令の実行時に、解析要求で指定された情報のすべての情報の解析、第１のプログラムの処理の実行、および呼び出しに対する応答を、第１の処理手段にリアルタイムに実行させ、第２の手法の方が応答時間が短い場合、第２のプログラムの実行過程における呼び出し命令の実行時に、解析要求で指定された情報のうちの非リアルタイムに解析する情報以外の情報の解析、非リアルタイムに解析する情報の第２の処理手段への解析依頼、第１のプログラムの処理の実行、および呼び出しに対する応答を、第１の処理手段にリアルタイムに実行させ、非リアルタイムに解析する情報の解析を、第２の処理手段に非リアルタイムに実行させる解析管理手段と、を有することを特徴とする情報処理装置が提供される。
【発明の効果】
【０００９】
プログラムの呼び出し時にトレースを実行することによる、プログラムの呼び出し元の処理の遅延を抑止することができる。
本発明の上記および他の目的、特徴および利点は本発明の例として好ましい実施の形態を表す添付の図面と関連した以下の説明により明らかになるであろう。
【図面の簡単な説明】
【００１０】
【図１】第１の実施の形態に係る装置の機能構成の一例を示す図である。
【図２】第１の実施の形態の処理手順の一例を示すフローチャートである。
【図３】第１の実施の形態による解析処理の一例を示す図である。
【図４】第２の実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。
【図５】第２の実施の形態のコンピュータの機能を示すブロック図である。
【図６】パケット情報のデータ構造の一例を示す図である。
【図７】トレース情報を取得しない場合の処理状況を示す第１の図である。
【図８】トレース情報を取得しない場合の処理状況を示す第２の図である。
【図９】第１の手法によりトレース情報を取得する場合の処理状況を示す第１の図である。
【図１０】第１の手法によりトレース情報を取得する場合の処理状況を示す第２の図である。
【図１１】第２の手法によりトレース情報を取得する場合の処理状況を示す第１の図である。
【図１２】第２の手法によりトレース情報を取得する場合の処理状況を示す第２の図である。
【図１３】トレース管理処理の手順を示すフローチャートである。
【図１４】トレースコマンドと出力情報指定ファイルとのデータ形式の一例を示す図である。
【図１５】トレースコマンドと出力情報指定ファイルとに応じた出力結果の第１の例を示す図である。
【図１６】トレースコマンドと出力情報指定ファイルとに応じた出力結果の第２の例を示す図である。
【図１７】共通域のデータ構造の一例を示す図である。
【図１８】デバッグ要求構造体のデータ構造の一例を示す図である。
【図１９】デバッグ結果構造体のデータ構造の一例を示す図である。
【図２０】情報連鎖構造体のデータ構造の一例を示す図である。
【図２１】情報連鎖構造体による連鎖関係の一例を示す図である。
【図２２】処理時間情報記憶部のデータ構造の一例を示す図である。
【図２３】トレース準備処理の手順を示すフローチャートである。
【図２４】非リアルタイム解析情報の解析時間の算出処理の手順の一例を示すフローチャートである。
【図２５】トレース管理部への情報引渡時間の算出処理の手順の一例を示すフローチャートである。
【図２６】デバッグスレッドへの情報引渡時間の算出処理の手順の一例を示すフローチャートである。
【図２７】時間見積もりテーブルに設定された情報の一例を示す図である。
【図２８】第１のデバッグ処理の手順の一例を示すフローチャートである。
【図２９】第２のデバッグ処理の手順の一例を示すフローチャートである。
【図３０】デバッグスレッドへの情報引渡準備処理の手順の一例を示すフローチャートである。
【図３１】デバッグスレッドの処理の手順の一例を示す図である。
【発明を実施するための形態】
【００１１】
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第１の実施の形態〕
図１は、第１の実施の形態に係る装置の機能構成の一例を示す図である。情報処理装置Ａは、記憶手段１、判定手段２、解析管理手段３、第１の処理手段４、および第２の処理手段５を有する。
【００１２】
記憶手段１は、解析対象となる第１のプログラム１ａと、第１のプログラム１ａの呼び出し命令が記述された第２のプログラム１ｂとを記憶する。
判定手段２には、第１のプログラム１ａの呼び出しに関する情報の解析手法として、第１の手法と第２の手法とが定義されている。第１の手法は、解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する手法である。第２の手法は、解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、非リアルタイムに解析する情報以外の情報の解析をリアルタイムに実行する手法である。判定手段２は、第１のプログラム１ａの呼び出しに関する情報の解析要求に基づき、第１の手法と第２の手法とのうち、第１のプログラム１ａの呼び出しが行われたときの呼び出し元への応答時間が短い方の手法を判定する。
【００１３】
なお第１のプログラム１ａの呼び出しに関する情報には、例えば、呼び出し命令に付加された引数の情報や、引数に設定されたアドレスで指定された記憶領域に格納されている情報が含まれる。
【００１４】
解析管理手段３は、第１の処理手段４と第２の処理手段５とを制御し、応答時間が短い方の手法による解析を管理する。第１の処理手段４は処理をリアルタイムに実行し、第２の処理手段５は処理を非リアルタイムに実行する。
【００１５】
解析管理手段３は、第１の手法の方が応答時間が短い場合、第１のプログラム１ａの呼び出し命令が記述された第２のプログラム１ｂの実行過程における該呼び出し命令の実行時に、第１の処理手段４に処理を実行させる。例えば解析管理手段３は、解析要求で指定された情報のすべての情報の解析、第１のプログラム１ａの処理の実行、および呼び出しに対する応答を、第１の処理手段４にリアルタイムに実行させる。
【００１６】
また解析管理手段３は、第２の手法の方が応答時間が短い場合、第２のプログラム１ｂの実行過程における呼び出し命令の実行時に、第１の処理手段４と第２の処理手段５とに処理を実行させる。例えば解析管理手段３は、次の処理を第１の処理手段４にリアルタイムに実行させる。第１の処理手段４に実行させる処理は、解析要求で指定された情報のうちの非リアルタイムに解析する情報以外の情報の解析、非リアルタイムに解析する情報の第２の処理手段５への解析依頼、第１のプログラム１ａの処理の実行、および呼び出しに対する応答である。また解析管理手段３は、非リアルタイムに解析する情報の解析を、第２の処理手段５に非リアルタイムに実行させる。
【００１７】
なお図１に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
また第１の処理手段４と第２の処理手段５とは、例えば解析要求に応じて解析管理手段３が生成したプログラムを実行することによって実現できる。この場合、解析管理手段３は、例えば第２のプログラム１ｂにおける第１のプログラム１ａの呼び出し命令の記述を、第１の処理手段４に対応するプログラムの呼び出し命令に書き換える。さらに解析管理手段３は、第１の処理手段４に対応するプログラム内に、第１のプログラム１ａの呼び出し命令を記述することによって、間接的に第１のプログラム１ａが呼び出されるようにする。
【００１８】
次に、図１に示した構成の情報処理装置Ａによる処理手順について説明する。
図２は、第１の実施の形態の処理手順の一例を示すフローチャートである。以下、図２に示す処理をステップ番号に沿って説明する。
【００１９】
［ステップＳ１］判定手段２は、第１のプログラム１ａの呼び出しに関する情報の解析要求を取得すると、解析要求で指定された情報の一部を非リアルタイムで解析させることにより第１の処理手段４で行わずにすむ処理の処理時間（短縮時間）を計算する。短縮時間は、例えば非リアルタイムで解析する情報の解析に要する時間と、解析結果を出力する時間とを加算した時間である。
【００２０】
［ステップＳ２］判定手段２は、第１のプログラム１ａの呼び出しに関する情報の解析要求を取得すると、解析要求で指定された情報の一部を非リアルタイムで解析させることにより第１の処理手段４で新たに発生する処理の処理時間（増加時間）を計算する。増加時間は、例えば、第１の処理手段４から第２の処理手段５への非リアルタイムに解析する情報の解析の依頼に要する時間である。
【００２１】
［ステップＳ３］判定手段２は、短縮時間と増加時間とを比較し、第１の手法と第２の手法とのうち、呼び出し元への応答時間が短い手法を判定する。例えば判定手段２は、第１の処理手段４の処理の短縮時間の方が短ければ、第１の手法の方が応答時間が短いと判断する。また判定手段２は、第１の処理手段４の処理の短縮時間の方が長ければ、第２の手法の方が応答時間が短いと判断する。応答時間が短くなる手法が第１の手法であれば、判定手段２は、処理をステップＳ４に進める。また応答時間が短くなる手法が第２の手法であれば、判定手段２は、処理をステップＳ５に進める。
【００２２】
［ステップＳ４］解析管理手段３は、応答時間が短くなると判定された第１の手法により処理を実行する第１の処理手段４の処理内容を記述したプログラムを生成する。例えば、解析管理手段３は、予め用意された第１の手法用の雛形のプログラムに、第１のプログラム１ａの呼び出し命令を追加することで、第１の処理手段４の処理内容を記述したプログラムを生成する。解析管理手段３は、その後、処理をステップＳ６に進める。
【００２３】
［ステップＳ５］解析管理手段３は、応答時間が短くなると判定された第２の手法により処理を実行する第１の処理手段４の処理内容を記述したプログラムを生成する。例えば、解析管理手段３は、予め用意された第２の手法用の雛形のプログラムに、第１のプログラム１ａの呼び出し命令を追加することで、第１の処理手段４の処理内容を記述したプログラムを生成する。解析管理手段３は、その後、処理をステップＳ６に進める。
【００２４】
［ステップＳ６］解析管理手段３は、第２のプログラム１ｂを編集し、第２のプログラム１ｂの実行過程における第１のプログラム１ａの呼び出し命令の実行時に、第１の処理手段４に対応するプログラムが呼び出されるようにする。例えば解析管理手段３は、第２のプログラム１ｂにおける第１のプログラム１ａの呼び出し命令を、第１の処理手段４に対応するプログラムの呼び出し命令に書き換える。第２のプログラム１ｂが既に主記憶装置に読み込まれている場合、命令の書き換えは、例えば主記憶装置に格納された第２のプログラム１ｂに対して行われる。また第２のプログラム１ｂが主記憶装置に読み込まれていなければ、命令の書き換えは、例えば二次記憶装置に格納された第２のプログラム１ｂに対して行われる。
【００２５】
ＯＳ（Operating System）により第２のプログラム１ｂが実行され、第１のプログラム１ａの実行タイミングになると、第１の処理手段４に対応するプログラムの呼び出し命令が実行される。するとＯＳにより第１の処理手段４が実行される。第１の手法で解析を行う場合、第１の処理手段４が、解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する。第２の手法で解析を行う場合、第１の処理手段４が、非リアルタイムで解析する情報以外情報の解析をリアルタイムに実行し、第２の処理手段５が、非リアルタイムで解析する情報の解析を非リアルタイムに実行する。
【００２６】
［ステップＳ７］解析管理手段３は、第１の処理手段４または第２の処理手段５から解析結果を取得する。
［ステップＳ８］解析管理手段３は、解析結果を出力する。
【００２７】
このようにして、応答時間が短くなる手法により、第１のプログラム１ａの呼び出しに関する情報の解析が行われる。
図３は、第１の実施の形態による解析処理の一例を示す図である。図３には、判定手段２による判定結果に応じて、解析管理手段３の管理下で行われる解析処理を模式的に示している。
【００２８】
第１の手法の方が応答時間が短くなると判断された場合、第２のプログラム１ｂを実行する第３の処理手段６が生成され、第２のプログラム１ｂが実行される。第３の処理手段６は、第１の処理手段４に対応するプログラムの呼び出し命令「call func＿dbg1」の実行タイミングになると、そのプログラムの呼び出しを行い、応答待ちの状態となる。するとＯＳにより第１の処理手段４が起動され、解析要求で指定されたすべての情報の解析、解析結果の出力が行われる。その後、第１の処理手段４から、第１のプログラム１ａの呼び出し命令「call func＿a」が実行される。するとＯＳにより、第１のプログラム１ａを実行する第４の処理手段７が起動され、第１のプログラム１ａが実行される。第４の処理手段７は、処理が完了すると、処理結果を第１の処理手段４に応答する。第１の処理手段４は、第４の処理手段７の処理結果を第３の処理手段６に応答する。すると、第３の処理手段６により、第１の処理手段４に対応するプログラムの呼び出し命令「call func＿dbg1」の次の処理から開始される。
【００２９】
第２の手法の方が応答時間が短くなると判断された場合、第２のプログラム１ｂを実行する第３の処理手段６が生成され、第２のプログラム１ｂが実行される。第３の処理手段６は、第１の処理手段４に対応するプログラムの呼び出し命令「call func＿dbg2」の実行タイミングになると、そのプログラムの呼び出しを行い、応答待ちの状態となる。するとＯＳにより第１の処理手段４が起動され、解析要求で指定されたすべての情報のうちのリアルタイムに解析する情報の解析、第２の処理手段５への非リアルタイムに解析する情報の解析依頼が行われる。その後、第１の処理手段４から、第１のプログラム１ａの呼び出し命令「call func＿a」が実行される。するとＯＳにより、第１のプログラム１ａを実行する第４の処理手段７が起動され、第１のプログラム１ａが実行される。第４の処理手段７は、処理が完了すると、処理結果を第１の処理手段４に応答する。第１の処理手段４は、第４の処理手段７の処理結果を第３の処理手段６に応答する。すると、第３の処理手段６により、第１の処理手段４に対応するプログラムの呼び出し命令「call func＿dbg2」以降の処理が開始される。
【００３０】
一方、第２の処理手段５では、非リアルタイムに解析する情報の解析を行う。そして、第２の処理手段５は、解析要求で指定されたすべての情報の解析結果をまとめて出力する。
【００３１】
このように、応答時間が短くなる手法を選択して、プログラムの呼び出しに関する情報の解析を行うようにしたため、第３の処理手段６が応答待ちをする時間が抑止される。その結果、第３の処理手段６による処理に大きな影響を与えずに、解析が可能となる。
【００３２】
例えば、システムの運用中に、プログラムの呼び出しに関する情報を解析する場合もある。このような場合、第１の実施の形態によって解析を行えば、運用中のシステムの処理性能の低下を最小限に抑えることができる。
【００３３】
また第３の処理手段６の応答待ちの時間が長期化すると、正しい解析を行うことができない場合がある。例えば呼び出し元である第２のプログラム１ｂにおいて、第１のプログラム１ａの呼び出し命令実行時の応答時間が所定時間を過ぎると、エラー処理を実行するように記述されている場合がある。このような場合、プログラムの呼び出しに関する情報の解析を実行したことでエラー処理が開始されてしまうと、平常時の動作を正しく解析できなくなってしまう。第１の実施の形態によって解析を行えば、平常時の動作を正しく解析できる可能性が高くなる。
【００３４】
なお、図１または図３に示した判定手段２、解析管理手段３、第１の処理手段４、第２の処理手段５、第３の処理手段６、第４の処理手段７は、情報処理装置Ａが有するＣＰＵ（Central Processing Unit）により実現することができる。また、記憶手段１は、情報処理装置Ａが有するＲＡＭ（Random Access Memory）やハードディスクドライブ（ＨＤＤ:Hard Disk Drive）などにより実現することができる。
【００３５】
〔第２の実施の形態〕
次に第２の実施の形態について説明する。第２の実施の形態は、第１の実施の形態に示した機能に加え、出力する情報の条件を設定し、必要な情報のみを出力することができるようにしたものである。
【００３６】
図４は、第２の実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。コンピュータ１００は、ＣＰＵ１０１によって装置全体が制御されている。ＣＰＵ１０１には、バス１０８を介してＲＡＭ１０２と複数の周辺機器が接続されている。
【００３７】
ＲＡＭ１０２は、コンピュータ１００の主記憶装置として使用される。ＲＡＭ１０２には、ＣＰＵ１０１に実行させるＯＳのプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ１０２には、ＣＰＵ１０１による処理に必要な各種データが格納される。
【００３８】
バス１０８に接続されている周辺機器としては、ＨＤＤ１０３、グラフィック処理装置１０４、入力インタフェース１０５、光学ドライブ装置１０６、および通信インタフェース１０７がある。
【００３９】
ＨＤＤ１０３は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、コンピュータ１００の二次記憶装置として使用される。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。なお、二次記憶装置としては、フラッシュメモリなどの半導体記憶装置を使用することもできる。
【００４０】
グラフィック処理装置１０４には、モニタ１１が接続されている。グラフィック処理装置１０４は、ＣＰＵ１０１からの命令に従って、画像をモニタ１１の画面に表示させる。モニタ１１としては、ＣＲＴ（Cathode Ray Tube）を用いた表示装置や液晶表示装置などがある。
【００４１】
入力インタフェース１０５には、キーボード１２とマウス１３とが接続されている。入力インタフェース１０５は、キーボード１２やマウス１３から送られてくる信号をＣＰＵ１０１に送信する。なお、マウス１３は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【００４２】
光学ドライブ装置１０６は、レーザ光などを利用して、光ディスク１４に記録されたデータの読み取りを行う。光ディスク１４は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク１４には、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。
【００４３】
通信インタフェース１０７は、ネットワーク１０に接続されている。通信インタフェース１０７は、ネットワーク１０を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
【００４４】
以上のようなハードウェア構成によって、本実施の形態の処理機能を実現することができる。なお、図１に示した第１の実施の形態の情報処理装置Ａも、図４に示したコンピュータ１００と同様のハードウェアにより実現することができる。
【００４５】
図５は、第２の実施の形態のコンピュータの機能を示すブロック図である。コンピュータ１００は、プログラム記憶部１１０、ＯＳ１２０、およびトレース管理部１３０を有する。
【００４６】
プログラム記憶部１１０は、デバッグ対象となるデバッグ対象関数１１１と、そのプログラムを呼び出す呼び出し元関数１１２とを記憶する。また、トレース管理部１３０内のデバッグ関数生成部１３４によりデバッグプログラムが生成された場合、生成されたデバッグプログラムもプログラム記憶部１１０に格納される。例えばＲＡＭ１０２またはＨＤＤ１０３の記憶領域の一部が、プログラム記憶部１１０として使用される。
【００４７】
ＯＳ１２０は、プログラムの実行要求に応じて、そのプログラムを実行するプロセスを生成し、生成したプロセスによってプログラムを実行する。プロセスは、ＯＳ１２０からＣＰＵ１０１、ＲＡＭ１０２、その他のＩ／Ｏ機器などのハードウェア資源の割り当てを受け、割り当てられたハードウェア資源によりプログラムを実行するものである。
【００４８】
なおＯＳ１２０は、仮想記憶方式により、仮想メモリ空間をカーネル空間とユーザ空間に分離している。カーネル空間は、ＯＳ１２０のカーネルやデバイスドライバの実行のためのメモリ空間であり、ユーザから直接の操作は制限される。ユーザ空間は、アプリケーションプログラムなどの実行のためのメモリ空間である。図５の例では、トレース管理部１３０の各機能は、ユーザ空間を利用して実行される。また呼び出し元関数１１２やデバッグ対象関数１１１は、例えばデバイスドライバ用のプログラムであり、カーネル空間を利用してＯＳ１２０により実行されるものとする。
【００４９】
トレース管理部１３０は、トレースコマンドの実行要求に応じて、デバッグ対象関数１１１実行時の情報をトレースする。トレース管理部１３０は、トレース条件記憶部１３１、処理時間情報記憶部１３２、処理時間解析部１３３、デバッグ関数生成部１３４、呼び出し命令変更部１３５、およびトレース情報出力部１３６を有する。
【００５０】
トレース条件記憶部１３１は、プログラム実行時のデータをトレースする際の条件を記憶する。例えばトレース条件記憶部１３１には、トレース条件が記述された出力情報指定ファイル１３１ａが格納される。なお、トレース条件記憶部１３１としては、例えばＲＡＭ１０２またはＨＤＤ１０３の記憶領域の一部が使用される。
【００５１】
処理時間情報記憶部１３２は、情報のトレースに要する時間の算出の基礎となる情報を記憶する。例えば処理時間情報記憶部１３２は、処理内容ごとの処理時間を記憶する。なお、処理時間情報記憶部１３２としては、例えばＲＡＭ１０２またはＨＤＤ１０３の記憶領域の一部が使用される。
【００５２】
処理時間解析部１３３は、トレースコマンドで指定された出力情報指定ファイル１３１ａの内容に基づいて、２つの手法それぞれにおいて、トレース処理に要する時間を計算する。
【００５３】
第１の手法は、リアルタイムに解析する情報（リアルタイム解析情報）と、リアルタイムに解析を行わない情報（非リアルタイム解析情報）との解析を、共にリアルタイムにデバッグ処理を実行するプロセスで行う手法である。
【００５４】
第２の手法は、リアルタイム解析情報の解析についてはリアルタイムにデバッグ処理を実行するプロセスで行い、非リアルタイム解析情報の解析については、デバッグ処理を実行するプロセスとは別のデバッグスレッドで、並列的に行う手法である。
【００５５】
処理時間解析部１３３は、２つの手法それぞれにおけるデバッグ関数の処理時間を比較し、処理時間が短くなる手法を、適用手法に決定する。処理時間解析部１３３は、決定した適用手法を、デバッグ関数生成部１３４に通知する。
【００５６】
デバッグ関数生成部１３４は、適用手法を実行するデバッグプログラムを生成する。例えばデバッグ関数生成部１３４は、第１の手法と第２の手法とのそれぞれ用に予め用意された雛形のプログラムを用いて、デバッグプログラムを生成することができる。雛形のプログラムを用いる場合、デバッグ関数生成部１３４は、雛形のプログラムに対して、リアルタイムに解析するトレース処理に関する記述の後に、デバッグ対象関数１１１の呼び出し命令を挿入する。そしてデバッグ関数生成部１３４は、生成したデバッグプログラムをプログラム記憶部１１０に格納する。またデバッグ関数生成部１３４は、デバッグ処理におけるデータのトレースに第２の手法を適用する場合、ＯＳ１２０に対してデバッグスレッドの生成を要求する。
【００５７】
呼び出し命令変更部１３５は、呼び出し元関数１１２内のデバッグ対象関数１１１の呼び出し命令を、デバッグ関数生成部１３４が生成したデバッグ関数の呼び出し命令に置き換える。例えば、呼び出し命令変更部１３５は、呼び出し元関数１１２をカーネル空間にロードした後、カーネル空間内で関数の呼び出し命令の置き換えを行うことができる。ここでロードとは、ＨＤＤ１０３などの二次記憶装置に格納されたプログラムを、ＲＡＭ１０２などの主記憶装置にコピーすることである。
【００５８】
トレース情報出力部１３６は、デバッグ関数を実行中のＯＳ１２０、またはＯＳ１２０がカーネル空間内に生成したデバッグスレッドからトレース情報を取得する。そしてトレース情報出力部１３６は、取得したトレース情報を出力する。例えばトレース情報出力部１３６は、所定のファイルに、解析結果であるトレース情報を出力する。
【００５９】
このようなコンピュータ１００において、ユーザがトレースコマンドを入力することで、呼び出し元関数１１２の実行時にデバッグ対象関数１１１の呼び出しが行われると、その呼び出し処理に関するトレース情報を取得することができる。
【００６０】
なお、図５に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
また、図５に示すプログラム記憶部１１０は、図１に示した第１の実施の形態の記憶手段１の一例である。図５に示す処理時間解析部１３３は、図１に示した第１の実施の形態の判定手段２の一例である。図５に示すデバッグ関数生成部１３４、呼び出し命令変更部１３５、およびトレース情報出力部１３６は、図１に示した第１の実施の形態の解析管理手段３の一例である。
【００６１】
次に、リアルタイム解析情報と非タイム解析情報とについて説明する。
リアルタイム解析情報としては、例えばタイムスタンプやスタックがある。
タイムスタンプは、関数呼び出し命令が実行された時刻の情報であり、関数呼び出し命令に実行時にリアルタイムに取得することで、正確な時刻が取得できる。
【００６２】
スタックは、その関数がどの関数から呼び出されていたのかを示す。関数Ａが関数Ｂから呼ばれ、関数Ｂは関数Ｃから呼ばれ、関数Ｃは関数Ｄから呼ばれていた場合、関数Ａのスタックは、関数Ａ←関数Ｂ←関数Ｃ←関数Ｄとなる。
【００６３】
非リアルタイム解析情報としては、例えばネットワークドライバで受け渡しされるパケット情報がある。パケット情報は、例えば関数呼び出し命令の引数に設定されたアドレスで示される記憶領域に格納されている。
【００６４】
図６は、パケット情報のデータ構造の一例を示す図である。ネットワークドライバで受け渡しされるパケット情報は、メッセージブロック構造体２１〜２３が連鎖され、各メッセージブロック構造体２１〜２３がバッファ２４〜２６の先頭アドレス／末尾アドレスを持つデータ構造となっている。メッセージブロック構造体２１〜２３は、各メッセージブロック構造体２１〜２３に設定された、次のメッセージブロック構造体の位置を示すポインタによって、連鎖関係が示される。
【００６５】
ネットワークドライバの送信関数や受信関数で受け渡されるのは、先頭のメッセージブロック構造体２１の先頭アドレスである。なお、メッセージブロック構造体の個数は、何個でもよい（１個でもよいし１０個でもよい）。
【００６６】
パケット情報２７は、複数のモジュールで使用されることが前提となっているため、メッセージブロック構造体２１〜２３の持つ参照カウンタが、現在いくつのモジュールから参照されているのかを示している。先頭のメッセージブロック構造体２１の持つ参照カウンタの値が「０」にならない限り、連鎖関係にあるメッセージブロック構造体２１〜２３およびバッファ２４〜２６のメモリが解放されてしまうことはない。
【００６７】
そのため、ネットワークドライバで受け渡しされるパケット情報２７については、メッセージブロック構造体２１の持つ参照カウンタに１を加えておけば、そのパケット情報２７が格納されたメモリ領域が解放されるのを抑止できる。
【００６８】
パケット情報２７のように、格納されたメモリ領域の解放を容易に抑止できる情報については、リアルタイムに解析しなくてもよい。つまり、リアルタイムに解析しなくても、情報が格納された領域の解放を抑止しておけば、非リアルタイムにその情報を解析することができる。
【００６９】
このように、デバッグ時にトレースする情報には、非リアルタイムに解析可能な情報（非リアルタイム解析情報）が含まれることがある。そこで、非リアルタイム解析情報の解析に要する時間が長い場合、デバッグ処理を実行するプロセスとは別個のデバッグスレッドに非リアルタイム解析情報の解析を実行させることで、デバッグ処理を実行することによる応答遅延を低減できる。ただし、非リアルタイム解析情報の解析をデバッグスレッドに依頼するのにも、ある程度の時間がかかる。そのため、デバッグスレッドへの処理の依頼に要する時間よりも、非リアルタイム解析情報の解析をリアルタイムに実行しないことにより短縮される処理時間の方が短い場合もあり得る。このような場合、デバッグ処理を実行する過程で、非リアルタイム解析情報の解析も含めて、リアルタイムに解析処理を行う方が効率的である。第２の実施の形態では、トレース情報を取得する手法として、第１の手法と第２の手法とのうち、呼び出し元への応答時間が短くなる方の手法により、トレース情報を取得する。
【００７０】
以下、図７〜図１２を参照し、トレース情報を取得しない場合、第１の手法でトレース情報を取得する場合、および第２の手法でトレース情報を取得する場合のそれぞれについて、呼び出し元関数１１２の実行状況の概要を説明する。
【００７１】
図７、図８は、トレース情報を取得しない場合の例を示している。図７、図８の例では、トレースコマンドの実行要求がコンピュータ１００に入力されず、トレース管理部１３０は起動されない。
【００７２】
図７は、トレース情報を取得しない場合の処理状況を示す第１の図である。ＯＳ１２０の起動時に、呼び出し元関数１１２とデバッグ対象関数１１１が、メモリのカーネル空間にロードされる。これにより、カーネル空間内に呼び出し元関数３１とデバッグ対象関数３２とが記憶される。またＯＳ１２０の内部では、呼び出し元関数３１の関数名「ｆｕｎｃ＿ｂ」により呼び出し元関数３１を呼び出すコードが生成される。ＯＳ１２０は、各種処理の実行過程で、呼び出し元関数３１の実行タイミングになると、生成されたコードに基づいて呼び出し元関数３１の実行要求（関数呼び出し）を行う。
【００７３】
なお、ＯＳ１２０の起動後の任意のタイミングで呼び出し元関数１１２とデバッグ対象関数１１１とを、メモリのカーネル空間にロードすることもできる。
カーネル空間にロードされた関数などのプログラムは、ＯＳ１２０の一機能として実行される。そこで、以下の説明では、カーネル空間内でロードしたプログラムは、ＯＳ１２０が実行するものとする。
【００７４】
図８は、トレース情報を取得しない場合の処理状況を示す第２の図である。この状況で、ＯＳ１２０の処理中で呼び出し元関数３１の実行要求（関数呼び出し）が発生したときに、ＯＳ１２０で呼び出し元関数３１が実行される。
【００７５】
呼び出し元関数３１の処理が実行され、デバッグ対象関数３２の関数呼び出し命令（ｃａｌｌ  ｆｕｎｃ＿ａ）の実行タイミングになると、デバッグ対象関数３２が呼び出される。するとデバッグ対象関数３２が実行される。
【００７６】
デバッグ対象関数３２の処理が終了すると、デバッグ対象関数３２の処理結果が、戻り値として呼び出し元関数３１に通知される。そしてデバッグ対象関数３２の処理が終了する。デバッグ対象関数３２から戻り値に基づいて、呼び出し元関数３１における、デバッグ対象関数３２の呼び出し命令の次の命令から処理が続行される。
【００７７】
このように、トレース情報を取得しない場合、呼び出し元関数３１の実行時に、デバッグ対象関数３２の関数呼び出し行われる。一方、トレース情報を取得する場合、呼び出し元関数３１の実行時には、デバッグ関数が呼び出されるように、呼び出し元関数３１の内容が書き換えられる。
【００７８】
図９、図１０は、第１の手法によりトレース情報を取得する場合の例を示している。第１の手法によりトレース情報を取得する場合、ＯＳ１２０起動時の処理は、トレース情報を取得しない場合と同様である。すなわち、図７に示すように、ＯＳ１２０の起動時に、呼び出し元関数１１２とデバッグ対象関数１１１とが、カーネル空間にロードされる。その後、トレースコマンドの実行指示が入力されることで、トレース管理部１３０の処理時間解析部１３３によって、応答時間が短くなるトレース情報の取得手法が判定される。ここで、処理時間解析部１３３により、第１の手法の方が応答時間が短くなると判定されたものとする。
【００７９】
図９は、第１の手法によりトレース情報を取得する場合の処理状況を示す第１の図である。第１の手法でトレース情報を取得する場合、デバッグ関数生成部１３４により、第１の手法でトレース情報を取得するための処理が記述された第１のデバッグ関数３３が生成される。生成された第１のデバッグ関数３３は、カーネル空間にロードされる。
【００８０】
また第１の手法でトレース情報を取得する場合、呼び出し命令変更部１３５により、呼び出し元関数３１内の関数呼び出し命令の内容が書き換えられる。例えば呼び出し命令変更部１３５は、カーネル空間内にロードされた呼び出し元関数３１内のデバッグ対象関数３２の呼び出し命令（ｃａｌｌ  ｆｕｎｃ＿ａ）を、第１のデバッグ関数３３の呼び出し命令（ｃａｌｌ  ｆｕｎｃ＿ｄｂｇ１）に書き換える。
【００８１】
図１０は、第１の手法によりトレース情報を取得する場合の処理状況を示す第２の図である。その後、ＯＳ１２０から呼び出し元関数３１の実行要求が出されると、コンピュータ１００で呼び出し元関数３１の処理が実行される。
【００８２】
呼び出し元関数３１の処理が実行され、呼び出し元関数３１内の第１のデバッグ関数３３の関数呼び出し命令の実行タイミングになると、第１のデバッグ関数３３が呼び出され、コンピュータ１００で実行される。第１のデバッグ関数３３が実行されている間は、呼び出し元関数３１の処理状態は、戻り値の待ち状態となっている。
【００８３】
ＯＳ１２０は、第１のデバッグ関数３３に記述された命令に従って、処理を実行する。例えば最初にsave命令が実行される。save命令は、ＣＰＵ１０１内のレジスタに格納されたデータのＲＡＭ１０２への退避を一括して行う命令である。save命令を、例えば第１のデバッグ関数３３の関数呼び出しが行われたときに先頭で実行することで、呼び出し元関数３１の処理によりレジスタに設定されたデータを、呼び出し先の第１のデバッグ関数３３の処理により書き換えてしまうことを抑止できる。
【００８４】
またＯＳ１２０は、第１のデバッグ関数３３に記述された命令に従い、リアルタイム解析情報の解析を行う。また第１のデバッグ関数３３の処理では、解析対象のデータが、第１のデバッグ関数３３の実行要求時に指定された限定条件に合致する場合には、非リアルタイム解析情報が解析される。解析結果は、トレース管理部１３０内のトレース情報出力部１３６に引き渡される。限定条件とは、デバッグ対象関数３２の関数呼び出しに関連する情報を、トレース処理の対象とするための条件である。関数呼び出しに関連する情報には、例えば関数呼び出し命令の引数や、その引数に設定されたアドレスで示される記憶領域内の情報が含まれる。第１のデバッグ関数３３の処理では、限定条件が満たされていなければ、非リアルタイム解析情報の解析や解析結果の出力は行われない。
【００８５】
また、トレース情報出力部１３６に引き渡される解析結果には、解析対象として指定された情報が含まれる。例えば第１のデバッグ関数３３の処理では、解析結果が、トレース管理部１３０が管理している記憶領域にコピーされる。これにより、解析結果の引き渡しが行われる。
【００８６】
解析結果を取得したトレース管理部１３０のトレース情報出力部１３６は、第１のデバッグ関数３３から通知された解析結果を、例えば解析結果ファイル３９に書き出す。解析結果ファイル３９は、例えばＨＤＤ１０３に格納される。
【００８７】
また第１のデバッグ関数３３の処理では、トレース処理終了後、restore命令が実行される。restore命令は、save命令により退避されたレジスタのデータの復元を一括して行う命令である。その後、第１のデバッグ関数３３の処理では、デバッグ対象関数３２の実行要求（関数呼び出し）が行われる。するとコンピュータ１００により、デバッグ対象関数３２が実行される。デバッグ対象関数３２を実行されている間は、第１のデバッグ関数３３の処理状態は、戻り値の待ち状態となっている。
【００８８】
ＯＳ１２０は、デバッグ対象関数３２の実行が終了すると、デバッグ対象関数３２の処理結果を第１のデバッグ関数３３への戻り値とする。デバッグ対象関数３２から戻り値が得られると、ＯＳ１２０は第１のデバッグ関数３３の処理に復帰し、デバッグ対象関数３２から取得したその戻り値を、呼び出し元関数３１への戻り値とする。そして第１のデバッグ関数３３の処理が終了する。
【００８９】
ＯＳ１２０は、第１のデバッグ関数３３からの戻り値に基づき、呼び出し元関数３１における関数呼び出し命令の次の命令から処理を続行する。
なお図９、図１０に示した呼び出し元関数３１に基づくＯＳ１２０の処理機能は、図３に示した第１の実施の形態の第３の処理手段６の一例である。また図９、図１０に示した第１のデバッグ関数３３に基づくＯＳ１２０の処理機能は、図３に示した第１の実施の形態の第１の手法適用時の第１の処理手段４の一例である。さらに図９、図１０に示したデバッグ対象関数３２に基づくＯＳ１２０の処理機能は、図３に示した第１の実施の形態の第４の処理手段７の一例である。
【００９０】
図１１、図１２は、第２の手法によりトレース情報を取得する場合の処理状況を示す図である。第２の手法でトレース情報を取得する場合、ＯＳ１２０起動時の処理は、トレース情報を取得しない場合と同様である。すなわち、図７に示すように、ＯＳ１２０の起動時に、呼び出し元関数１１２とデバッグ対象関数１１１とが、カーネル空間にロードされる。その後、トレースコマンドの実行指示が入力されることで、トレース管理部１３０の処理時間解析部１３３によって、応答時間が短くなるトレース情報の取得手法が判定される。ここで、処理時間解析部１３３により、第２の手法の方が応答時間が短くなると判定されたものとする。
【００９１】
図１１は、第２の手法によりトレース情報を取得する場合の処理状況を示す第１の図である。第２の手法でトレース情報を取得する場合、デバッグ関数生成部１３４により、第２の手法でトレース情報を取得するための処理が記述された第２のデバッグ関数３４が生成される。生成された第２のデバッグ関数３４は、カーネル空間にロードされる。またデバッグ関数生成部１３４は、デバッグスレッド３５のプログラムをカーネル空間内にロードする。この時点では、デバッグスレッド３５はスリープ状態である。デバッグスレッド３５は、呼び出し元関数３１、デバッグ対象関数３２、および第２のデバッグ関数３４の処理と並列的に処理を実行可能な、処理機能である。
【００９２】
また第２の手法でトレース情報を取得する場合、呼び出し命令変更部１３５により、呼び出し元関数３１内の関数呼び出し命令の内容が書き換えられる。例えば呼び出し命令変更部１３５は、カーネル空間内にロードされた呼び出し元関数３１内のデバッグ対象関数３２の呼び出し命令（ｃａｌｌ  ｆｕｎｃ＿ａ）を、第２のデバッグ関数３４の呼び出し命令（ｃａｌｌ  ｆｕｎｃ＿ｄｂｇ２）に書き換える。
【００９３】
図１２は、第２の手法によりトレース情報を取得する場合の処理状況を示す第２の図である。その後、ＯＳ１２０から呼び出し元関数の実行要求が出されると、コンピュータ１００で呼び出し元関数３１が実行される。
【００９４】
呼び出し元関数３１の処理が実行され、呼び出し元関数３１内の第２のデバッグ関数３４の関数呼び出し命令の実行タイミングになると、第２のデバッグ関数３４が呼び出され、コンピュータ１００で実行される。第２のデバッグ関数３４が実行されている間は、呼び出し元関数３１の処理状態は、戻り値の待ち状態となっている。
【００９５】
ＯＳ１２０は、第２のデバッグ関数３４に記述された命令に従って、処理を実行する。例えば最初にsave命令が実行される。またＯＳ１２０は、第２のデバッグ関数３４に記述された命令に従い、リアルタイム解析情報の解析を行う。
【００９６】
また第２のデバッグ関数３４の処理では、デバッグスレッド３５への情報の引渡準備を行った後、デバッグスレッド３５のウェイクアップ指示が実行される。スリープ（sleep）状態のデバッグスレッド３５が動作状態に移行される。その後、第２のデバッグ関数３４の処理では、restore命令が実行される。さらに第２のデバッグ関数３４の処理では、デバッグ対象関数３２の実行要求が行われる。するとコンピュータ１００により、デバッグ対象関数３２を実行される。デバッグ対象関数３２を実行されている間は、第２のデバッグ関数３４の処理状態は、戻り値の待ち状態となっている。
【００９７】
ＯＳ１２０は、デバッグ対象関数３２の実行が終了すると、デバッグ対象関数３２の処理結果を第２のデバッグ関数３４への戻り値とする。デバッグ対象関数３２から戻り値が得られると、ＯＳ１２０は第２のデバッグ関数３４の処理に復帰し、デバッグ対象関数３２から取得したその戻り値を、呼び出し元関数３１への戻り値とする。そして第２のデバッグ関数３４の処理が終了する。
【００９８】
ＯＳ１２０は、第２のデバッグ関数３４からの戻り値に基づき、呼び出し元関数３１における関数呼び出し命令の次の命令から処理を続行する。
一方、デバッグスレッド３５は、解析対象が、第２のデバッグ関数３４の実行要求時に指定された限定条件に合致する場合には、非リアルタイム解析情報を解析し、解析結果をトレース管理部１３０内のトレース情報出力部１３６に引き渡す。例えばデバッグスレッド３５は、解析結果を、トレース管理部１３０が管理する記憶領域内にコピーする。なおデバッグスレッド３５は、限定条件が満たされていなければ、非リアルタイム解析情報の解析や解析結果の出力を行わずに、スリープ状態に移行する。
【００９９】
解析結果を取得したトレース情報出力部１３６は、デバッグスレッド３５から通知された解析結果を、例えば解析結果ファイル３９に書き出す。解析結果ファイル３９は、例えばＨＤＤ１０３に格納される。
【０１００】
このように、第２の手法では、非リアルタイム解析情報の解析は、第２のデバッグ関数３４の処理と並列で実行可能なデバッグスレッド３５で実行される。そのため、デバッグ対象関数３２を実行する第２のデバッグ関数３４は、非リアルタイム解析情報の解析を待たずに、処理を進めることができる。
【０１０１】
なお図１１、図１２に示した第２のデバッグ関数３４に基づくＯＳ１２０の処理機能は、図３に示した第１の実施の形態の第２の手法適用時の第１の処理手段４の一例である。また図１１、図１２に示したデバッグスレッド３５を用いたＯＳ１２０の処理機能は、図３に示した第１の実施の形態の第２の処理手段５の一例である。
【０１０２】
次に、トレース管理部１３０が実行するトレース管理処理を詳細に説明する。
図１３は、トレース管理処理の手順を示すフローチャートである。以下、図１３に示す処理をステップ番号に沿って説明する。
【０１０３】
［ステップＳ１１］ＯＳ１２０は、トレースコマンドの入力を受け付ける。ＯＳ１２０は、トレースコマンドが入力されると、トレース管理部１３０を起動する。
［ステップＳ１２］トレース管理部１３０は、トレース準備処理を行う。トレース準備処理は、デバッグプログラムの生成や、呼び出し元関数内の関数呼び出し命令の変更などの処理である。トレース準備処理の詳細は後述する（図２３参照）。
【０１０４】
［ステップＳ１３］トレース情報出力部１３６は、所定時間待機し、処理をステップＳ１４に進める。
［ステップＳ１４］トレース情報出力部１３６は、管理者からの操作などによるトレース終了指示が入力されたか否かを判断する。トレース情報出力部１３６は、トレース終了指示が入力された場合、処理をステップＳ１７に進める。またトレース情報出力部１３６は、トレース終了指示が入力されていなければ、処理をステップＳ１５に進める。
【０１０５】
［ステップＳ１５］トレース情報出力部１３６は、解析結果が通知されたか否かを判断する。例えばトレース情報出力部１３６は、共通域に解析結果が格納された場合に、解析結果が通知されたと判断する。トレース情報出力部１３６は、解析結果が通知された場合、処理をステップＳ１６に進める。またトレース情報出力部１３６は、解析結果が通知されていなければ、処理をステップＳ１３に進める。
【０１０６】
［ステップＳ１６］トレース情報出力部１３６は、通知された解析結果を、ファイルなどに出力する。その後、トレース情報出力部１３６は、処理をステップＳ１３に進める。
［ステップＳ１７］呼び出し命令変更部１３５は、トレース準備処理内で行った呼び出し元関数３１に対する関数呼び出し命令の変更を、元の呼び出し命令に戻す。
【０１０７】
［ステップＳ１８］デバッグ関数生成部１３４は、デバッグスレッド３５の有無を判断する。デバッグ関数生成部１３４は、デバッグスレッド３５が存在していれば、処理をステップＳ１９に進める。またデバッグ関数生成部１３４は、デバッグスレッド３５が存在していなければ、トレース管理処理を終了する。
【０１０８】
［ステップＳ１９］デバッグ関数生成部１３４は、ＯＳ１２０に対してデバッグスレッド３５の消去を指示する。その後、トレース管理処理を終了する。
このような手順でトレース情報が取得される。
【０１０９】
ここで、ステップＳ１１で入力されるトレースコマンドに基づくトレース条件の定義例について説明する。
図１４は、トレースコマンドと出力情報指定ファイルとのデータ形式の一例を示す図である。
【０１１０】
トレースコマンド５１は、図１４に示すように「ctrace （出力情報指定ファイル）」という形式で入力される。ここで「ctrace」が、トレースコマンド５１のコマンド名であり、「出力情報指定ファイル」がトレースコマンド５１に設定する引数である。「出力情報指定ファイル」には、トレース処理に関する限定条件などの定義されたファイル（出力情報指定ファイル５２）の位置（ディレクトリパス）と、ファイル名とが設定される。
【０１１１】
出力情報指定ファイル５２には、例えば、複数の記述子が設定される。記述子５３には呼び出し元関数名、デバッグ対象関数名、１つ以上の限定条件、および出力情報が設定される。
【０１１２】
呼び出し元関数名は、デバッグの対象となるデバッグ対象関数１１１を呼び出す呼び出し元関数の名称である。なお呼び出し元関数は複数指定することもできる。例えば、「func＿b1」と「func＿b2」と「func＿b3」の３個の呼び出し元関数を指定する場合は、「func＿b1:func＿b2:func＿b3」のように設定する。また呼び出し元関数として、カーネル空間で実行されるすべての関数を指定することも可能である。その場合は、例えば、呼び出し元関数名として「kernel」と記述する。
【０１１３】
一方、第２の実施の形態では、デバッグ対象関数は１個の記述子５３に１個のみ指定するものとする。
記述子５３には、複数の限定条件を設定できる。限定条件５４には、引数番号、引数種別、および任意の数の条件が設定できる。引数番号は、例えば「argN (N=0,1,2,…)」で指定する。これは、引数番号が「Ｎ」の引数に関する条件指定であることを意味する。引数種別は、例えば「plain」、「mblk＿t」などのキーワードで指定される。「plain」は、引数に設定されている情報がプレーンデータ（プレーンテキスト）の先頭アドレスであることを示す。「mblk＿t」は、引数に設定されている情報がメッセージブロック構造体の先頭アドレスであることを示す。
【０１１４】
条件は、「Ａ＝Ｂ」や「Ａ＜Ｂ」（Ａ，Ｂは実数）といった形、あるいは、「ftp」などのキーワードで示される。例えば、「Ethertype=0x800」と条件に指定すれば、引数種別が「mblk＿t」であった場合に、その引数が示すパケットの「Ethertype」が「0x800」（つまりＩＰ（Internet Protocol）のパケット）である場合だけ、情報出力を行うことを意味する。また「pattern="abc"」と条件に指定すれば、パケット中に"abc"（１６進だと 0x626364）というパターンが含まれる場合のみ情報出力することを意味する。また「LEN<101」と条件に指定すれば、パケット長（ＭＡＣ（Media Access Control）ヘッダを含む）が１０１バイトより小さい場合だけ情報出力を行うことを意味する。キーワード「ftp」を条件に指定すれば、「Ethertype=0x800, protocol=tcp, port=21」を指定したのと同じ意味となる。つまりＦＴＰ（File Transfer Protocol）で送受信されたパケットを意味する。
【０１１５】
また記述子５３における出力情報の形式は、「argN (N=0,1,2,…)」、「timestamp」、「stack」などのキーワード、または、「引数番号：引数種別：範囲」の形式で示される。「argN」は引数番号「Ｎ」の値を出力せよという指定である。「timestamp」は、その関数を通過した時刻を出力せよという指定である。「stack」は、その関数のスタックを出力せよという指定である。「引数番号：引数種別：範囲」の指定は、引数番号で指定された引数に設定されたアドレスの、引数種別で指定された種別の情報から、範囲で指定された部分を出力せよという指定である。引数番号と引数種別の指定方法は、限定条件５４の指定方法と同様である。
【０１１６】
出力情報における範囲は、例えば「Ａ−Ｂ」という形式で指定する。例えば以下のような指定を可能とする。範囲を「０−６４」と指定すると、パケットの０バイト目〜６４バイト目までを出力せよという指定となる。範囲を、「０−ＩＰ＿ｈｅａｄｅｒ」と指定すると、パケットの０バイト目〜ＩＰヘッダの末尾までを出力せよという指定となる。範囲を「１４−６４」と指定すると、１４バイト目〜６４バイト目までを出力せよという指定となる。範囲を「０−ｅｎｄ」と指定すると、パケット全体を出力せよという指定となる。
【０１１７】
図１５は、トレースコマンドと出力情報指定ファイルとに応じた出力結果の第１の例を示す図である。図１５の例では、トレースコマンド６１において、ファイル名「ｆｉｌｅ＿１」の出力情報指定ファイル６２が指定されている。
【０１１８】
この出力情報指定ファイル６２の例では、関数「ｆｕｎｃ＿ｂ」に対応するプログラムを実行する呼び出し元関数３１から、関数「ｆｕｎｃ＿ａ」が呼ばれるたびに、トレース情報の取得処理が実行される。トレース情報の取得処理では、関数「ｆｕｎｃ＿ａ」の引数「０」をネットワークで受け渡されるパケット情報であると考えた場合に、「Ethertype」が「0x800」（つまりＩＰパケットである）場合に限って出力が行われる。出力情報は、引数「０」の値、引数「１」の値、タイムスタンプ、スタック、パケットの０バイト目〜ＩＰヘッダの末尾までである。解析結果としては、例えば図１５の解析結果ファイル６３に示す内容が出力される。
【０１１９】
図１６は、トレースコマンドと出力情報指定ファイルとに応じた出力結果の第２の例を示す図である。図１６の例では、トレースコマンド６４において、ファイル名「ｆｉｌｅ＿２」の出力情報指定ファイル６５が指定されている。
【０１２０】
この出力情報指定ファイル６５の例では、関数「ｆｕｎｃ＿ｂ」に対応するプログラムを実行する呼び出し元関数３１から、関数「ｆｕｎｃ＿ａ」が呼ばれるたびに、トレース情報の取得処理が実行される。トレース情報の取得処理では、関数「ｆｕｎｃ＿ａ」の引数０をネットワークで受け渡されるパケット情報であると考えた場合に、ＦＴＰのパケットで、かつ、「abc」というパターンを含むパケットのみ出力される。出力情報は、引数０の値、引数１の値、タイムスタンプ、スタック、パケットの全体である。解析結果としては、例えば図１６の解析結果ファイル６６に示す内容が出力される。
【０１２１】
このように、予め出力情報指定ファイルを用意しておくことで、出力情報に関する条件を詳細に指定できる。トレース管理部１３０は、出力情報指定ファイルに示された出力情報の条件を、例えば共通域を介して、カーネル空間内の第１のデバッグ関数３３または第２のデバッグ関数３４に渡す。共通域は、カーネル空間内のプロセスとユーザ空間内のプロセスとの両方が使用できる、カーネル空間内のメモリ領域である。
【０１２２】
図１７は、共通域のデータ構造の一例を示す図である。共通域４０には、例えば３つのフィールド４１〜４３が設けられている。
最初のフィールド４１には、情報連鎖構造体のアドレスが設定される。情報連鎖構造体は、複数の呼び出し元から、トレース対象の関数の呼び出しが重複した場合に、複数の関数呼び出しそれぞれの解析結果を連鎖的に関連付ける情報である。共通域４０の情報連鎖構造体のアドレスのフィールド４１には、連鎖関係の先頭にある情報連鎖構造体のアドレスが設定される。
【０１２３】
２つめのフィールド４２には、デバッグ結果構造体の大きさが設定される。デバッグ結果構造体は、デバッグによる解析結果の格納領域である。
３つめのフィールド４３には、デバッグ要求構造体が設定される。デバッグ要求構造体は、トレース管理部１３０からのデバッグ要求の内容を示す情報である。
【０１２４】
なおデバッグ要求構造体は、トレースコマンドで指定された出力情報指定ファイルに基づいて、デバッグ関数生成部１３４によって生成される。
図１８は、デバッグ要求構造体のデータ構造の一例を示す図である。デバッグ要求構造体７０には、基本情報領域７１と拡張情報領域７２とが含まれる。
【０１２５】
基本情報領域７１には、構造体の大きさ、引数ごとの引数要求フラグ、タイムスタンプ要求フラグ、およびスタック要求フラグの各フィールドが設けられている。
構造体の大きさのフィールドには、デバッグ要求構造体７０のデータサイズが設定される。
【０１２６】
引数ごとの引数要求フラグのフィールドには、関数呼び出し命令に設定された引数の値を出力するか否かを示すフラグが設定される。図１８の例では、関数呼び出し命令に対して最大で１６個の引数が設定される場合が想定されている。関数呼び出し命令に設定される引数は、例えば、左から順番に０〜１５の引数番号が設定される。例えば、引数番号の引数の値を出力しない場合、その引数番号に対応する引数要求フラグのフィールドに「０」が設定される。引数番号の引数の値を出力する場合、その引数番号に対応する引数要求フラグのフィールドに「１」が設定される。
【０１２７】
タイムスタンプ要求フラグのフィールドには、タイムスタンプを出力するか否かを示すフラグが設定される。例えばタイムスタンプを出力しない場合、タイムスタンプ要求フラグのフィールドに「０」が設定される。また呼び出し元関数３１による関数呼び出し命令実行時を示すタイムスタンプを出力する場合、タイムスタンプ要求フラグのフィールドに「１」が設定される。
【０１２８】
スタック要求フラグのフィールドには、スタックの情報を出力するか否かを示すフラグが設定される。例えばスタックの情報を出力しない場合、スタック要求フラグのフィールドに「０」が設定される。またスタックの情報を出力する場合、スタック要求フラグのフィールドに「１」が設定される。
【０１２９】
拡張情報領域７２には、引数番号、引数種別、限定条件個数、複数の限定条件、および複数の取り出し部分の各フィールドが設けられている。
引数番号のフィールドには、出力する情報が格納された記憶領域のアドレスが設定された引数の番号が設定される。
【０１３０】
引数種別のフィールドには、出力する情報の種別が設定される。例えば出力する情報が、ネットワーク送受信データを表すメッセージブロック構造体であれば、引数種別のフィールドに「１」が設定される。また出力する情報が、プレーンデータのファイルであれば、引数種別のフィールドに「２」が設定される。
【０１３１】
限定条件個数のフィールドには、限定条件の個数が設定される。
限定条件のフィールドには、情報の出力を行うか否かの判断基準となる限定条件が設定される。例えば、引数種別が「１」の場合、限定条件のフィールドに、「Ethertype」、「送信元／送信先ＩＰアドレス」、「パケット長」などの条件が設定される。
【０１３２】
取り出し部分のフィールドには、出力する情報から解析結果として取り出す部分を指定する情報が設定される。例えば、引数種別が「１」の場合、先頭からＭＡＣヘッダまで、先頭からＩＰヘッダまで、先頭からＴＣＰヘッダまで、ＩＰヘッダのみ、ＴＣＰヘッダのみ、ＴＣＰチェックサム値のみ、xxバイト目〜yyバイト目までなどが、取り出し部分として指定できる。
【０１３３】
図１９は、デバッグ結果構造体のデータ構造の一例を示す図である。デバッグ結果構造体７３には、引数番号ごとの引数要求フラグのフィールドと、引数要求フラグのフィールドそれぞれに対応する引数の値のフィールドが設けられている。引数要求フラグのフィールドには、対応する引数番号で示される引数を取得したか否かを示すフラグが設定される。引数の値のフィールドには、対応する引数番号で示された引数の値が設定される。
【０１３４】
またデバッグ結果構造体７３には、タイムスタンプ要求フラグのフィールドと、タイムスタンプの値のフィールドが設けられている。タイムスタンプ要求フラグのフィールドには、タイムスタンプを取得したか否かを示すフラグが設定される。タイムスタンプの値のフィールドには、取得したタイムスタンプの値が設定される。
【０１３５】
またデバッグ結果構造体７３には、スタック要求フラグのフィールド、スタックの深さのフィールド、およびスタックに示される関数名のフィールドが設けられている。スタック要求フラグのフィールドには、スタックを取得したか否かを示すフラグが設定される。スタックの深さのフィールドには、何段階の関数呼び出しが行われたか（スタックに示される関数名の数）が設定される。関数名のフィールドには、スタックに含まれる関数名が設定される。例えば関数名のフィールドには順番が設定されており、呼び出し元の関数から順に、その関数の関数名が関数名のフィールドに設定される。
【０１３６】
またデバッグ結果構造体７３には、取り出し部分の大きさのフィールドと、取り出し部分のフィールドとが設けられている。取り出し部分の大きさのフィールドには、引数に設定されたアドレスで示された記憶領域内の情報から取り出した部分データのサイズが設定される。取り出し部分のフィールドには、引数に設定されたアドレスで示された記憶領域内の情報から取り出した部分データが設定される。
【０１３７】
図２０は、情報連鎖構造体のデータ構造の一例を示す図である。情報連鎖構造体７４には、次の情報連鎖構造体のアドレスのフィールド、デバッグ結果構造体のアドレスのフィールド、非リアルタイム解析情報種別のフィールド、および非リアルタイム解析情報領域のアドレスのフィールドが設けられている。
【０１３８】
次の情報連鎖構造体のアドレスのフィールドには、次に連鎖された情報連鎖構造体が格納された記憶領域の先頭のアドレスが設定される。なお、次に連鎖された情報連鎖構造体が存在しない場合、次の情報連鎖構造体のアドレスのフィールドには、例えば「０」が設定される。
【０１３９】
デバッグ結果構造体のアドレスのフィールドには、デバッグ結果構造体が格納された記憶領域の先頭のアドレスが設定される。
非リアルタイム解析情報種別のフィールドには、非リアルタイム解析情報が格納された記憶領域のデータ構造の種別が設定される。例えば非リアルタイム解析情報のデータ構造がメッセージブロック構造体であれば、非リアルタイム解析情報種別のフィールドに「１」が設定される。また非リアルタイム解析情報のデータ構造がプレーンデータであれば、非リアルタイム解析情報種別のフィールドに「２」が設定される。
【０１４０】
非リアルタイム解析情報領域のアドレスのフィールドには、非リアルタイム解析情報が格納された記憶領域の先頭のアドレスが設定される。
図２０に示した情報連鎖構造体７４は、複数の情報連鎖構造体によって連鎖関係を定義できる。
【０１４１】
図２１は、情報連鎖構造体による連鎖関係の一例を示す図である。図２１の例では、３つの情報連鎖構造体８１〜８３が連鎖関係となっている。共通域４０の情報連鎖構造体のアドレスのフィールド４１には、情報連鎖構造体８１が格納された記憶領域の先頭のアドレスが設定されている。情報連鎖構造体８１の次の情報連鎖構造体のアドレスのフィールドには、情報連鎖構造体８２が格納された記憶領域の先頭のアドレスが設定されている。情報連鎖構造体８２の次の情報連鎖構造体のアドレスのフィールドには、情報連鎖構造体８３が格納された記憶領域の先頭のアドレスが設定されている。情報連鎖構造体８３の次の情報連鎖構造体のアドレスのフィールドには、連鎖の最後であることを示す値「０」が設定されている。
【０１４２】
また、情報連鎖構造体８１〜８３それぞれに設定されたデバッグ結果構造体のアドレスにより、情報連鎖構造体８１〜８３それぞれに、デバッグ結果構造体８４〜８６が関連付けられている。さらに情報連鎖構造体８１〜８３それぞれに設定された非リアルタイム解析情報領域のアドレスにより、情報連鎖構造体８１〜８３それぞれに、非リアルタイム解析情報を含む記憶領域（非リアルタイム解析情報領域）８７〜８９が関連付けられている。
【０１４３】
次に、処理時間情報記憶部１３２のデータ構造について説明する。
図２２は、処理時間情報記憶部のデータ構造の一例を示す図である。処理時間情報記憶部１３２には、時間見積もりテーブル１３２ａが格納されている。時間見積もりテーブル１３２ａには、解析情報、リアルタイム解析の要否、解析時間、情報引渡時間、および依頼準備時間の列が設けられている。
【０１４４】
解析情報の列には、トレース処理で解析対象となる情報（解析情報）の種別が設定される。解析情報には、出力情報指定ファイルによって出力対象として指定可能な情報（出力情報）と、限定条件との照合対象となる情報とが含まれる。リアルタイム解析の要否の列には、対応する解析情報が、リアルタイムに解析する対象か否かが設定される。解析時間の列には、解析情報の解析に要する時間の見積もり値が設定される。情報引渡時間の列には、解析結果のトレース情報をトレース管理部１３０に引き渡すのに要する時間の見積もり値が設定される。依頼準備時間の列には、非リアルタイム解析情報の解析をデバッグスレッド３５に依頼するための準備処理に要する時間の見積もり値が設定される。
【０１４５】
このような時間見積もりテーブル１３２ａに基づいて、トレース準備処理（図１３のステップＳ１２）において、トレース取得手法を第１の手法にするのか第２の手法にするのかを、適切に判断することができる。
【０１４６】
図２３は、トレース準備処理の手順を示すフローチャートである。以下、図２３に示す処理をステップ番号に沿って説明する。
［ステップＳ３１］トレース管理部１３０のデバッグ関数生成部１３４は、カーネル空間内に共通域４０を獲得する。次に、デバッグ関数生成部１３４は、トレースコマンドの引数で指定された出力情報指定ファイルの内容に従って、デバッグ要求構造体を生成する。そしてデバッグ関数生成部１３４は、生成したデバッグ要求構造体を共通域４０に格納する。またデバッグ関数生成部１３４は、デバッグ結果構造体の大きさを計算し、共通域４０に格納する。
【０１４７】
［ステップＳ３２］処理時間解析部１３３は、非リアルタイム解析情報の解析時間の算出処理を行う。ここで、算出された非リアルタイム解析情報の解析時間を変数「ａ」に設定する。この処理の詳細は後述する（図２４参照）。
【０１４８】
［ステップＳ３３］処理時間解析部１３３は、トレース管理部１３０への情報引渡時間の算出処理を行う。ここで、算出されたトレース管理部１３０への情報引渡時間を変数「ｂ」に設定する。この処理の詳細は後述する（図２５参照）。
【０１４９】
［ステップＳ３４］処理時間解析部１３３は、デバッグスレッド３５への情報引渡時間の算出処理を行う。ここで、算出されたデバッグスレッド３５への情報引渡時間を変数「ｃ」に設定する。この処理の詳細は後述する（図２６参照）。
【０１５０】
［ステップＳ３５］処理時間解析部１３３は、トレース取得手法として第１の手法が適切か、第２の手法が適切かの判定を行う。例えば処理時間解析部１３３は、非リアルタイム解析情報の解析時間（ａ）とトレース管理部１３０への情報引渡時間（ｂ）との加算結果と、デバッグスレッド３５への情報引渡時間（ｃ）とを比較する。時間が等しいか、またはデバッグスレッド３５への情報引渡時間（ｃ）の方が長ければ、処理時間解析部１３３は、第１の手法が適切であると判定し、処理をステップＳ３６に進める。非リアルタイム解析情報の解析時間（ａ）とトレース管理部１３０への情報引渡時間（ｂ）との加算結果の方が長ければ、処理時間解析部１３３は、第２の手法が適切であると判定し、処理をステップＳ３８に進める。
【０１５１】
［ステップＳ３６］処理時間解析部１３３において第１の手法が適切であると判定された場合、デバッグ関数生成部１３４は、関数名「ｆｕｎｃ＿ｄｂｇ１」の第１のデバッグ関数３３を生成する。デバッグ関数生成部１３４は、生成した第１のデバッグ関数３３をカーネル空間にロードする。そして、デバッグ関数生成部１３４は、生成した第１のデバッグ関数３３が関数名「ｆｕｎｃ＿ｄｂｇ１」の呼び出しに応じて実行されるように、ＯＳ１２０に対して設定する。
【０１５２】
［ステップＳ３７］処理時間解析部１３３において第１の手法が適切であると判定された場合、呼び出し命令変更部１３５は、呼び出し元関数３１内の関数呼び出し先を、第１のデバッグ関数３３に変更する。例えば呼び出し命令変更部１３５は、カーネル空間内において、呼び出し元関数３１内のデバッグ対象関数３２の呼び出し命令を、第１のデバッグ関数３３の呼び出し命令に書き換える。その後、トレース準備処理が終了する。
【０１５３】
［ステップＳ３８］処理時間解析部１３３において第２の手法が適切であると判定された場合、デバッグ関数生成部１３４は、関数名「ｆｕｎｃ＿ｄｂｇ２」の第２のデバッグ関数３４を生成する。デバッグ関数生成部１３４は、生成した第２のデバッグ関数３４をカーネル空間にロードする。そしてデバッグ関数生成部１３４は、生成した第２のデバッグ関数３４が、関数名「ｆｕｎｃ＿ｄｂｇ２」の呼び出しに応じて実行されるように、ＯＳ１２０に対して設定する。
【０１５４】
［ステップＳ３９］処理時間解析部１３３において第２の手法が適切であると判定された場合、呼び出し命令変更部１３５は、呼び出し元関数３１内の関数呼び出し先を、第２のデバッグ関数３４に変更する。例えば呼び出し命令変更部１３５は、カーネル空間内において、呼び出し元関数３１内のデバッグ対象関数３２の呼び出し命令を、第２のデバッグ関数３４の呼び出し命令に書き換える。その後、トレース準備処理が終了する。
【０１５５】
次に、非リアルタイム解析情報の解析時間の算出処理の手順について説明する。
図２４は、非リアルタイム解析情報の解析時間の算出処理の手順の一例を示すフローチャートである。以下、図２４に示す処理をステップ番号に沿って説明する。
【０１５６】
［ステップＳ４１］処理時間解析部１３３は、時間見積もりテーブル１３２ａの解析情報の列において、トレースコマンドによってユーザが指定した解析情報が設定されたエントリ（行）を選択する。例えば処理時間解析部１３３は、共通域４０に格納されたデバッグ要求構造体７０の基本情報領域７１において情報出力を行うことが示されている（例えばフラグの値が「１」）引数要求フラグに対応する引数の引数番号を判断する。次に処理時間解析部１３３は、トレース対象の関数（ｆｕｎｃ＿ａ）の引数の記述フォーマットに基づいて、情報出力を行う引数に対応する情報の種別を判断する。そして処理時間解析部１３３は、情報出力の対象となる種別の情報の行を、時間見積もりテーブル１３２ａからすべて選択する。また処理時間解析部１３３は、デバッグ要求構造体７０の拡張情報領域７２において、設定されている限定条件の照合対象となる情報、および取り出し部分として指定されている情報の行を、時間見積もりテーブル１３２ａからすべて選択する。
【０１５７】
［ステップＳ４２］処理時間解析部１３３は、選択した各行の情報について、何個の引数から解析情報として指定されているのかを計数し、ＲＡＭ１０２などに記録する。
［ステップＳ４３］処理時間解析部１３３は、ステップＳ４１で選択した行の情報のうち、リアルタイム解析が不要な情報をすべて選択する。例えば処理時間解析部１３３は、時間見積もりテーブル１３２ａにおけるステップＳ４１で選択した行のリアルタイム解析の要否の列の値を参照して、リアルタイム解析が不要と設定されている情報の行をすべて選択する。
【０１５８】
［ステップＳ４４］処理時間解析部１３３は、ステップＳ４３で選択した行の解析時間を合計し、変数「ａ」に設定する。なお処理時間解析部１３３は、複数の引数から解析情報として指定されている情報については、合計する前に、その情報の解析時間に対して、指定を行っている引数の個数を乗算する。
【０１５９】
このようにして、非リアルタイム解析情報の解析時間が算出される。
次に、トレース管理部１３０への情報引渡時間の算出処理の手順について説明する。
図２５は、トレース管理部への情報引渡時間の算出処理の手順の一例を示すフローチャートである。以下、図２５に示す処理をステップ番号に沿って説明する。
【０１６０】
［ステップＳ５１］処理時間解析部１３３は、時間見積もりテーブル１３２ａの解析情報の列において、トレースコマンドによってユーザが指定した解析情報が設定されたエントリ（行）を選択する。この処理の詳細は、図２４のステップＳ４１と同様である。
【０１６１】
［ステップＳ５２］処理時間解析部１３３は、選択した各行の情報について、何個の引数から解析情報として指定されているのかを計数し、ＲＡＭ１０２などに記録する。
［ステップＳ５３］処理時間解析部１３３は、ステップＳ５１で選択した行の情報引渡時間を合計し、変数「ｂ」に設定する。なお処理時間解析部１３３は、複数の引数から解析情報として指定されている情報については、合計する前に、その情報の情報引渡時間に対して、指定を行っている引数の個数を乗算する。
【０１６２】
このようにして、トレース管理部１３０への情報引渡時間が算出される。
次に、デバッグスレッド３５への情報引渡時間の算出処理の手順について説明する。
図２６は、デバッグスレッドへの情報引渡時間の算出処理の手順の一例を示すフローチャートである。以下、図２６に示す処理をステップ番号に沿って説明する。
【０１６３】
［ステップＳ６１］処理時間解析部１３３は、時間見積もりテーブル１３２ａの解析情報の列において、トレースコマンドによってユーザが指定した解析情報が設定されたエントリ（行）を選択する。この処理の詳細は、図２４のステップＳ４１と同様である。
【０１６４】
［ステップＳ６２］処理時間解析部１３３は、選択した各行の情報について、何個の引数から解析情報として指定されているのかを計数し、ＲＡＭ１０２などに記録する。
［ステップＳ６３］処理時間解析部１３３は、ステップＳ６１で選択した行の依頼準備時間を合計する。なお処理時間解析部１３３は、複数の引数から解析情報として指定されている情報については、合計する前に、その情報の依頼準備時間に対して、指定を行っている引数の個数を乗算する。
【０１６５】
［ステップＳ６４］処理時間解析部１３３は、ステップＳ６３で計算した合計値に、デバッグスレッドをウェイクアップ（wakeup）させる時間を加算し、変数「ｃ」に設定する。なお、デバッグスレッド３５をウェイクアップさせる時間は、例えば予め処理時間解析部１３３に設定されている。
【０１６６】
このようにして、デバッグスレッド３５への情報引渡時間が算出される。
このようにして算出された非リアルタイム解析情報の解析時間、トレース管理部１３０への情報引渡時間、およびデバッグスレッド３５への情報引渡時間に基づいて、適用するトレース取得手法が判定される。以下、具体的な計算例について説明する。
【０１６７】
図２７は、時間見積もりテーブルに設定された情報の一例を示す図である。図２７の時間見積もりテーブル１３２ａの例では、解析時間、情報引渡時間、依頼準備時間の各時間が、マイクロ秒（μｓ）単位で示されている。また解析情報ごとの解析時間、情報引渡時間、依頼準備時間には、例えば所定の環境で実測した値が設定されている。
【０１６８】
なお、図２７には示していないが、デバッグスレッド３５をウェイクアップさせるのに要する時間は、「１０μｓ」であるものとする。
図２７に示したような時間見積もりテーブル１３２ａに基づく、トレース取得手法の２つの判定例を以下に示す。
【０１６９】
＜第１のトレース取得手法判定例＞
第１の例では、トレースコマンドで、スタック、タイムスタンプ、引数「０」に設定されたアドレス、引数「１」に設定されたアドレスを出力するように指定されたものとする。この場合の非リアルタイム解析情報の解析時間、トレース管理部１３０への情報引渡時間、およびデバッグスレッド３５への情報引渡時間は、以下のようにして算出される。
【０１７０】
非リアルタイム解析情報の解析時間（変数「ａ」）＝０μｓである。
これは、トレースコマンドで指定された解析情報が、全てリアルタイム解析が必要な情報だからである。
【０１７１】
トレース管理部１３０への情報引渡時間（変数「ｂ」）＝１０μｓ（スタックを渡すのにかかる時間）＋１μｓ（タイムスタンプを渡すのにかかる時間）＋１μｓ×２(引数を渡すのにかかる時間×２個)＝１３μｓである。
【０１７２】
デバッグスレッド３５への情報引渡時間（変数「ｃ」）＝１０μｓ（スタックを渡すのにかかる時間）＋１μｓ（タイムスタンプを渡すのにかかる時間）＋１μｓ×２（引数を渡すのにかかる時間×２個）＋１０μｓ（デバッグスレッドのwakeup時間）＝２３μｓである。
【０１７３】
この場合、ａ＋ｂ＝０＋１３＝１３μｓ、ｃ＝２３μｓなので、図２３のステップＳ３５の「ａ＋ｂ≦ｃ」の判定は、ＹＥＳとなる。その結果、第１の手法と判定される。
＜第２のトレース取得手法判定例＞
第２の例では、引数「１」の引数に、メッセージブロック構造体の先頭アドレスが設定されている場合を想定する。このときトレースコマンドで、スタック、タイムスタンプ、引数「０」に設定されたアドレス、引数「１」に設定されたアドレス、引数「１」が示すパケットのEthertypeが0x800のものだけについて、そのパケットの全体を出力するように指定されたものとする。この場合の非リアルタイム解析情報の解析時間、トレース管理部１３０への情報引渡時間、およびデバッグスレッド３５への情報引渡時間は、以下のようにして算出される。
【０１７４】
非リアルタイム解析情報の解析時間（変数「ａ」）＝２μｓ（Ethertype=0x800であることの解析にかかる時間）
トレース管理部１３０への情報引渡時間（変数「ｂ」）＝１０μｓ（スタックを渡すのにかかる時間）＋１μｓ（タイムスタンプを渡すのにかかる時間）＋１μｓ×２（引数を渡すのにかかる時間×２個）＋１００μｓ（パケット全体を渡すのにかかる時間）＝１１３μｓ
デバッグスレッドへの情報引渡時間（変数「ｃ」）＝１０μｓ（スタックを渡すのにかかる時間）＋１μｓ（タイムスタンプを渡すのにかかる時間）＋１μｓ×２（引数を渡すのにかかる時間×２個）＋２μｓ（パケット全体を渡すのにかかる時間）＋１０μｓ（デバッグスレッドのwakeup時間）＝２５μｓ
この場合、ａ＋ｂ＝２＋１１３＝１１５μｓ、ｃ＝２５μｓなので、図２３のステップＳ３５の「ａ＋ｂ≦ｃ」の判定は、ＮＯとなる。その結果、第２の手法と判定される。
【０１７５】
以上のようにして、第１の手法と第２の手法とのうち、デバッグ処理を行うプログラムから呼び出し元のプログラムへの応答時間が短くなる方の手法によって、トレース処理を含むデバッグ処理が実行される。以下、デバッグ処理の手順について詳細に説明する。
【０１７６】
まず第１の手法でトレース処理を実行する第１のデバッグ処理について説明する。
図２８は、第１のデバッグ処理の手順の一例を示すフローチャートである。以下、図２８に示す処理をステップ番号に沿って説明する。以下の処理は、第１のデバッグ関数３３に記述された命令に基づいて、コンピュータ１００が実行する。
【０１７７】
［ステップＳ７１］ＯＳ１２０は、呼び出し元関数３１から第１のデバッグ関数３３呼び出しがあるか否かを判断する。第１のデバッグ関数３３の呼び出しがある場合、ＯＳ１２０は第１のデバッグ関数３３を起動し、処理をステップＳ７２に進める。第１のデバッグ関数の呼び出しがなければ、ＯＳ１２０は、ステップＳ７１の処理を繰り返す。
【０１７８】
［ステップＳ７２］ＯＳ１２０は、save命令を実行し、レジスタ内の情報をＲＡＭ１０２に退避する。
［ステップＳ７３］ＯＳ１２０は、デバッグ結果構造体を生成する。ＯＳ１２０は、生成したデバッグ結果構造体をＲＡＭ１０２などのメモリに格納する。
【０１７９】
［ステップＳ７４］ＯＳ１２０は、リアルタイム解析情報を解析する。例えばＯＳ１２０は、共通域４０に格納されたデバッグ要求構造体７０に基づいて、出力対象の情報を判断する。次にＯＳ１２０は、出力対象の情報のうち、リアルタイムの解析が必要な情報について解析する。なおデバッグ結果構造体に設定する情報のうち、どの情報がリアルタイムに解析する情報なのかは、例えば第１のデバッグ関数３３内に定義しておくことができる。
【０１８０】
［ステップＳ７５］ＯＳ１２０は、リアルタイム解析情報の解析結果を、デバッグ結果構造体に格納する。
［ステップＳ７６］ＯＳ１２０は、デバッグ対象関数３２の関数呼び出しに関連する情報が限定条件に合致するか否かを判断する。なおＯＳ１２０は、共通域４０に格納されたデバッグ要求構造体７０に基づいて、限定条件を認識する。ＯＳ１２０は、限定条件に合致する場合、処理をステップＳ７７に進める。またＯＳ１２０は、限定条件に合致しない場合、処理をステップＳ８０に進める。
【０１８１】
［ステップＳ７７］ＯＳ１２０は、出力対象の情報のうちの非リアルタイム解析情報を解析する。
［ステップＳ７８］ＯＳ１２０は、非リアルタイム解析情報の解析結果を、デバッグ結果構造体に格納する。
【０１８２】
［ステップＳ７９］ＯＳ１２０は、デバッグ結果構造体の情報を、トレース管理部１３０に引き渡す。例えばＯＳ１２０は、デバッグ結果構造体の先頭のアドレスが設定された情報連鎖構造体を生成し、共通域４０の生成した情報連鎖構造体の先頭のアドレスを設定する。するとトレース管理部１３０のトレース情報出力部１３６は、共通域４０を参照して情報連鎖構造体の先頭アドレスを認識し、その情報連鎖構造体を参照してデバッグ結果構造体の先頭アドレスを認識する。そして、トレース情報出力部１３６は、デバッグ結果構造体の内容を取得する。
【０１８３】
［ステップＳ８０］ＯＳ１２０は、レジスタの内容をＲＡＭ１０２からレジスタに戻すrestore命令を実行する。
［ステップＳ８１］ＯＳ１２０は、トレース対象の関数（ｆｕｎｃ＿ａ）の呼び出しを行う。
【０１８４】
［ステップＳ８２］ＯＳ１２０は、デバッグ対象関数３２から戻り値を取得したか否かを判断する。ＯＳ１２０は、戻り値を取得した場合、処理をステップＳ８３に進める。またＯＳ１２０は、戻り値を取得していなければ、ステップＳ８２の処理を繰り返し、デバッグ対象関数３２の処理の実行による戻り値を待つ。
【０１８５】
［ステップＳ８３］ＯＳ１２０は、復帰命令を実行し、呼び出し元関数３１に処理を復帰させる。この際、ＯＳ１２０は、デバッグ対象関数３２から取得した戻り値を、呼び出し元関数３１への戻り値とする。その後、ＯＳ１２０は、処理をステップＳ７１に進める。
【０１８６】
このようにして、第１の手法によるトレース処理を伴うデバッグ処理が実行される。
次に、第２の手法でトレース処理を実行する第２のデバッグ処理について説明する。
図２９は、第２のデバッグ処理の手順の一例を示すフローチャートである。以下、図２９に示す処理をステップ番号に沿って説明する。図２９に示す処理は、第２のデバッグ関数３４に記述された命令に基づいて、コンピュータ１００が実行する。なお、ステップＳ９１〜Ｓ９５、ステップＳ９８〜Ｓ１０１の処理は、それぞれ図２８に示したステップＳ７１〜Ｓ７５，Ｓ８０〜Ｓ８３の処理と同じである。
【０１８７】
［ステップＳ９６］ＯＳ１２０は、デバッグスレッド３５への情報引渡準備処理を行う。この処理の詳細は後述する（図３０参照）。
［ステップＳ９７］ＯＳ１２０は、デバッグスレッド３５のウェイクアップ信号を送信する。ウェイクアップ信号に応じて、デバッグスレッド３５がスリープ状態から起動状態に移行する。
【０１８８】
図３０は、デバッグスレッドへの情報引渡準備処理の手順の一例を示すフローチャートである。以下、図３０に示す処理をステップ番号に沿って説明する。
［ステップＳ１１１］ＯＳ１２０は、非リアルタイム解析情報が参照カウンタを有する領域に格納されているか否かを判断する。例えば引数に設定されたアドレスで示された領域内の情報が出力情報の対象として指定されており、その情報が図６に示したようなメッセージブロック構造体の場合、参照カウンタを有する領域に格納されていると判断される。ＯＳ１２０は、参照カウンタを有する領域に格納されている場合、処理をステップＳ１１２に進める。またＯＳ１２０は、参照カウンタを有する領域に格納されていない場合、処理をステップＳ１１３に進める。
【０１８９】
［ステップＳ１１２］ＯＳ１２０は、出力対象として指定されている情報が格納されている領域の参照カウンタに１を加算する。その後、ＯＳ１２０は、処理をステップＳ１１４に進める。
【０１９０】
［ステップＳ１１３］ＯＳ１２０は、出力対象の非リアルタイム解析情報を含む情報を、ＲＡＭ１０２内の新たな記憶領域にコピーする。
［ステップＳ１１４］ＯＳ１２０は、情報連鎖構造体を生成する。
【０１９１】
［ステップＳ１１５］ＯＳ１２０は、情報連鎖構造体に、デバッグ結果構造体のアドレス、非リアルタイム解析情報を含む領域の種別、非リアルタイム解析情報を含む領域の先頭のアドレスを設定する。非リアルタイム解析情報を含む領域の種別は、例えば、メッセージブロック構造体であれば「１」、プレーンデータであれば「２」が設定される。
【０１９２】
［ステップＳ１１６］ＯＳ１２０は、共通域４０に設定されている情報連鎖構造体アドレスから始まる情報連鎖構造体の連鎖の先端に、ステップＳ１１４で生成した情報連鎖構造体を連鎖させる。例えばＯＳ１２０は、最後に連鎖された情報連鎖構造体の「次の情報連鎖構造体のアドレス」のフィールドに、ステップＳ１１４で生成した情報連鎖構造体の記憶領域の先頭のアドレスを設定する。またＯＳ１２０は、ステップＳ１１４で生成した情報連鎖構造体の「次の情報連鎖構造体のアドレス」のフィールドには「０」を設定する。
【０１９３】
このようにしてデバッグスレッド３５へ情報を引き渡す準備が完了する。この状況でデバッグスレッド３５がwakeupされると、デバッグスレッド３５は共通域４０から情報連鎖構造体のアドレスを順にたどることで、デバッグスレッド３５はすべての情報連鎖構造体の情報を取得可能となる。またデバッグスレッド３５は、各情報連鎖構造体に設定されているデバッグ結果構造体のアドレスを参照することで、リアルタイム解析情報を取得できる。またデバッグスレッド３５は、共通域４０に設定されたデバッグ要求構造体７０を参照することで、非リアルタイムで解析する情報を認識できる。
【０１９４】
次に、情報の引き渡しを受けたデバッグスレッド３５の処理について説明する。なお、デバッグスレッド３５はＯＳ１２０の機能の一部であるが、第２のデバッグ処理など処理と並行して処理を実行することができる。
【０１９５】
図３１は、デバッグスレッドの処理の手順の一例を示す図である。以下、図３１の処理をステップ番号に沿って説明する。
［ステップＳ１２１］デバッグスレッド３５は、生成された直後、および共通域４０の情報連鎖構造体のアドレスが「０」となったとき、スリープ状態に移行する。
【０１９６】
［ステップＳ１２２］デバッグスレッド３５は、第２のデバッグ関数３４の処理によってウェイクアップ信号が入力されたか否かを判断する。デバッグスレッド３５は、ウェイクアップ信号が入力された場合、処理をステップＳ１２３に進める。またデバッグスレッド３５は、ウェイクアップ信号が入力されていなければ、ステップＳ１２２の処理を繰り返し、ウェイクアップ信号の入力を待つ。
【０１９７】
［ステップＳ１２３］デバッグスレッド３５は、ウェイクアップ信号の入力に応じて、ウェイクアップする（動作状態に移行する）。
［ステップＳ１２４］デバッグスレッド３５は、共通域４０の情報連鎖構造体のアドレスが「０」か否かを判断する。デバッグスレッド３５は、アドレスが「０」の場合、デバッグスレッド３５は、解析する情報連鎖構造体が無いと判断し、処理をステップＳ１２１に進める。またアドレスが「０」以外の場合、デバッグスレッド３５は処理をステップＳ１２５に進める。
【０１９８】
［ステップＳ１２５］デバッグスレッド３５は、共通域４０の情報連鎖構造体のアドレスのフィールド４１に設定されたアドレスで示される領域に格納された情報連鎖構造体を、解析対象と判断する。次にデバッグスレッド３５は、解析対象の情報連鎖構造体に設定された非リアルタイム解析情報領域のアドレスを参照する。そしてデバッグスレッド３５は、参照したアドレスが示す領域に格納されている非リアルタイム解析情報が、デバッグ要求構造体に示される限定条件に合致するか否かを判断する。デバッグスレッド３５は、限定条件に合致する場合、処理をステップＳ１２６に進める。またデバッグスレッド３５は、限定条件に合致しない場合、処理をステップＳ１２４に進める。
【０１９９】
［ステップＳ１２６］デバッグスレッド３５は、非リアルタイム解析情報を解析する。例えばデバッグスレッド３５は、解析対象の情報連鎖構造体に設定された非リアルタイム解析情報領域のアドレスを参照する。そしてデバッグスレッド３５は、参照したアドレスが示す領域に格納されている非リアルタイム解析情報から、デバッグ要求構造体において指定されている取り出し部分を抽出し、解析結果とする。
【０２００】
［ステップＳ１２７］デバッグスレッド３５は、解析対象の情報連鎖構造体に設定されたデバッグ結果構造体のアドレスで示されるデバッグ結果構造体に、解析結果を格納する。
【０２０１】
［ステップＳ１２８］デバッグスレッド３５は、解析結果をトレース管理部１３０に通知する。例えばデバッグスレッド３５は、解析対象の情報連鎖構造体に設定されたデバッグ結果構造体のアドレスで示される領域のデバッグ結果構造体のコピーを、トレース管理部１３０に通知する。
【０２０２】
［ステップＳ１２９］デバッグスレッド３５は、解析処理が終了した情報連鎖構造体を連鎖から外す。例えばデバッグスレッド３５は、解析対象の情報連鎖構造体の「次の情報連鎖構造体のアドレス」のフィールドに設定されていたアドレスを、共通域４０の情報連鎖構造体のアドレスのフィールド４１に設定する。
【０２０３】
［ステップＳ１３０］デバッグスレッド３５は、メモリ解放処理を行う。例えばデバッグスレッド３５は、情報連鎖構造体、デバッグ結果構造体、非リアルタイム解析情報のメモリ解放処理を行う。なおデバッグスレッド３５は、解放対象の領域が参照カウンタを持つ領域であった場合、参照カウンタから１を引き、参照カウンタが０になった場合のみ、メモリ解放処理を行う。その後、デバッグスレッド３５は、処理をステップＳ１２４に進める。
【０２０４】
以上のようにして、詳細な解析処理や大量のコピー処理を行っても、呼び出し元の処理を遅延させずにすむ。すなわち、詳細な解析が発生するのは、非リアルタイム解析情報の解析を行うときであると考えられる。また、大量のコピーが発生するのは、トレース管理部１３０へ結果を通知するときであると考えられる。このことから、詳細な解析処理が発生した場合や大量のコピーが発生する場合は、非リアルタイム解析情報の解析処理は別スレッドで行うことで、呼び出し元の処理への応答の遅延を抑止できる。その結果、トレース処理の実施による呼び出し元の処理の遅延が抑止される。
【０２０５】
なお、呼び出し元関数は１つに限定されず、複数のプログラムにすることもできる。例えば、トレース対象となるデバッグ対象関数３２の呼び出し命令を含むすべてのプログラムを、呼び出し元関数とすることもできる。
【０２０６】
また、第２の実施の形態では、呼び出し元関数３１におけるデバッグ対象関数３２の呼び出し命令をデバッグ関数の呼び出し命令に書き換えることで、デバッグ対象関数３２の呼び出し時のトレース処理の実施を可能としている。これにより、デバッグ対象関数３２のsave命令が存在していなくても、トレース処理の実施が可能となる。すなわち、デバッグ対象関数３２の先頭にsave命令があれば、save命令をデバッグ関数の呼び出し命令に書き換えることでトレース処理を実施することも可能である。しかし、このような手法を用いた場合、save命令を有していないデバッグ対象関数３２の呼び出しに関するトレース処理が実施できない。第２の実施の形態に示すように関数呼び出し命令をデバッグ関数の呼び出し命令に変更することで、save命令を有していないデバッグ対象関数３２の呼び出しに関してもトレース処理が可能となり、トレース処理の汎用性が向上する。
【０２０７】
また第２の実施の形態では、カーネル空間からユーザ空間に通知する情報を、限定条件や出力情報によって制限することができ、処理の効率化が可能である。すなわち、ユーザ空間内のアプリケーションプログラムによって、トレースした情報の一部をユーザ向けに出力することが可能である。しかし、この場合、カーネル空間で動作する機能からユーザ空間で動作する機能へ、トレースした情報のすべてを転送した後、ユーザアプリケーションで情報の要否を判断し、不要な場合破棄することとなる。すると、本来不要な情報の解析や解析結果の転送が発生し、処理効率が悪くなる。一方、第２の実施の形態では、限定条件に合致しない情報については、解析結果のトレース管理部１３０への転送が抑止されている。これによりデバッグ処理の効率化が図られると共に、カーネル空間からユーザ空間へ転送されるデータ量が削減される。
【０２０８】
また第２の実施の形態では、指定された出力情報のみをカーネル空間内で動作するデバッグ処理部またはデバッグスレッドで抽出し、トレース管理部１３０に通知するようにしている。これにより、解析する情報の低減が可能となり、デバッグ処理の効率化が図られると共に、カーネル空間からユーザ空間へ転送されるデータ量が削減される。
【０２０９】
さらに、第２の実施の形態では、限定条件の指定を、カーネル空間内のデータの表現に依存せずに行うことができる。すなわち、第２の実施の形態では、トレース管理部１３０とカーネル空間内の機能との間でデータ受け渡しのインタフェース（データ構造）が、デバッグ要求構造体７０として規定されている。トレース管理部１３０は、指定された情報を、規定されたインタフェース（データ構造）に従った形式にして、カーネル空間内に共通域４０を獲得し、その領域にデバッグ要求構造体をコピーする。これにより、カーネル空間内でのデータ表現に関しては、カーネル空間内で判断すればよいことになり、トレース管理部１３０から容易に出力情報や限定条件を指定することができる。
【０２１０】
〔その他の実施の形態〕
なお、上記の各実施の形態に示した処理機能は、コンピュータによって実現することができる。その場合、コンピュータが有する機能の処理内容を記述したプログラムが提供される。そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置（ＨＤＤ）、フレキシブルディスク（ＦＤ）、磁気テープなどがある。光ディスクには、ＤＶＤ、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ／ＲＷなどがある。光磁気記録媒体には、ＭＯ（Magneto-Optical disc）などがある。
【０２１１】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【０２１２】
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、サーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
【０２１３】
また、上記の処理機能の少なくとも一部を、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現することもできる。
【０２１４】
上記については単に本発明の原理を示すものである。さらに、多数の変形、変更が当業者にとって可能であり、本発明は上記に示し、説明した正確な構成および応用例に限定されるものではなく、対応するすべての変形例および均等物は、添付の請求項およびその均等物による本発明の範囲とみなされる。
【符号の説明】
【０２１５】
１  記憶手段
１ａ  第１のプログラム
１ｂ  第２のプログラム
２  判定手段
３  解析管理手段
４  第１の処理手段
５  第２の処理手段
【手続補正２】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
第１のプログラムの呼び出しに関する情報の解析要求に基づき、該解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する第１の手法と、該解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、非リアルタイムに解析する情報以外の情報の解析をリアルタイムに実行する第２の手法とのうち、前記第１のプログラムの呼び出しが行われたときの呼び出し元への応答時間が短い方の手法を判定する判定手段と、
前記第１の手法の方が応答時間が短い場合、前記第１のプログラムの呼び出し命令が記述された第２のプログラムの実行過程における該呼び出し命令の実行時に、解析要求で指定された情報のすべての情報の解析、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、第１の処理手段にリアルタイムに実行させ、前記第２の手法の方が応答時間が短い場合、前記第２のプログラムの実行過程における前記呼び出し命令の実行時に、解析要求で指定された情報のうちの非リアルタイムに解析する情報以外の情報の解析、非リアルタイムに解析する情報の第２の処理手段への解析依頼、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、前記第１の処理手段にリアルタイムに実行させ、非リアルタイムに解析する情報の解析を、前記第２の処理手段に非リアルタイムに実行させる解析管理手段と、
を有することを特徴とする情報処理装置。
【請求項２】
前記判定手段は、解析要求で指定された情報の一部を非リアルタイムで解析させることにより前記第１の処理手段で行わずにすむ処理の処理時間と、解析要求で指定された情報の一部を非リアルタイムで解析させることにより前記第１の処理手段で新たに行うこととなる処理の処理時間とを比較し、新たに行うこととなる処理の処理時間の方が長ければ、前記第１の手法の方が応答時間が短いと判断し、行わずにすむ処理の処理時間の方が長ければ、前記第２の手法の方が応答時間が短いと判断することを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記第１の処理手段で行わずにすむ処理の処理時間は、非リアルタイムに解析する情報の解析に要する時間と、解析結果を出力する時間とを加算した時間であることを特徴とする請求項２記載の情報処理装置。
【請求項４】
前記第１の処理手段で新たに行うこととなる処理の処理時間は、前記第１の処理手段から前記第２の処理手段への非リアルタイムに解析する情報の解析の依頼に要する時間であることを特徴とする請求項２または３のいずれかに記載の情報処理装置。
【請求項５】
前記解析管理手段はユーザ空間内で動作し、解析要求による解析対象の指定内容を、カーネル空間内に確保した共通域を介して、前記第１の処理手段に解析要求の内容を通知することを特徴とする請求項１乃至４のいずれかに記載の情報処理装置。
【請求項６】
解析要求による解析対象の指定内容には、前記第２のプログラムの実行過程における前記呼び出し命令の実行時に、前記第１のプログラムの呼び出しに関する情報の解析を実行するための条件が指定されており、
前記第１の処理手段は、解析要求で指定された条件が満たされる場合に情報の解析を行うことを特徴とする請求項１乃至５のいずれかに記載の情報処理装置。
【請求項７】
解析要求には、前記第１のプログラムの呼び出しに関する情報の少なくとも一部が出力対象に指示されており、
前記第１の処理手段と前記第２の処理手段とは、前記第１のプログラムの呼び出しに関する情報から解析要求で出力対象に指定された情報を取得し、該取得した情報を出力することを特徴とする請求項１乃至６のいずれかに記載の情報処理装置。
【請求項８】
非リアルタイムに実行する情報は、データ構造上、記憶領域の解放を抑止させる設定項目を有する情報であり、
前記第１の処理手段は、非リアルタイムに解析する情報の記憶領域の解放を抑止した後、前記第２の処理手段に非リアルタイムに解析する情報の解析依頼を行うことを特徴とする請求項１乃至７のいずれかに記載の情報処理装置。
【請求項９】
前記解析管理手段は、前記第１の手法と前記第２の手法のうちの応答時間が短い方の手法の処理が記述された第３のプログラムを生成し、前記第２のプログラム内の前記第１のプログラムの呼び出し命令を、前記第３のプログラムの呼び出し命令に変更することを特徴とする請求項１乃至８のいずれかに記載の情報処理装置。
【請求項１０】
コンピュータに、
第１のプログラムの呼び出しに関する情報の解析要求に基づき、該解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する第１の手法と、該解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、非リアルタイムに解析する情報以外の情報の解析をリアルタイムに実行する第２の手法とのうち、前記第１のプログラムの呼び出しが行われたときの呼び出し元への応答時間が短い方の手法を判定し、
前記第１の手法の方が応答時間が短い場合、前記第１のプログラムの呼び出し命令が記述された第２のプログラムの実行過程における該呼び出し命令の実行時に、解析要求で指定された情報のすべての情報の解析、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、第１の処理手段にリアルタイムに実行させ、前記第２の手法の方が応答時間が短い場合、前記第２のプログラムの実行過程における前記呼び出し命令の実行時に、解析要求で指定された情報のうちの非リアルタイムに解析する情報以外の情報の解析、非リアルタイムに解析する情報の第２の処理手段への解析依頼、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、前記第１の処理手段にリアルタイムに実行させ、非リアルタイムに解析する情報の解析を、前記第２の処理手段に非リアルタイムに実行させる、
処理を実行させることを特徴とするプログラム。
【請求項１１】
コンピュータが、
第１のプログラムの呼び出しに関する情報の解析要求に基づき、該解析要求で解析対象に指定された情報のすべての解析をリアルタイムに実行する第１の手法と、該解析要求で指定された情報のうちの一部の情報の解析を非リアルタイムに実行し、非リアルタイムに解析する情報以外の情報の解析をリアルタイムに実行する第２の手法とのうち、前記第１のプログラムの呼び出しが行われたときの呼び出し元への応答時間が短い方の手法を判定し、
前記第１の手法の方が応答時間が短い場合、前記第１のプログラムの呼び出し命令が記述された第２のプログラムの実行過程における該呼び出し命令の実行時に、解析要求で指定された情報のすべての情報の解析、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、第１の処理手段にリアルタイムに実行させ、前記第２の手法の方が応答時間が短い場合、前記第２のプログラムの実行過程における前記呼び出し命令の実行時に、解析要求で指定された情報のうちの非リアルタイムに解析する情報以外の情報の解析、非リアルタイムに解析する情報の第２の処理手段への解析依頼、前記第１のプログラムの処理の実行、および呼び出しに対する応答を、前記第１の処理手段にリアルタイムに実行させ、非リアルタイムに解析する情報の解析を、前記第２の処理手段に非リアルタイムに実行させる、
ことを特徴とする解析方法。
【手続補正３】
【補正対象書類名】図面
【補正対象項目名】図２３
【補正方法】変更
【補正の内容】
【図２３】
2012131933.tif 000034
【手続補正４】
【補正対象書類名】図面
【補正対象項目名】図２７
【補正方法】変更
【補正の内容】
【図２７】
2012131933.tif 000035
【国際調査報告】
2012131933.tif 000036
2012131933.tif 000037