(57)【要約】【課題】プログラムトレースの対象箇所をコンパイル時に決定することなく、アプリケーション内の関数のトレースログを、ＯＳのトレースログに含め、アプリケーション内の関数のトレースログとＯＳのトレースログを一元的に管理できるようにする。【解決手段】アプリケーション１に含まれるいずれかの関数が実行される際に、アプリ関数アドレス・引数取得部８が、実行対象の関数のプロセス空間上のアドレスを取得する。システムコール発行部９は、アプリ関数アドレス・引数取得部８により取得されたプロセス空間上のアドレスが設定された、通常のシステムコールとは異なる特殊システムコールをＯＳ２に発行する。トレース部１１は、特殊システムコールを含む、ＯＳ２に関するイベントのトレースログを生成する。【選択図】図１
2014041419.tif 000002
【特許請求の範囲】
【請求項１】
ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）と、前記ＯＳ上で動作する、関数が１つ以上含まれるアプリケーションプログラムとが実装されている情報処理装置であって、
前記アプリケーションプログラムに含まれるいずれかの関数が実行される際に、実行対象の関数のプロセス空間上のアドレスを取得する関数アドレス取得部と、
前記関数アドレス取得部により取得されたプロセス空間上のアドレスが設定された、通常のシステムコールとは異なる特殊システムコールを前記ＯＳに発行するシステムコール発行部と、
前記特殊システムコールを含む、前記ＯＳに関するイベントのトレースログを生成するトレースログ生成部とを有することを特徴とする情報処理装置。
【請求項２】
前記トレースログ生成部は、
前記特殊システムコールに対して、前記関数アドレス取得部により取得されたプロセス空間上のアドレスが記述されるトレースログを生成し、
前記情報処理装置は、更に、
前記アプリケーションプログラムに含まれる各関数のプロセス空間上のアドレスの範囲を導出する関数アドレス導出部と、
前記トレースログ生成部により生成されたトレースログの中から前記特殊システムコールのトレースログを抽出し、抽出した前記特殊システムコールのトレースログに記述されているプロセス空間上のアドレスに対して、前記関数アドレス導出部により導出された各関数のプロセス空間上のアドレスの範囲を照合して、前記特殊システムコールのトレースログに記述されているプロセス空間上のアドレスに対応する関数の関数名を判定する関数判定部と、
前記関数判定部により判定された関数名を出力する出力部とを有することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記関数アドレス取得部は、
前記アプリケーションプログラムに含まれるいずれかの関数が実行される際に、実行対象の関数のプロセス空間上のアドレスを取得するとともに、実行対象の関数の引数を取得し、
前記システムコール発行部は、
前記関数アドレス取得部により取得されたプロセス空間上のアドレスと引数とが設定された特殊システムコールを前記ＯＳに発行し、
前記トレースログ生成部は、
前記特殊システムコールに対して、前記関数アドレス取得部により取得されたプロセス空間上のアドレスと引数とが記述されるトレースログを生成し、
前記出力部は、
前記関数判定部により判定された関数名を出力するとともに、前記特殊システムコールのトレースログに記述されている引数を出力することを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記出力部は、
前記トレースログ生成部により生成されたトレースログのうち前記特殊システムコールのトレースログ以外のトレースログを、前記ＯＳで発生したイベントのトレースログとして出力することを特徴とする請求項２又は３に記載の情報処理装置。
【請求項５】
前記システムコール発行部は、
前記関数アドレス取得部により取得されたプロセス空間上のアドレスが設定された、エラーとして取り扱われるシステムコールを、前記特殊システムコールとして発行することを特徴とする請求項１〜４のいずれかに記載の情報処理装置。
【請求項６】
前記情報処理装置は、更に、
前記アプリケーションプログラムに含まれる関数ごとに、関数が実行される際に、実行対象の関数に対して、前記関数アドレス取得部を動作させるか否かを判定する動作判定部を有することを特徴とする請求項１〜５のいずれかに記載の情報処理装置。
【請求項７】
前記関数アドレス取得部と前記システムコール発行部が、前記アプリケーションプログラムと動的にリンクされる共有ライブラリに含まれ、
前記トレースログ生成部が、前記ＯＳに含まれていることを特徴とする請求項１〜６のいずれかに記載の情報処理装置。
【請求項８】
ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）と、前記ＯＳ上で動作する、関数が１つ以上含まれるアプリケーションプログラムとが実装されているコンピュータが行う情報処理方法であって、
前記アプリケーションプログラムに含まれるいずれかの関数が実行される際に、実行対象の関数のプロセス空間上のアドレスを取得する関数アドレス取得ステップと、
前記関数アドレス取得ステップにより取得されたプロセス空間上のアドレスが設定された、通常のシステムコールとは異なる特殊システムコールを前記ＯＳに発行するシステムコール発行ステップと、
前記特殊システムコールを含む、前記ＯＳに関するイベントのトレースログを生成するトレースログ生成ステップとを有することを特徴とする情報処理方法。
【請求項９】
ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）と、前記ＯＳ上で動作する、関数が１つ以上含まれるアプリケーションプログラムとが実装されているコンピュータに、
前記アプリケーションプログラムに含まれるいずれかの関数が実行される際に、実行対象の関数のプロセス空間上のアドレスを取得する関数アドレス取得ステップと、
前記関数アドレス取得ステップにより取得されたプロセス空間上のアドレスが設定された、通常のシステムコールとは異なる特殊システムコールを前記ＯＳに発行するシステムコール発行ステップと、
前記特殊システムコールを含む、前記ＯＳに関するイベントのトレースログを生成するトレースログ生成ステップとを実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムトレースに関する。
【背景技術】
【０００２】
プログラムの動作を解析するためのプログラムトレースという手法がある。
プログラムトレースでは、プログラム実行時に特定関数が呼び出されたこと、特定の値が変更されたこと、特定の処理経路を通過したことなどをトレースログとして残し、ソフトウェアの動作を外部より把握するための仕組みである。
【０００３】
プログラムトレースを利用してトレースログを取得する際、プログラムのソースコードにトレースコードを埋め込む、または、あらかじめトレースコードが埋め込まれたプログラムに対してトレースＯＮ／ＯＦＦフラグを設定するなどして、プログラムをコンパイルした後、動作させるという手間があった。
また、オペレーティングシステム（ＯＳ）と、ＯＳ上で動作するアプリケーションプログラム（以下、「アプリケーション」又は「アプリ」ともいう）で構成される情報処理装置の場合、ＯＳは複数のアプリケーションを並行に動作させるため、現在どのアプリケーションが動作しているかは把握できるものの、アプリケーション内部の動作状況、すなわち関数の呼び出し状況や、関数内データのやり取り状況を把握することができなかった。
このため、トレースについては、ＯＳの動作状況を知りたい場合は、ＯＳ用トレースを、アプリケーションの動作状況を知りたい場合には、アプリケーション用トレースを、と別々のトレースを用いる必要があったため、情報処置装置全体での動作把握に時間を要していた。
【０００４】
特許文献１では、トレースしたい箇所に予め特定のメモリをアクセスする命令を埋め込んでおき、アクセスしようとしたプログラムの実行アドレスからシステムコールを特定すると共に、システムコールの引数を取得してトレースデータに蓄積する手法が記載されている。
【０００５】
特許文献２では、コンパイラを起動する際にトレース機能がオンになっていると、関数呼び出し命令を検索してトレース情報出力関数に置き換える手法が記載されている。
【０００６】
特許文献３では、トレース対象の関数がコールされると、フックされたログ取得コードが呼び出され、トレース対象の関数名、引数をメモリに保存した後、本来の関数をコールする手法が記載されている。
【０００７】
特許文献４では、トレース要否フラグを設け、トレース要の場合はユーザモードから出力されるトレース情報は、ユーザ側出力代行部を経由して、カーネルトレースバッファに出力する手法が記載されている。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００２−１４９４４４号公報
【特許文献２】特開平４−２８７１３４号公報
【特許文献３】特開２００４−３８３１１号公報
【特許文献４】特開２００７−３２８５９７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
従来の手法では、トレースする箇所をコンパイル時に決定し、予めトレース情報を取得するコードを埋めておく必要があった。
特許文献１では、トレースしたい箇所に、予め、メモリをアクセスする命令を埋め込んでおく必要があった。
特許文献２では、コンパイル時に関数呼び出し命令を検索してトレース情報を取得するコードを埋めておく必要があった。
また、従来の手法では、トレース情報はＯＳとアプリケーション双方で取得する必要があった。
特許文献２および特許文献３は、取得可能なのはアプリケーション用のトレースのみであった。
また、特許文献４では、ユーザ側トレース情報とカーネルトレース情報を一体に出力するものであるが、ユーザ側にもトレースを記録しておく領域を設ける必要があった。
【００１０】
この発明は、上記のような問題点を解決することを主な目的としており、トレースする箇所をコンパイル時に決定することなく、アプリケーション内の関数のトレースログを、ＯＳのトレースログに含め、アプリケーション内の関数のトレースログとＯＳのトレースログを一元的に管理できるようにすることを主な目的としている。
【課題を解決するための手段】
【００１１】
本発明に係る情報処理装置は、
ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）と、前記ＯＳ上で動作する、関数が１つ以上含まれるアプリケーションプログラムとが実装されている情報処理装置であって、
前記アプリケーションプログラムに含まれるいずれかの関数が実行される際に、実行対象の関数のプロセス空間上のアドレスを取得する関数アドレス取得部と、
前記関数アドレス取得部により取得されたプロセス空間上のアドレスが設定された、通常のシステムコールとは異なる特殊システムコールを前記ＯＳに発行するシステムコール発行部と、
前記特殊システムコールを含む、前記ＯＳに関するイベントのトレースログを生成するトレースログ生成部とを有することを特徴とする。
【発明の効果】
【００１２】
本発明によれば、アプリケーションプログラムの関数が実行される際に、当該関数のプロセス空間上のアドレスが設定された特殊システムコールがＯＳに発行され、特殊システムコールを含むＯＳに関するイベントのトレースログが生成される。
このため、トレースする箇所をコンパイル時に決定する必要がない。
また、ＯＳのトレースログに、アプリケーションプログラムの関数のトレースログを含ませることができ、アプリケーションプログラムの関数のトレースログとＯＳのトレースログを一元的に管理することができる。
【図面の簡単な説明】
【００１３】
【図１】実施の形態１に係る情報処理装置の構成例を示す図。
【図２】実施の形態１に係るトレース方式を示すフローチャート図。
【図３】実施の形態１に係る共有ライブラリの動作例を示すフローチャート図。
【図４】実施の形態１に係るトレース解析部の動作例を示すフローチャート図。
【発明を実施するための形態】
【００１４】
実施の形態１．
図１は、本実施の形態に係る情報処理装置１００の構成図である。
【００１５】
図１において、情報処理装置１００は、ハードウェア資源として、プロセッサ１０１、メモリ１０２、二次記憶装置１０３、入力装置１０４及び出力装置１０５を備える。
また、情報処理装置１００には、ソフトウェアとして、アプリケーション１と、オペレーティングシステム２と、共有ライブラリ３と、トレース解析部４が実装されている。
これらソフトウェアは、通常は二次記憶装置１０３に格納されており、実行に際して、プログラムコードが順次メモリ１０２にロードされ、プロセッサ１０１により読みこまれ、実行される。
【００１６】
アプリケーション１は複数配置されていてもよい。
アプリケーション１は、アプリケーション１とはプログラムファイルとしては別になった、共有ライブラリ３を介して、ＯＳ２のサービスをシステムコールという形式で呼び出す。
アプリケーション１には、１つ以上の関数が含まれている。
【００１７】
共有ライブラリ３は、アプリケーション１とは別のファイルで構成されているため、共有ライブラリ３内の関数をアプリケーション１が呼び出すためにアプリケーション１の起動時に、アプリケーション１にて必要としている共有ライブラリ３内の関数との結合（動的リンク）が実施される。
また、本情報処理装置１００では、トレースログを解析するためのトレース解析部４が存在する。
【００１８】
アプリケーション１には、コンパイル時のオプションにてアプリケーション１内の各関数から呼び出される関数フック部５が存在する。
関数フック部５は、ｇｃｃ（ＧＮＵ  Ｃｏｍｐｉｌｅｒ）の−ｐｇオプションのように、コンパイラによって、全関数の先頭で、特定の関数を呼び出すコードが埋め込まれる。
なお、本関数フック部５はトレース機能にのみ存在するのではなく、プロファイラなどの性能解析など一般的に使用されている機能である。
【００１９】
共有ライブラリ３において、関数フック機能処理部６は、アプリケーション１との動的リンク時に呼び出される。
【００２０】
開始・終了部７は、関数フック部５から呼び出され、トレースを実施すべきか否かを決定する。
つまり、開始・終了部７は、アプリケーション１に含まれる関数ごとに、関数が実行される際に、実行対象の関数に対して、後述のアプリ関数アドレス・引数取得部８を動作させるか否かを判定する。
開始・終了部７は、動作判定部の例に相当する。
【００２１】
アプリ関数アドレス・引数取得部８は、関数フック部５を呼び出した関数（実行対象の関数）のアドレス（プロセス空間上のアドレス）および関数の引数を取得する。
アプリ関数アドレス・引数取得部８は、関数アドレス取得部の例に相当する。
【００２２】
システムコール発行部９は、ＯＳ２のサービスを呼び出す。
【００２３】
ＯＳ２には、共有ライブラリ３からのシステムコールを処理するシステムコール処理部１０と、システムコールが呼び出されたことを記録するトレース部１１が存在する。
トレース部１１は、特殊システムコールを含む、ＯＳ２に関するイベントのトレースログを生成する。
特殊システムコールは、通常のシステムコールとは異なるシステムコールであり、例えば、明示的にエラーとなるシステムコールである。
トレース部１１は、特殊システムコールに対して、アプリ関数アドレス・引数取得部８により取得されたプロセス空間上のアドレスが記述されるＯＳトレースログ情報を生成する。
なお、トレース部１１がＯＳイベントの発生の度に生成した個々のログをトレースログといい、一定期間分のトレースログが集約された情報をＯＳトレースログ情報という。
なお、トレース部１１は、トレースログ生成部の例に相当する。
【００２４】
トレース解析部４において、アプリ関数アドレス抽出部１２は、アプリケーション１のプログラムファイルを元に、アプリケーション１内の関数の先頭アドレスと関数のコードサイズ情報を取得する。
【００２５】
トレースログ収集部１３は、トレース部１１によって記録されたＯＳトレースログ情報を取得する。
【００２６】
トレースログ・アプリ関数／引数変換部１４は、トレースログ収集部１３から得られたＯＳトレースログ情報とアプリ関数アドレス抽出部１２から得られたアプリケーション内関数情報を元に、ＯＳトレースログ情報内に記録されている、システムコール発行部９が実施したシステムコールトレースを、アプリケーション関数および関数引数情報に変換する。
前述のように、特殊システムコールのトレースログでは、アプリ関数アドレス・引数取得部８により取得されたプロセス空間上のアドレスが記述されている。
トレースログ・アプリ関数／引数変換部１４は、ＯＳトレースログ情報の中から特殊システムコールのトレースログを抽出する。
また、トレースログ・アプリ関数／引数変換部１４は、アプリ関数アドレス抽出部１２により取得された関数の先頭アドレスと関数のコードサイズ情報から、アプリケーション１に含まれる各関数のプロセス空間上のアドレスの範囲を導出する。
そして、トレースログ・アプリ関数／引数変換部１４は、抽出した特殊システムコールのトレースログに記述されているプロセス空間上のアドレスに対して、アプリケーション１に含まれる各関数のプロセス空間上のアドレスの範囲を照合して、特殊システムコールのトレースログに記述されているプロセス空間上のアドレスに対応する関数の関数名を判定する。
更に、トレースログ・アプリ関数／引数変換部１４は、判定した関数名を出力する。
トレースログ・アプリ関数／引数変換部１４は、関数アドレス導出部と関数判定部と出力部の例に相当する。
【００２７】
次に、図２を用いて本実施の形態に係る情報処理装置１００のトレース方式の全体の動作を説明する。
【００２８】
まず、Ｓ１０１にて、アプリケーション１が起動する。
アプリケーション１の起動は、ＯＳ２の処理にて実施され、この時、共有ライブラリ３とアプリケーション１の動的リンクが実施される（Ｓ１０２）。
この動的リンクの際、共有ライブラリ３の関数フック機能処理部６は、関数フック部５が、共有ライブラリ３の開始・終了部７を呼び出すように関数フック部５のコードを書き換える。
この書き換えについては、直接呼び出すコードを埋め込む方式や、予め関数フック部５内に関数ポインタを配置し、関数ポインタに値が入っている場合、その関数ポインタが示すアドレスを呼び出すようにしておき、関数フック機能処理部６は、その関数ポインタに、開始・終了部７のアドレスを設定するようにしてもよい。
これにより、アプリケーション１内の各関数が関数フック部５を呼び出す際、一緒に共有ライブラリの開始・終了部７が呼び出される。
【００２９】
Ｓ１０２において共有ライブラリとの動的リンクがなされると、アプリケーション１は本格的に動作を開始し、ｍａｉｎ（）関数が呼び出され、それに伴い、各関数が実行される（Ｓ１０３）。
各関数が実行されると、各関数の先頭で関数フック部５が呼び出され、それに伴い、共有ライブラリ３の開始・終了部７が呼び出され、アプリ関数アドレス・引数取得部８およびシステムコール発行部９を介して、特殊システムコールが発行される。
本実施の形態では、特殊システムコールは、明示的にエラーとなるシステムコールとする。
この時、システムコールの引数に、アプリ関数アドレス・引数取得部８にて取得した関数フック部５を呼び出した関数のアドレス（プロセス空間上のアドレス）と関数の引数が設定される。
そしてシステムコール処理部１０にて、トレース部１１が呼び出されることによりトレースログである関数トレースが記録される（Ｓ１０４）。
トレース部１１には、ＯＳ２内の他のイベント（ファイル書き込み、割込み発生、コンテキストスイッチ等）の記録とともにシステムコールトレース情報としての関数トレース情報が記録される。
そしてアプリケーション１の動作が終了（Ｓ１０５）した後、トレース解析部４のトレースログ収集部１３によって、トレース部１１が記録したＯＳトレースログ情報が取得される（Ｓ１０６）。
この時、ＯＳトレースログ情報には、アプリケーション１の関数トレース情報はシステムコールトレース情報としてしか記録されていない。
つまり、ＯＳトレースログ情報のシステムコールトレース情報単体では、アプリケーション１で実行された関数の関数名は明らかでない。
【００３０】
次に、Ｓ１０７にてトレース解析部４は、ＯＳトレースログ情報の解析を行う。
トレース解析部４では、まず、アプリ関数アドレス抽出部１２が、アプリケーション１内の各関数のアドレス情報と、その関数のサイズを取得する。
そして、トレースログ・アプリ関数／引数変換部１４が、ＯＳトレースログ情報の時刻毎のトレース情報（トレースログ）を解析し、明示的にエラーとなっているシステムコールトレース情報については、システムコールトレース情報の引数情報から、アプリケーション１内の関数アドレスを抽出する。
更に、トレースログ・アプリ関数／引数変換部１４は、システムコールトレース情報から抽出した関数のアドレスと、アプリ関数アドレス抽出部１２が抽出したアプリケーション１内の関数情報と照合を行い、システムコールトレース情報にある関数アドレスが関数情報と合致した場合、その関数から呼び出されたと判断し、関数名を出力すると共に、同じくシステムコールトレース情報に記録された関数の引数情報を抽出し、引数情報を出力する。
Ｓ１０７にて、ＯＳトレースログ情報を解析している際、システムコールトレース以外のトレースログや、システムコールトレースでもエラーになっていないもの、または、システムコールトレースでエラーになっているものの、システムコールトレースに付随する引数に格納された関数アドレス情報がアプリケーション１内の関数情報と合致していない場合は、トレースログ・アプリ関数／引数変換部１４は、ＯＳトレース情報であると判断し、ＯＳトレース情報を出力する。
以上が本トレース方式における全体の動作である。
【００３１】
次に図３を用いて、関数フック部５から呼び出される共有ライブラリ３の動作の詳細を説明する。
【００３２】
関数フック部５から呼び出されると、共有ライブラリ３では開始・終了部７が、トレースをすべきか否かを判断する（Ｓ１１０）。
トレースすべきか否かは、共有ライブラリ３内の外部変数に、トレース実施の値を設定し、それを開始・終了部７で判断する方法や、開始・終了部７にて、システムコールを発行し、ＯＳ２のトレース部１１が動作している場合は、トレースを実施すると判断する方法が考えられる。
トレース開始・終了部７にて、トレースをしないと判断した場合（Ｓ１１０でＮＯ）は、共有ライブラリ３の動作を終了する。
【００３３】
Ｓ１１０にて開始・終了部７がトレースを実施すべきと判断した場合（Ｓ１１０でＹＥＳ）は、アプリ関数アドレス・引数取得部８に制御が移り、アプリ関数アドレス・引数取得部８では、関数フック部５を呼び出した関数のアドレスと、関数の引数の情報を取得する（Ｓ１１１）。
関数のアドレス情報については、関数が関数フック部５を呼び出す際、サブルーチンコールにて呼び出しており、呼び出し元に返る際のアドレスをスタックに保存している。
さらに、関数の引数も、スタックにつまれており、関数フック部５が開始・終了部７を介して、アプリ関数アドレス・引数取得部８に至るまでの間も関数呼び出しの形式で実施されている。
このため、アプリ関数アドレス・引数取得部８実行時のスタックポインタの内容を元に、スタックを逆算していくことで、関数フック部５を呼び出した関数の呼出し後に実施されるアドレス（関数先頭アドレスから関数先頭アドレス＋関数サイズ内のいずれかのアドレス）と、関数の引数の内容を取得することができる。
【００３４】
Ｓ１１１にて関数アドレス・引数が取得されると、システムコール発行部９に制御が移り、関数アドレス・引数をシステムコールの引数に設定する処理が実施される（Ｓ１１２）。
そして、Ｓ１１３にてシステムコール発行部９は、明示的にエラーとなるシステムコールを発行する。
明示的にエラーとなるシステムコールを発行することで、ＯＳ２の内部動作に影響を与えずに、トレース部１１には、システムコールのトレース情報が記録される。
明示的にエラーとなるシステムコールについては、可能な限りシステムコールの入口でエラー判断され、かつ、呼び出される頻度が少なく、かつ、通常のプログラミングでは設定されないエラーを設定するのがよい。
また、システムコールの引数についても、アプリケーション内関数の引数を格納する個数を多く取ることができるため、引数の個数が多いほうがよい。
例えば、Ｌｉｎｕｘ（登録商標）ＯＳにおいては、ｍｍａｐ＿ｐｇｏｆｆ（）システムコールや、ｓｐｌｉｃｅ（）システムコールなどを用い、ｍｍａｐ＿ｐｇｏｆｆ（）システムコールの引数ｆｌａｇｓに負値を入れたり（通常は正値しか持たない）、ｓｐｌｉｃｅ（）システムコールの引数ｆｄ＿ｉｎに負値（通常は正値しか持たない）を入れ、他の引数に関数アドレスや関数の引数を設定し、システムコールを発行することが考えられる。
以上が本トレース方式における共有ライブラリ３の動作である。
【００３５】
次に図４を用いてトレース解析部４の動作を説明する。
【００３６】
トレース解析部４は、まず、Ｓ１２０にて、トレースログ収集部１３が動作し、ＯＳ２のトレース部１１が記録しているＯＳトレースログ情報を収集する。
本ＯＳトレースログ情報には、トレース開始からトレース終了までに入った、様々なＯＳ内イベントの情報が時系列に記録されており、共有ライブラリ３のシステムコール発行部９が実施した明示的にエラーとなるシステムコールの発行も、システムコールイベントのトレースログとして記録されている。
【００３７】
次にトレース解析部４では、アプリ関数アドレス抽出部１２が、アプリケーション１のプログラムファイルから、アプリケーション１内の各関数のアドレス情報を抽出する（Ｓ１２１）。
アプリケーション１のプログラムファイルには、アプリケーション１のコードおよびデータが格納されているとともに、コード・データ内にある関数や変数の、アプリケーション１起動時の位置（アドレス）情報が入っている。
この情報については、アプリケーション１起動時に、アプリケーション１が動作するメモリには格納されないものの、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｃ  Ｄｒｉｖｅ）などの二次記憶装置に入っているプログラムファイル内には保存されている。
例えば、Ｌｉｎｕｘ（登録商標）ＯＳにてアプリケーションとして起動可能なＥＬＦフォーマットのプログラムファイルの場合、「．ｓｙｍｔａｂ」と呼ばれるシンボルテーブル領域には、関数名と、その関数のメモリ上の先頭アドレスと、その関数のサイズが記録されている。
アプリ関数アドレス抽出部１２は、この情報を読み取り、関数名と、その関数の先頭アドレスおよびサイズを抽出する。
次にトレース解析部４では、トレースログ・アプリ関数／引数変換部１４が、ＯＳトレースログ情報について、記録されているＯＳ内イベントを１つ１つ、以下のように解析していく。
【００３８】
まず、Ｓ１２２にて、記録されているＯＳ内イベントがシステムコールイベントで、かつ、システムコールがエラーとなっているか確認する。
もし、システムコールイベントでない、または、システムコールイベントであっても、システムコールエラーとなっていない場合（Ｓ１２２でＮＯ）は、ＯＳトレース情報と判断し、トレースログ・アプリ関数／引数変換部１４は、Ｓ１２３にてＯＳトレースとしての出力を行う。
更に、トレースログ・アプリ関数／引数変換部１４は、解析したイベントがＯＳトレースログ情報の最後のものであるか判断し（Ｓ１２４）、最後であれば終了し（Ｓ１２４でＹＥＳ）、最後でなければ（Ｓ１２４でＮＯ）、Ｓ１２２に戻る。
【００３９】
Ｓ１２２にて、システムコールイベントで、かつ、システムコールがエラーとなっている場合（Ｓ１２２でＹＥＳ）は、トレースログ・アプリ関数／引数変換部１４は、Ｓ１２５にて、システムコールイベントのトレースログに記録されている引数内にあるアドレス情報が、アプリ関数アドレス抽出部１２が抽出したアプリケーション１の関数アドレス情報と合致するか照合を行う。
これは、アプリ関数アドレス抽出部１２が抽出した関数の先頭アドレスと関数サイズの情報から、
（関数の先頭アドレス）≦（システムコールトレースに記録されたアドレス）
≦（関数の先頭アドレス）＋（関数のサイズ）
を満たしているかで判断される。
なお、上記の式で示される「アドレス」は、すべてプロセス空間上のアドレスである。
【００４０】
Ｓ１２６にて合致した関数が存在しない場合（Ｓ１２６のＮｏ）、トレースログ・アプリ関数／引数変換部１４は、通常のシステムコールトレースイベントと判断し、Ｓ１２３にてＯＳトレース情報として出力する。
以降は、Ｓ１２２でＮＯであった場合と同じである。
【００４１】
Ｓ１２６にて、システムコールイベントに記録されている関数アドレス情報が、アプリ関数アドレス抽出部１２が抽出したアプリケーション１の関数アドレス情報と合致している場合（Ｓ１２６でＹＥＳ）は、トレースログ・アプリ関数／引数変換部１４は、Ｓ１２７にてＯＳトレースログにシステムコールイベントと一緒に記録されている、システムコールの引数の情報から、関数の引数情報を抽出する。
ここでは、共有ライブラリ３にて、アプリ関数アドレス・引数取得部８がスタックから抽出した引数を、システムコール発行部９が明示的にエラーとなるシステムコールの引数として埋め込んだものが抽出される。
次に、トレースログ・アプリ関数／引数変換部１４は、抽出された関数情報を元に、関数名を出力するとともに、Ｓ１２７で抽出された関数の引数を出力する。
そして、Ｓ１２４にて、解析したイベントがＯＳトレースログ情報の最後のものであるか判断し（Ｓ１２４）、最後であれば終了し（Ｓ１２４のＹｅｓ）、最後でなければ（Ｓ１２４のＮｏ）、Ｓ１２２に戻る。
以上が、トレース解析部４の動作である。
【００４２】
以上のように、本トレース方式では、アプリケーション１の様々な関数から呼び出される関数フック部５に、共有ライブラリ内の開始・終了部７を結合し、関数フック部５から開始・終了部７が呼び出されると、トレースを実施すべきか否かを判断する。
そして、トレースを実施する場合は、関数フック部５を呼び出した関数のアドレスと、関数の引数を抽出し、それをシステムコールの引数として格納するとともに、明示的にエラーとなるシステムコールを発行する。
更に、アプリケーションの終了後のＯＳトレースログ情報から、システムコールイベントでかつエラーとなっているシステムコールイベントに対し、アプリケーションのプログラムファイルから抽出したアプリケーションの関数アドレス情報と、システムコールイベントに付随する関数の引数情報を抽出し、関数名と引数を出力する。
以上の手順により、アプリケーション内のトレースする箇所をコンパイル時に決定することなく、アプリケーション内の関数トレース情報を、ＯＳトレース情報に含め、一緒に保存することができる。
【００４３】
このように、本実施の形態では、プログラムの動作を解析するトレース方式において、以下の手段を備えたトレース方式を説明した。
（ａ）アプリケーションの各関数から呼び出される関数フック部と、共有ライブラリ内のトレース機能とを、アプリケーション起動時に結合する、関数フック機能処理部
（ｂ）上記共有ライブラリ内のトレース機能に以下の手段を備える。
（ア）関数フック部を呼び出した関数のアドレスを抽出するアプリ関数アドレス取得部
（イ）アプリ関数アドレス取得部が取得した関数アドレスをシステムコールの引数として設定し、明示的にエラーとなるシステムコールを発行する、システムコール発行部
（ｃ）以下の機能を備えたトレース解析部
（ア）アプリケーションのプログラムファイルからアプリケーション内の関数の先頭アドレスと関数のサイズを抽出するアプリ関数アドレス抽出部
（イ）ＯＳのトレース機能によって記録されたＯＳトレースログ情報から、システムコールイベントにて、かつ、システムコールがエラーとなったトレース情報について、そのトレース情報にシステムコールの引数として記録されている関数アドレス情報と、アプリ関数アドレス抽出部が抽出した関数の先頭アドレスおよび関数のサイズを照合し、該当関数がみつかった場合に、アプリ関数アドレス抽出部が抽出した関数名の情報を出力する、トレースログ・アプリ関数変換部
【００４４】
また、上記の構成に加えて、共有ライブラリに、トレースを実施するか否かを判断する開始・終了部を備えるトレース方式を説明した。
【００４５】
また、本実施の形態では、プログラムの動作を解析するトレース方式において、以下の手段を備えたトレース方式を説明した。
（ａ）アプリケーションの各関数から呼び出される関数フック部と、共有ライブラリ内のトレース機能とを、アプリケーション起動時に結合する、関数フック機能処理部
（ｂ）上記共有ライブラリ内のトレース機能に以下の手段を備える。
（ア）トレースを実施するか否かを判断する開始・終了部
（イ）関数フック部を呼び出した関数のアドレスと関数の引数を抽出するアプリ関数アドレス・引数取得部
（ウ）アプリ関数アドレス・引数取得部が取得した関数アドレスおよび引数をシステムコールの引数として設定し、明示的にエラーとなるシステムコールを発行する、システムコール発行部
（ｃ）以下の機能を備えたトレース解析部
（ア）アプリケーションのプログラムファイルからアプリケーション内の関数の先頭アドレスと関数のサイズを抽出するアプリ関数アドレス抽出部
（イ）ＯＳのトレース機能によって記録されたＯＳトレースログ情報から、システムコールイベントにて、かつ、システムコールがエラーとなったトレース情報について、そのトレース情報にシステムコールの引数として記録されている関数アドレス情報と、アプリ関数アドレス抽出部が抽出した関数の先頭アドレスおよび関数のサイズを照合し、該当関数がみつかった場合に、アプリ関数アドレス抽出部が抽出した関数名と、トレース情報にシステムコールの引数として記録されている関数引数の情報を出力する、トレースログ・アプリ関数／引数変換部
【００４６】
最後に、本実施の形態に示した情報処理装置１００のハードウェア構成例を図１を参照して説明する。
【００４７】
プロセッサ１０１は、プログラムを実行するＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。
プロセッサ１０１は、プログラムである、アプリケーション１、オペレーティングシステム２、共有ライブラリ３、トレース解析部４を実行する。
メモリ１０２は、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。
二次記憶装置１０３は、例えばＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）やフラッシュメモリ、ハードディスク装置である。
入力装置１０４は、例えばマウス、キーボードである。
出力装置１０５は、例えばディスプレイ装置である。
【００４８】
また、本実施の形態の説明において、「〜の判断」、「〜の判定」、「〜の取得」、「〜の抽出」、「〜の導出」、「〜の照合」、「〜の設定」、「〜の登録」、「〜の選択」、「〜の生成」、「〜の入力」、「〜の出力」等として説明している処理の結果を示す情報やデータや信号値や変数値がメモリ１０２にファイルとして記憶されている。
【００４９】
なお、図１の構成は、あくまでも情報処理装置１００のハードウェア構成の一例を示すものであり、情報処理装置１００のハードウェア構成は図１に記載の構成に限らず、他の構成であってもよい。
【００５０】
また、本実施の形態に示す手順により、本発明に係る情報処理方法を実現可能である。
【符号の説明】
【００５１】
１  アプリケーション、２  ＯＳ、３  共有ライブラリ、４  トレース解析部、５  関数フック部、６  関数フック機能処理部、７  開始・終了部、８  アプリ関数アドレス・引数取得部、９  システムコール発行部、１０  システムコール処理部、１１  トレース部、１２  アプリ関数アドレス抽出部、１３  トレースログ収集部、１４  トレースログ・アプリ関数／引数変換部、１００  情報処理装置、１０１  プロセッサ、１０２  メモリ、１０３  二次記憶装置、１０４  入力装置、１０５  出力装置。
【図１】
2014041419.tif 000003
【図２】
2014041419.tif 000004
【図３】
2014041419.tif 000005
【図４】
2014041419.tif 000006