(57)【特許請求の範囲】
【請求項１】
指定された共有ライブラリＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）の属する共有ライブラリを示す所属共有ライブラリをメモリのプロセス空間にマップし、マップされた前記所属共有ライブラリの先頭アドレスを保持し、マップされた前記所属共有ライブラリに属する前記指定に係る前記共有ライブラリＡＰＩに対応するジャンプ命令のジャンプ先アドレスを記録すると共に、記録した前記ジャンプ先アドレスを持つ前記ジャンプ命令をカーネル飛び込み用システムコールへジャンプする割込命令に書き換えるライブラリＡＰＩエントリ書換部と、
前記ライブラリＡＰＩエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールのエントリのジャンプ命令のジャンプ先アドレスを記録すると共に、前記ライブラリＡＰＩエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールの前記エントリに設定されている前記ジャンプ命令を、所定のジャンプ命令によって呼ばれることで所定の処理を実行する任意コード実行部への前記所定のジャンプ命令に書き換えるシステムコールエントリ書換部と
を備えたことを特徴とするエントリ書換装置。
【請求項２】
前記エントリ書換装置は、さらに、
共有ライブラリＡＰＩに対する所定の実行条件を記憶する実行条件記憶部と、
前記任意コード実行部であって、前記所定のジャンプ命令によって呼ばれることで、前記実行条件記憶部が記憶する前記実行条件に基づいて、前記所定の処理を実行する任意コード実行部と
を備えたことを特徴とする請求項１記載のエントリ書換装置。
【請求項３】
前記エントリ書換装置は、さらに、
所定の共有ライブラリＡＰＩに関する情報を記憶するシンボルテーブル記憶部を備え、
前記任意コード実行部は、
前記所定のジャンプ命令によって呼ばれた場合に、前記シンボルテーブル記憶部に記憶された情報を参照することによりどの前記共有ライブラリＡＰＩから呼び出されたのかを判別し、判別した前記共有ライブラリＡＰＩに対応する実行条件を前記実行条件記憶部から抽出し、抽出した前記共有ライブラリＡＰＩに対応する前記実行条件に基づいて、前記所定の処理を実行することを特徴とする請求項２記載のエントリ書換装置。
【請求項４】
前記任意コード実行部は、
判別した前記共有ライブラリＡＰＩに対応する実行条件を前記実行条件記憶部から抽出した場合に、抽出した前記共有ライブラリＡＰＩに対応する前記実行条件が呼び出された前記共有ライブラリＡＰＩの状態に合致するかどうかを判別し、合致すると判別した場合に、抽出した前記共有ライブラリＡＰＩに対応する前記実行条件に基づいて前記所定の処理を実行することを特徴とする請求項３記載のエントリ書換装置。
【請求項５】
前記エントリ書換装置は、さらに、
アプリケーションプロセスごとにシンボル名と前記シンボルの開始アドレスとが記載され、バックトレースの実行に使用される個別シンボルテーブルを記憶する個別シンボルテーブル記憶部と、
前記個別シンボルテーブル記憶部が記憶する前記個別シンボルテーブルを用いることにより、前記共有ライブラリＡＰＩがどの関数を経由して呼び出されたかを特定する処理を示すバックトレースを実行するバックトレース実行部と
を備えたことを特徴とする請求項４記載のエントリ書換装置。
【請求項６】
コンピュータを、
指定された共有ライブラリＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）の属する共有ライブラリを示す所属共有ライブラリをメモリのプロセス空間にマップし、マップされた前記所属共有ライブラリの先頭アドレスを保持し、マップされた前記所属共有ライブラリに属する前記指定に係る前記共有ライブラリＡＰＩに対応するジャンプ命令のジャンプ先アドレスを記録すると共に、記録した前記ジャンプ先アドレスを持つ前記ジャンプ命令をカーネル飛び込み用システムコールへジャンプする割込命令に書き換えるライブラリＡＰＩエントリ書換部、
前記ライブラリＡＰＩエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールのエントリのジャンプ命令のジャンプ先アドレスを記録すると共に、前記ライブラリＡＰＩエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールの前記エントリに設定されている前記ジャンプ命令を、所定のジャンプ命令によって呼ばれることで所定の処理を実行する任意コード実行部への前記所定のジャンプ命令に書き換えるシステムコールエントリ書換部、
として機能させるためのエントリ書換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、共有ライブラリＡＰＩのエントリと、カーネル飛び込み用システムコールのエントリとを書き換えるエントリ書換装置及びエントリ書換プログラムに関する。
【背景技術】
【０００２】
情報システムの検証・試験においては、情報システムを構成するプログラム群が、「各種ライブラリ群、及びＯＳ、ハードウェア」のエラーを含む各種動作に対して、設計通りに正しく動作するかを実際に動作させて検証し、正しく処理が行われているかを各種トレース情報を取得して検証する必要がある。しかし、検証を行う為に、「各種ライブラリ群、ＯＳ、ハードウェア」のエラーを模擬したり、トレース情報を取得したりするのは、一般に困難である。従来では、特許文献１、特許文献２に示すように、ＯＳやハードウェアのエラーを模擬する為に、特定のドライバインターフェース、もしくは、ＯＳのシステムコールをフックして、ＯＳやハードウェアのエラー情報を注入して模擬する手法がある（トレース情報の取得も同様の手法で可能）。
【０００３】
しかし、各種ライブラリ群のエラーを模擬したり、トレース情報を取得する為には、この手法は利用できない。これは、従来技術では、カーネル内（システムコール、ドライバインターフェース）に入ってからフックするので可能だったが、各種ライブラリはカーネル内ではなく、ユーザ空間にあるので、ユーザプログラムの改変なしには同様の手法が利用できないからでる。
【０００４】
また、特許文献３に示すように、各種ライブラリインターフェース群のエラーを模擬する為に、ライブラリのラッパ関数を用いて、エラー情報を注入して模擬する手法がある（トレース情報の取得も同様の手法で可能）。しかし、ラッパ関数を用いる為には、対象プログラムにラッパ関数のリンクを作成する必要、即ち、対象プログラムの改変が必要であり、情報システム内の全てのプログラムを改変する必要がある。この点で、第三者提供のプログラムにはこのような改変は適用できない。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−１０４４９０号公報、図２等
【特許文献２】特開２０００−２５９４４６号公報、図２等
【特許文献３】特開２００７−１３３５９０号公報、図６等
【発明の概要】
【発明が解決しようとする課題】
【０００６】
従来のシステムコールをフックしてＯＳやハードウェアのエラーを模擬する手法や、ライブラリのラッパ関数を用意して各種ライブラリ群のエラーを模擬する手法には、以下のような課題があった。
（１）各種ライブラリＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）群のエラーを模擬するには、対象プログラムを改変する必要があり、組合せ試験、システム試験での利用が困難であるし、改変が行えない第三者プログラムには適用できない。
（２）システムコールをフックする手法は、エラー注入などの任意のコードを実行する論理空間がカーネル空間３０に限られ、一方、各種ライブラリ群が動作する論理空間はプロセス空間（ユーザ空間）である。よって、各種ライブラリＡＰＩを同様にフックする手法が利用できない。敢えてフックしようとすると、予め任意コード実行用のコードを対象プログラムに埋め込む必要があり、これは、ラッパ関数を用いる場合と同様に対象プログラムを改変する必要がある。又は、カーネル空間３０で実行しようとすると、カーネル空間３０に飛び込む為に、フックしたい共有ライブラリＡＰＩの１つ１つに個別に対応する疑似システムコールをＯＳカーネル内に用意する必要があり、ＯＳカーネルの改変が必要になる。
【０００７】
本発明は、各種ライブラリＡＰＩをフックして任意のコードをカーネル空間内で実行できるような仕掛けをすることにより、対象となる情報システム内のＯＳカーネル及びプログラム群を改変せずに、エラー模擬やトレース情報の取得を可能とすることを目的とする。
【課題を解決するための手段】
【０００８】
この発明のエントリ書換装置は、
指定された共有ライブラリＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）の属する共有ライブラリを示す所属共有ライブラリをメモリのプロセス空間にマップし、マップされた前記所属共有ライブラリの先頭アドレスを保持し、マップされた前記所属共有ライブラリに属する前記指定に係る前記共有ライブラリＡＰＩに対応するジャンプ命令のジャンプ先アドレスを記録すると共に、記録した前記ジャンプ先アドレスを持つ前記ジャンプ命令をカーネル飛び込み用システムコールへジャンプする割込命令に書き換えるライブラリＡＰＩエントリ書換部と、
前記ライブラリＡＰＩエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールのエントリのジャンプ命令のジャンプ先アドレスを記録すると共に、前記ライブラリＡＰＩエントリ書換部が書き換えた割込命令に対応する前記カーネル飛び込み用システムコールの前記エントリに設定されている前記ジャンプ命令を、所定のジャンプ命令によって呼ばれることで所定の処理を実行する任意コード実行部への前記所定のジャンプ命令に書き換えるシステムコールエントリ書換部と
を備えたことを特徴とする。
【発明の効果】
【０００９】
本発明により、対象となる情報システム内のＯＳカーネル及びプログラム群を改変せずに、エラー模擬やトレース情報の取得が可能となる。
【図面の簡単な説明】
【００１０】
【図１】実施の形態１の対象計算機１０１のブロック図。
【図２】実施の形態１の対象計算機１０１の事前準備段階の動作フロー。
【図３】実施の形態１の対象計算機１０１の各要素のアクセス先を示す図。
【図４】実施の形態１の共有ライブラリシンボルテーブル３２−４を示す図。
【図５】実施の形態１の実行条件テーブル３２−３を示す図。
【図６】実施の形態１の共有ライブラリＡＰＩエントリ、ｒｅｂｏｏｔシステムコールエントリを示す図。
【図７】実施の形態１のエントリ保存テーブルを示す図。
【図８】実施の形態１の任意コード実行部３２−１の動作を示すフロー。
【図９】実施の形態１の対象計算機１０１の各要素のアクセス先を示す図。
【図１０】実施の形態１のＣＰＵレジスタを示す図。
【図１１】実施の形態１のプロセス空間の内訳を示す図。
【図１２】実施の形態２の対象計算機１０２のブロック図。
【図１３】実施の形態２のバックトレース実行部３２−５の動作概念を示す図。
【図１４】実施の形態２の共有ライブラリの呼ばれた経路を示す概念図。
【図１５】実施の形態２の共有ライブラリの呼ばれた経路を示す概念図。
【図１６】実施の形態２のバックトレース実行部３２−５の動作フロー。
【図１７】実施の形態２の個別プロセスシンボルテーブル３２−６を示す図。
【図１８】実施の形態２の実行条件テーブルを示す図。
【図１９】実施の形態３の対象計算機の外観の一例を示す図。
【図２０】実施の形態３の対象計算機のハードウェア構成の一例を示す図。
【発明を実施するための形態】
【００１１】
実施の形態１．
図１は、対象計算機１０１（エントリ書換装置、任意コード実行方式）の動作原理を示す構成図である。図１において、対象計算機１０１は、試験・検証の対象となる情報システムを構成するプログラム群が動作する計算機である。
（１）条件設定コマンド部１０は、対象計算機１０１を利用する為のマン・マシン・インターフェース手段を提供する。
（２）システムコールエントリ書換部１１は、カーネル飛び込み用システムコールエントリ３１−１にあるカーネル飛び込み用システムコール実体３１−２へのジャンプ命令を任意コード実行部３２−１へジャンプ命令へ書き換える。
（３）ライブラリＡＰＩエントリ書換部１２は、エラー注入やトレース情報取得などの任意のコードを実行したい任意の共有ライブラリＡＰＩエントリ２２−１にある共有ライブラリＡＰＩ実体２２−２へのジャンプ命令を、カーネル飛び込み用システムコールエントリ３１−１へとジャンプする為の割込命令に書き換える。
（４）条件設定部１３は、任意コードを実行する為の条件、例えば、呼出プロセスが指定のプログラムであった時のみ実行するなど、を実行条件テーブル３２−３に設定する。
（５）シンボルテーブル生成部１４は、フックしたい共有ライブラリＡＰＩが属する共有ライブラリの共有ライブラリシンボルテーブル３２−４を生成し、共有ライブラリシンボルテーブル３２−４に保存する。
（６）任意コード実行部３２−１は、実行条件テーブル３２−３の条件に合致する場合に任意のコードを実行する。
【００１２】
（動作の説明）
次に動作について説明する。
なお、実施の形態１では、任意のコードとしてエラー模擬を行うコードを実行する場合を例に説明するが、トレース情報を取得する場合や、他の任意のコードを実行する場合も同様である。
【００１３】
図２は、対象計算機１０１の基本動作の内、事前準備段階の動作フローである。
図３は、各構成要素がどこにアクセスしているかを示す図である。
【００１４】
（シンボルテーブル生成部１４）
まず、シンボルテーブル生成部１４は、図４に示すような共有ライブラリシンボルテーブル３２−４に、操作者（ユーザ）によって指定された共有ライブラリＡＰＩに関する情報を登録し、既に登録済みの場合はなにも行わない（Ｓ１１）。図４では、共有ライブラリ名、ＡＰＩシンボル名及びＡＰＩエントリアドレスが登録されている。
【００１５】
（条件設定部１３）
次に，条件設定部１３は、図５に示すような実行条件テーブル３２−３に、操作者（ユーザ）による指定に従って、対象となる共有ライブラリＡＰＩシンボル名、返値設定条件、呼出プログラム名などの情報を実行条件として登録する（Ｓ１２）。なお、実行条件としては、操作者は、他にプロセスＩＤ、呼出元プログラム内の関数名などを指定可能である。
【００１６】
（ライブラリＡＰＩエントリ書換部１２）
次に、ライブラリＡＰＩエントリ書換部１２は、操作者によって指定された共有ライブラリＡＰＩが属する共有ライブラリを、条件設定コマンド部１０が動作しているＡｐｐプロセス空間２０にマップし、マップした先頭アドレスを保持する（Ｓ１３）。この先頭アドレスを「０ｘＶＷＸＹ」とする。この先頭アドレスは、後述する図８のＳ２８の処理で使用される。
次に、ライブラリＡＰＩエントリ書換部１２は、図６の（ａ）に示すような、マップされた共有ライブラリの一部である共有ライブラリＡＰＩエントリ２２−１のうち、対象となる共有ライブラリＡＰＩに対応するエントリのジャンプ命令（例えば図６の（ａ）のＢＬ０ｘ２Ａ００）を読み取る。そして、ライブラリＡＰＩエントリ書換部１２は、この読み取った共有ライブラリＡＰＩ実体への本来のジャンプ先であるアドレス（ＢＬ０ｘ２Ａ００）を、図７（図７のＡＰＩエントリの部分）に示すようなエントリ保存テーブル３２−２（ｆｗｒｉｔｅのＢＬ０ｘ２Ａ００）に記録し（Ｓ１４）、さらに、図６の（ａ）の対象ライブラリＡＰＩエントリにあるジャンプ命令（ＢＬ０ｘ２Ａ００）を、カーネル飛び込み用システムコールに使用するｒｅｂｏｏｔシステムコールへジャンプする割込命令（ＩＮＴ  ０ｘ〜）に書き換える（Ｓ１５）。
なお、この例では、カーネル飛び込み用システムコールとしてｒｅｂｏｏｔシステムコールを使用する場合を説明したが一例であり、ｒｅｂｏｏｔシステムコールを必ず使用する必要があるということではない。「実際にシステムコールが呼ばれたのか、書き換えられたエントリから飛び込んできたのか、が簡易に判別できるシステムコール」であれば良く、この条件に合致するシステムコールの一例として、ｒｅｂｏｏｔシステムコール
を使用する場合を説明した。
【００１７】
（システムコールエントリ書換部１１）
次に、システムコールエントリ書換部１１は、カーネル飛び込み用システムコールに設定したｒｅｂｏｏｔシステムコールのエントリ（図６の（ｂ））にあるカーネル飛び込み用システムコール実体３１−２へのジャンプ命令のジャンプ先アドレス（図６の（ｂ）の「０ｘＡＢＣＤ」）を、エントリ保存テーブル３２−２に記録（図７の上側に示すｒｅｂｏｏｔの範囲）し（Ｓ１６）、カーネル飛び込み用システムコールのエントリにあるジャンプ命令（図６の（ｂ）のＢＬ  ０ｘＡＢＣＤ）を任意コード実行部３２−１へのジャンプ命令に書き換える。以上が事前準備段階の動作フローである。
【００１８】
図８は、対象計算機１０１の基本動作のうち、実際に対象となる情報システムを動作させて、検証・試験する際の動作フローである。
図９は、対象となったプログラムの実行フローの概略図である。
【００１９】
（ロードモジュール共有ライブラリＡＰＩ呼出２１）
まず、ロードモジュール２１内において共有ライブラリＡＰＩ（例えばｆｗｒｉｔｅとする）が呼び出される時には、ロードモジュール共有ライブラリＡＰＩ呼出２１内から、図６（ａ）の共有ライブラリＡＰＩエントリ２２−１にジャンプし（Ｓ２１）、事前に書き換えている割込命令（ＩＮＴ  ０ｘ〜：カーネル飛び込み用システムコールへジャンプする割込命令）により、ＯＳカーネル３１内にジャンプする（Ｓ２２）。事前に書き換えられたｒｅｂｏｏｔシステムコールエントリ（任意コード実行部３２−１へのジャンプ命令に書き換え済み）のジャンプ命令により、ドライバ３２内の任意コード実行部３２−１にジャンプする（Ｓ２３）。
【００２０】
（任意コード実行部３２−１）
次に、任意コード実行部３２−１は、まず、図１０に示すような、ＣＰＵが持つ割込履歴レジスタを読み出して、どの共有ライブラリＡＰＩエントリ２２−１で割込をかけてジャンプしてきのか確認し、共有ライブラリＡＰＩエントリアドレスを取得する（Ｓ２４）。
【００２１】
次に、任意コード実行部３２−１は、呼出の第１、第２引数がｒｅｂｏｏｔシステムコールのマジックコードであるか、第３引数が正しいｒｅｂｏｏｔシステムコールのコマンドコードであるかを確認する（Ｓ２５）。任意コード実行部３２−１は、正しい引数であれば、エントリ保存テーブル３２−２に記録してあるｒｅｂｏｏｔシステムコールの実体アドレスにジャンプしてシステムコールの処理を行う（Ｓ２６）。
【００２２】
正しい引数でなければ（検証対象プロセスの可能性がある）、以下の処理になる。共有ライブラリＡＰＩエントリのアドレスは、図１１に示すように、プロセスごとに共有ライブラリのマップされるアドレスが異なる。よって、任意コード実行部３２−１は、自プロセス内のメモリマップテーブルを参照して、Ｓ２４で取得した共有ライブラリＡＰＩエントリアドレスが、どの共有ライブラリに属するのかを確認する（Ｓ２７）。なお、この段階では、シンボル名までは特定できない。アドレスのみ判っているので、任意コード実行部３２−１は、共有ライブラリのマップされたアドレスから、どの共有ライブラリがマップされたアドレス領域かを判断出来る。属する共有ライブラリ（Ｓ２７で特定した共有ライブラリ）が、特定した共有ライブラリのマップされた先頭アドレスと、共有ライブラリＡＰＩのエントリアドレス（Ｓ２４で取得）から、割り込みに係る共有ライブラリの、先頭から共有ライブラリＡＰＩのエントリアドレスまでのアドレス差を算出（Δアドレスとおく）（Ｓ２８）する。
【００２３】
そして、任意コード実行部３２−１は、共有ライブラリシンボルテーブル３３−４内を検索して、対象の共有ライブラリＡＰＩであるかをチェックする。この際、任意コード実行部３２−１は、事前準備段階のＳ１３で保持した先頭アドレス（「０ｘＶＷＸＹ」）に、Ｓ２８で算出した「Δアドレス」を加えて加算アドレス値を得る。そして、任意コード実行部３２−１は、この加算アドレス値に相当するアドレスを共有ライブラリシンボルテーブル３２−４から見つけ、かつ、その行に割り込み係る共有ライブラリの名があるかどうかでチェックを行う。対象の共有ライブラリＡＰＩでなければ、正規に呼ばれたｒｅｂｏｏｔシステムコールであると判断し、エントリ保存テーブル３２−２にあるｒｅｂｏｏｔシステムコールの実体にジャンプする（Ｓ２９）。なおＳ２９でＮＯの場合とは、前記チェックによって特定された行のシンボル名が、図５の実行条件テーブル３２−３に登録されたＡＰＩシンボル名ではない場合である。ｒｅｂｏｏｔシステムコールのマジックコードに該当せずにこちらに分岐（Ｓ２５でＮＯ）したのに、実行条件テーブル３２−３にシンボルがないということは、任意コード実行部３２−１は、ロードモジュール共有ライブラリＡＰＩ呼出２１がｒｅｂｏｏｔシステムコールを誤った引数で呼んでいると判断する。
【００２４】
対象の共有ライブラリＡＰＩの場合、実行条件テーブル３２−３を参照し、呼出元プログラム、返値条件などが合致するかを判定する（Ｓ３０）。合致しない場合は、任意コード実行部３２−１は、エントリ保存テーブル３２−２にある共有ライブラリＡＰＩの正規の飛び先アドレスにジャンプする（Ｓ３３）。
条件に合致した場合は、任意コード実行部３２−１は、返値設定を行い（Ｓ３１）、カーネルスタック内に保存されたＲＰ（リターンポインタ）が示すＡｐｐプロセス空間２０のロードモジュール共有ライブラリＡＰＩ呼出２１内の共有ライブラリＡＰＩ呼出の直後にジャンプする（Ｓ３２）。
【００２５】
これにより、各種ライブラリＡＰＩをフックして任意のコードをカーネル空間３０内で実行できるようにすることにより、対象となる情報システム内のＯＳカーネル３１、及び、プログラム群を改変せずに、エラー模擬やトレース情報の取得が可能となる。
【００２６】
実施の形態２．
次に、図１２〜図１８を参照して実施の形態２の対象計算機１０２を説明する。対象計算機１０２は、実施の形態１の対象計算機１０１に対して、さらに、バックトレース実行部３２−５と、個別プロセスシンボルテーブル３２−６（図１７）とを備えた構成である。
【００２７】
図１２は、対象計算機１０２のブロック図である。
図１３は、バックトレース実行部３２−５の動作概念を示している。
図１４は、共有ライブラリの呼ばれた経路を示す概念図である。
図１５は、共有ライブラリの呼ばれた経路を示す概念図である。
図１６は、バックトレース実行部３２−５の動作フローである。
図１７は、個別プロセスシンボルテーブル３２−６を示す図である。
図１８は、実施の形態２における実行条件テーブルを示す図である。
【００２８】
実施の形態２の対象計算機１０２は、実施の形態１で説明した内容に加えて、共有ライブラリＡＰＩの呼出元経路を条件指定可能とする。対象計算機１０２は、図１２において、実施の形態１での構成（図１）に加えて、バックトレース実行部３２−５と個別プロセスシンボルテーブル３２−６（図１２では、個別Ｐｒｏｃシンボルテーブルと表記した）を持つ。
【００２９】
（動作の説明）
次に動作について説明する。
図１３は、バックトレース実行部３２−５の動作概念を示している。バックトレース実行部３２−５は、図８の返値設定条件に合致するかの判断時（図８のＳ３０）に呼ばれる。バックトレース実行部３２−５は、指定された経路、例えば、図１４において、共有ライブラリＡＰＩｓｌｉｂ＿２が、ｓｕｂ＿０２、ｓｕｂ＿１３を経由して呼ばれた時に合致するかを判断する為にバックトレースを行う。
【００３０】
図１６は動作フローを示す。まず、図１８の実行条件テーブルに示すように、呼び出されたＡＰＩ（ｓｌｉｂ＿２）に対して、返値設定条件として、呼出元条件が設定されていた場合、図１６のフローで条件確認が行われる。図１６のフローにおいては、まず、共有ライブラリＡＰＩ  ｓｌｉｂ＿２が呼び出された時、即ち、システムコールに書き換えられているので割込が発生した時に行われるレジスタ退避領域（図１３の（１））より、割込発生時のプログラムカウンタ（ＰＣ）の値、及び、スタックポインタ（ＳＰ）の値を取得する（Ｓ４１）。
【００３１】
次にプログラムカウンタ値が指すアドレスが、個別プロセスシンボルテーブル（図１７）上のどのシンボルに該当するアドレスか確認して、そのシンボル名を保持する（Ｓ４４）。例えば、ＰＣが０ｘ００４００５５０を指していたとすれば、シンボル名ｓｕｂ＿１２のアドレス領域に該当する。
【００３２】
次に保持されたシンボル名がｍａｉｎかどうかを確認し（Ｓ４５）、Ｙｅｓであれば、最後までバックトレースが完了したとして条件に合致しないとしてフローを終了する（Ｓ４６）。Ｎｏであれば、保持したシンボル名が条件にあっているか確認し（Ｓ４７）、Ｙｅｓの場合、更に条件を全て満たしたかを確認する（Ｓ４８）。Ｙｅｓであれば、条件に合致したとしてフローを終了する（Ｓ４９）。Ｎｏであれば、スタックポインタが指すアドレス（スタック領域の先頭を指す）よりリターンポインタ（ＲＰ）値と次のスタックポインタ（ＳＰ）値を取得する（Ｓ５０）。
【００３３】
次にリターンポインタ値が指すアドレスが、個別プロセスシンボルテーブル（図１７）上のどのシンボルに該当するアドレスか確認して、そのシンボル名を保持する（Ｓ５１）。
【００３４】
以降、（Ｓ４５）〜（Ｓ５１）をフローに従って終了条件を満たすまで繰り返す。なお、図１６のＳ４２の個別プロセスシンボルテーブル（図１７）の生成の手段としては、ロードモジュールのシンボルテーブル、及び、そのプロセスにマップされた共有ライブラリのシンボルテーブルのアドレスを演算したアドレス（共有ライブラリのマップされた先頭アドレスにシンボルテーブルに記録されたアドレスを足す）をアドレスでソートすることによりなされる。これにより、例えば、図１５のように複数の関数から呼ばれ得る共有ライブラリＡＰＩをフックしてエラーを注入したりする場合に、特定のエラー処理を試験しようとしても特定できないという課題を解決でき、網羅的な試験を可能とする効果がある。
【００３５】
実施の形態３．
図１９、図２０を参照して実施の形態３を説明する。実施の形態３は、コンピュータである対象計算機１０１、１０２のハードウェア構成を説明する。
図１９は、コンピュータである対象計算機１０１あるいは対象計算機１０２の外観の一例を示す図である。
図２０は、対象計算機１０１あるいは対象計算機１０２のハードウェア資源の一例を示す図である。以下の説明は対象計算機１０１とする。対象計算機１０２についても対象計算機１０１の説明がそのまま当てはまる。
【００３６】
外観を示す図１９において、対象計算機１０１は、システムユニット８３０、ＣＲＴ（Ｃａｔｈｏｄｅ・Ｒａｙ・Ｔｕｂｅ）やＬＣＤ（液晶）の表示画面を有する表示装置８１３、キーボード８１４（Ｋｅｙ・Ｂｏａｒｄ：Ｋ／Ｂ）、マウス８１５、コンパクトディスク装置８１８（ＣＤＤ：Ｃｏｍｐａｃｔ  Ｄｉｓｋ  Ｄｒｉｖｅ）などのハードウェア資源を備え、これらはケーブルや信号線で接続されている。システムユニット８３０はネットワークに接続している。
【００３７】
またハードウェア資源を示す図２０において、対象計算機１０１は、プログラムを実行するＣＰＵ８１０（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を備えている。ＣＰＵ８１０は、バス８２５を介してＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）８１１、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）８１２、表示装置８１３、キーボード８１４、マウス８１５、通信ボード８１６、ＣＤＤ８１８、磁気ディスク装置８２０と接続され、これらのハードウェアデバイスを制御する。磁気ディスク装置８２０の代わりに、光ディスク装置、フラッシュメモリなどの記憶装置でもよい。
【００３８】
ＲＡＭ８１２は、揮発性メモリの一例である。ＲＯＭ８１１、ＣＤＤ８１８、磁気ディスク装置８２０等の記憶媒体は、不揮発性メモリの一例である。これらは、「記憶装置」あるいは記憶部、格納部、バッファの一例である。通信ボード８１６、キーボード８１４などは、入力部、入力装置の一例である。また、通信ボード８１６、表示装置８１３などは、出力部、出力装置の一例である。通信ボード８１６は、ネットワークに接続されている。
【００３９】
磁気ディスク装置８２０には、オペレーティングシステム８２１（ＯＳ）、ウィンドウシステム８２２、プログラム群８２３、ファイル群８２４が記憶されている。プログラム群８２３のプログラムは、ＣＰＵ８１０、オペレーティングシステム８２１、ウィンドウシステム８２２により実行される。
【００４０】
上記プログラム群８２３には、以上の実施の形態の説明において「〜部」として説明した機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ８１０により読み出され実行される。
【００４１】
ファイル群８２４には、以上の実施の形態の説明において、「〜の判定結果」、「〜の算出結果」、「〜の抽出結果」、「〜の生成結果」、「〜の処理結果」として説明した情報や、データや信号値や変数値やパラメータなどが、「〜ファイル」や「〜データベース」の各項目として記憶されている。「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ８１０によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示などのＣＰＵの動作に用いられる。抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示のＣＰＵの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリやキャッシュメモリやバッファメモリに一時的に記憶される。
【００４２】
また、以上に述べた実施の形態の説明において、データや信号値は、ＲＡＭ８１２のメモリ、ＣＤＤ８１８のコンパクトディスク、磁気ディスク装置８２０の磁気ディスク、その他光ディスク、ミニディスク、ＤＶＤ（Ｄｉｇｉｔａｌ・Ｖｅｒｓａｔｉｌｅ・Ｄｉｓｋ）等の記録媒体に記録される。また、データや信号は、バス８２５や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【００４３】
また、以上の実施の形態の説明において、「〜部」として説明したものは、「〜手段」、であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明したものは、ソフトウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ等の記録媒体に記憶される。プログラムはＣＰＵ８１０により読み出され、ＣＰＵ８１０により実行される。すなわち、プログラムは、以上に述べた「〜部」としてコンピュータを機能させるものである。あるいは、以上に述べた「〜部」の手順や方法をコンピュータに実行させるものである。
【００４４】
以上の実施の形態では、装置としての対象計算機１０１（エントリ書換装置）を説明したが、対象計算機１０１の動作をエントリ書換プログラムとしても把握できることは以上の説明から明らかである。
【００４５】
以上の実施の形態では、以下の手段、要素を備え、アプリケーションプログラムを改変せずに任意のコードをカーネル空間で実行可能とする任意コード実行方式を説明した。
（ａ）試験実施者と対話的に任意コード実行条件の入力を受け付けて、条件設定部に対して実行条件テーブルへの書き込みを指示すると共に、ライブラリＡＰＩエントリ書換部に対して任意コード実行のトリガーとなるライブラリＡＰＩエントリの書換を指示すると共に、システムコールエントリ書換部に対してカーネル飛び込み用システムコールに指定したシステムコールのエントリの書換を指示すると共に、シンボルテーブル生成部に対して対象となる共有ライブラリのシンボルテーブルの生成を指示する手段（条件設定コマンド）；
（ｂ）対象プログラムが動的にリンクする共有ライブラリ内の対象となる共有ライブラリＡＰＩエントリの飛び先をカーネル飛び込み用システムコールエントリのアドレスに書き換え、元のアドレスをエントリ保存テーブルに保持する手段（ライブラリＡＰＩエントリ書換部）；
（ｃ）カーネル内のシステムコールエントリの飛び先を任意コード実行部へと書き換える手段（システムコールエントリ書換部）；
（ｄ）任意コードを実行する条件として、対象共有ライブラリＡＰＩ、指定プログラム、プロセスＩＤなどの組合わされた条件を実行条件テーブルに書き込む手段（条件設定部）；
（ｅ）対象となる共有ライブラリＡＰＩが属する共有ライブラリを検索し、その共有ライブラリのシンボルテーブルを相対アドレス値でソートした状態で共有ライブラリシンボルテーブルに保存する手段（シンボルテーブル生成部）；
（ｆ）呼び出されると、どの共有ライブラリＡＰＩから呼び出されたのかを判別した上で実行条件テーブルをチェックし、条件に合致した場合、指定されたコードを実行する手段（任意コード実行部）；
【００４６】
以上の実施の形態では、さらに以下の手段、要素を備え、呼出元の関数が呼ばれた経路の条件指定を可能とする任意コード実行方式を説明した。
（ａ）共有ライブラリＡＰＩがロードモジュール内のどの関数を経由して呼び出されたかを検索する手段（バックトレース実行部）；
（ｂ）バックトレースを実行する為に必要な各アプリケーションプロセスの個別のシンボルテーブルを保持する要素（個別プロセスシンボルテーブル）；
【符号の説明】
【００４７】
１０１，１０２  対象計算機、１０  条件設定コマンド部、１１  システムコールエントリ書換部、１２  ライブラリＡＰＩエントリ書換部、１３  条件設定部、１４  シンボルテーブル生成部、２０  Ａｐｐプロセス空間、２１  ロードモジュール共有ライブラリＡＰＩ呼出、２２  共有ライブラリ群、２２−１  共有ライブラリＡＰＩエントリ、２２−２  共有ライブラリＡＰＩ実体、３０  カーネル空間、３１  ＯＳカーネル、３１−１  カーネル飛び込み用システムコールエントリ、３１−２  カーネル飛び込み用システムコール実体、３２  ドライバ、３２−１  任意コード実行部、３２−２  エントリ保存テーブル、３２−３  実行条件テーブル、３２−４  共有ライブラリシンボルテーブル、３２−５  バックトレース実行部、３２−６  個別プロセスシンボルテーブル。
【図１】
0005550578.tif 000002
【図２】
0005550578.tif 000003
【図３】
0005550578.tif 000004
【図４】
0005550578.tif 000005
【図５】
0005550578.tif 000006
【図６】
0005550578.tif 000007
【図７】
0005550578.tif 000008
【図８】
0005550578.tif 000009
【図９】
0005550578.tif 000010
【図１０】
0005550578.tif 000011
【図１１】
0005550578.tif 000012
【図１２】
0005550578.tif 000013
【図１３】
0005550578.tif 000014
【図１４】
0005550578.tif 000015
【図１５】
0005550578.tif 000016
【図１６】
0005550578.tif 000017
【図１７】
0005550578.tif 000018
【図１８】
0005550578.tif 000019
【図１９】
0005550578.tif 000020
【図２０】
0005550578.tif 000021