【実施例】
【0021】
以下、図面を参照し、ソフトウェア実行状況検証装置、ソフトウェア実行状況検証方法、及びソフトウェア実行状況検証プログラムの実施例について説明する。
【0022】
[構成]
図1は、一実施例に係るソフトウェア実行状況検証装置1が検証対象となるソフトウェアが実行された際の実行アドレスの変化等が記述されたトレースデータを取得する場面を簡単に示す図である。
【0023】
検証対象コンピュータ50は、パーソナルコンピュータ、或いは、自動車等の移動体や携帯電話、プラント、工作機械、各種電子機器等を制御する組み込みコンピュータである。検証対象ソフトウェア52は、検証対象コンピュータ50上で動作するソフトウェアであり、その種類について特段の制約は存在しない。検証対象コンピュータ50は、CPU(Central Processing Unit)やプログラムメモリ等を有し、プログラムカウンタの示す値がバスを介してプログラムメモリに出力され、プログラムメモリからCPUに送信された命令コード(検証対象ソフトウェア52に含まれる)をCPUが実行する。
【0024】
インサーキットエミュレータ(In-Circuit Emulatorは登録商標)60は、ソフトウェアのデバッグとハードウェアの動作確認を行うことができるデバッガである。インサーキットエミュレータ60は、バスを流れるプログラムカウンタ値を監視することにより、対象コンピュータにおいて実行された命令コードのアドレス(以下、実行アドレスと称する)を実行順に取得する機能や、特定の命令コードが実行される度に指定されたメモリの内容を出力する機能等を有する。インサーキットエミュレータ60は、このような機能により取得されたトレースデータは、ソフトウェア実行状況検証装置1に提供される。
【0025】
なお、インサーキットエミュレータ60は、独立したハードウェア上で動作するものであってもよいし、ソフトウェア実行状況検証装置1と検証対象コンピュータ50のいずれかで動作するものであってもよい。
【0026】
また、検証対象コンピュータ50とソフトウェア実行状況検証装置1は同体のコンピュータであってもよい。
図2は、検証対象コンピュータ50とソフトウェア実行状況検証装置1は同体のコンピュータである場合の機能構成例である。
図2に示すコンピュータ70上では、対象ソフトウェア72、インサーキットエミュレータ部74、ソフトウェア実行状況検証部76等のソフトウェアが動作する。
【0027】
図3は、一実施例に係るソフトウェア実行状況検証装置1のハードウェア構成例である。ソフトウェア実行状況検証装置1は、例えば、CPUAと、ドライブ装置Bと、メモリ装置Dと、記憶装置Eと、入力装置Fと、表示装置Gと、インターフェース装置Hとを備える。これらの構成要素は、バスやシリアル回線等を介して接続されている。
【0028】
CPUAは、例えば、プログラムカウンタや命令デコーダ、各種演算器、LSU(Load Store Unit)、汎用レジスタ等を有するプロセッサである。ドライブ装置Bは、記憶媒体Cからプログラムやデータを読み込み可能な装置である。プログラムを記録した記憶媒体Cがドライブ装置Bに装着されると、プログラムが記憶媒体Cからドライブ装置Bを介して記憶装置Eにインストールされる。記憶媒体Cは、例えば、CD(Compact Disc)、DVD(Digital Versatile Disc)、USB(Universal Serial Bus)メモリ等の可搬型の記憶媒体である。プログラムのインストールは、記憶媒体Cを用いる他、インターフェース装置Hがネットワークを介して他のコンピュータよりダウンロードし、記憶装置Eにインストールすることによって行うこともできる。また、ソフトウェア実行状況検証装置1において実行されるプログラムは、ソフトウェア実行状況検証装置1の出荷時に、予め記憶装置EやROM等に格納されていてもよい。
【0029】
メモリ装置Dは、例えば、RAM(Random Access Memory)であり、記憶装置Eは、例えば、HDD(Hard Disk Drive)やSSD(Solid State Drive)である。入力装置Fは、例えば、キーボードやマウス、タッチパネル、タッチパッド、マイク等である。表示装置Gは、例えば、LCD(Liquid Crystal Display)である。インターフェース装置Hは、種々のネットワークにアクセスし、検証対象コンピュータ50等の他のコンピュータとの間で通信を行う。
【0030】
図4は、一実施例に係るソフトウェア実行状況検証装置1の機能構成例である。ソフトウェア実行状況検証装置1は、CPUAがプログラムを実行することにより機能する機能部として、コンテキスト分離部10と、ソース対応付け・メモリフィルタ部12と、動作判定部14とを備える。なお、これらの機能部は、明確に分離したプログラムによって実現される必要はなく、サブルーチンや関数として他のプログラムによって呼び出されるものであってもよい。また、機能部の一部が、LSI(Large Scale Integrated circuit)、IC(Integrated Circuit)やFPGA(Field Programmable Gate Array)等のハードウェア手段であっても構わない。
【0031】
また、ソフトウェア実行状況検証装置1は、メモリ装置D等に、分離後トレースデータ24、変換データ28等を生成して処理に使用する。
【0032】
コンテキスト分離部10は、インサーキットエミュレータ60から供給されるトレースデータ20を、アプリ(+OS)情報22を参照してコンテキストに分離し、分離後トレースデータ24として出力する。コンテキストとは、例えば、割り込みやタスクの切替等、特定の分岐に係る分岐元の一連の実行アドレスと分岐先の一連の実行アドレスとを分離した場合の、それぞれの一連の実行アドレスを意味する。
図5は、2回の割り込み処理が重なる時期に行われた場合に、トレースデータ20が3つのコンテキスト(分離後トレースデータ24)に分離される様子を示す図である。
図5に示すように、割り込み(1)に係る処理(
図5における命令E、F、G(reti))、割り込み(2)に係る処理(
図5における命令G、H、I(reti))、それ以外のメインルーチンに係る処理(
図5における命令A、B、C、D、H…は、それぞれが別のコンテキストとして出力される。また、トレースデータ20は、実行アドレスに命令コードが対応付けられたデータであり、後述するように、更にロード・ストア命令に関してアクセス先の情報等が付与される。
【0033】
ソース対応付け・メモリフィルタ部12は、コンテキスト分離部10により出力された分離後トレースデータにおける命令コードを、変換用情報26等を参照してソースコードに変換し、変換データ28を出力する。
【0034】
動作判定部14は、変換データ28を比較対象のデータと比較し、検証対象ソフトウェア52が正常に動作したか否かを判定する。
【0035】
[処理内容]
以下、これらの機能ブロックの処理について、より詳細に説明する。コンテキスト分離部10は、検証対象コンピュータ50がOS無しで動作する場合と、OS有りで動作する場合とで異なる処理を行う。
【0036】
〔コンテキスト分離部〕
(1)検証対象コンピュータ50がOS無しで動作する場合
コンテキスト分離部10が利用するアプリ(+OS)情報22は、例えば、
図6に例示される解析対象ソフトウェア情報を含む。解析対象ソフトウェア情報は、メインルーチン、割り込み処理A、割り込み処理B毎に、分離後トレースデータ24におけるファイルの出力先、先頭アドレス及び終了アドレス、初期化可能か否かの情報等を含む。解析対象ソフトウェア情報は、例えば、対象ソフトウェアのデバッグ時やコンパイル時に生成された情報に基づき、予め作成されたものである。
【0037】
図7は、検証対象コンピュータ50がOS無しで動作する場合に、コンテキスト分離部10により実行される処理の流れを示すフローチャートの一例である。
図7のフローチャートにおいて、「outfile」はファイルの出力先を示し、「inst」は読み込んだ命令情報を示す符号であり、「m_stack」はファイルの出力先をLIFO(Last In, First Out)で保存するスタックを示す。
【0038】
まず、コンテキスト分離部10は、outfileの初期データを、メインルーチンに対応する「ファイル00」に設定する(S100)。
【0039】
次に、コンテキスト分離部10は、トレースデータ20から命令コードを1つ読み込み、instとする(S102)。
【0040】
次に、コンテキスト分離部10は、読み込んだ命令コードの実行アドレスが、コンテキスト(ここでは割り込み処理)の先頭アドレスであるか否かを判定する(S104)。
【0041】
読み込んだ命令コードの実行アドレスが、コンテキストの先頭アドレスである場合、コンテキスト分離部10は、outfileをm_stackにプッシュし(S106)、開始されたコンテキストの「出力先」をoutfileに設定し(S108)、outfileにinstを出力する(S110)。
【0042】
読み込んだ命令コードの実行アドレスが、コンテキストの先頭アドレスでない場合、コンテキスト分離部10は、読み込んだ命令コードの実行アドレスが、コンテキストの終了アドレスであるか否かを判定する(S112)。
【0043】
読み込んだ命令コードの実行アドレスが、コンテキストの終了アドレスである場合、コンテキスト分離部10は、outfileにinstを出力し(S114)、m_stackからoutfileをポップする(S116)。
【0044】
読み込んだ命令コードの実行アドレスが、コンテキストの先頭アドレスでも終了アドレスでもない場合、コンテキスト分離部10は、outfileにinstを出力する(S118)。
【0045】
S104〜S118の処理を実行すると、コンテキスト分離部10は、トレースデータ20から次の命令コードを1つ読み込み、instとする(S120)。
【0046】
そして、コンテキスト分離部10は、instがNULLであるか否かを判定し(S122)、instがNULLでない場合はS104に戻り、instがNULLである場合は本フローチャートの処理を終了する。
【0047】
(2)検証対象コンピュータ50がOS有りで動作する場合
コンテキスト分離部10が利用するアプリ(+OS)情報22は、例えば、
図8に例示される解析対象ソフトウェア情報や
図9に例示されるOS情報を含む。
【0048】
解析対象ソフトウェア情報は、タスクA、タスクB、タスクC、OS処理毎に、分離後トレースデータ24におけるファイルの出力先、先頭アドレス及び終了アドレス、初期化可能か否かの情報、タスクID等を含む。
【0049】
OS情報は、タスクIDをもつ変数アドレスA1、スケジューラ出口のアドレスA2、割り込み処理を開始するための割り込みハンドラ毎の先頭アドレスと終了アドレス等を含む。タスクIDをもつ変数アドレスA1は、OSの一機能であるスケジューラが、起床させるタスクのIDを書き込むアドレスである。スケジューラ出口のアドレスA2は、スケジューラがタスクの起床を行うときに実行される命令のアドレスである。
【0050】
解析対象ソフトウェア情報やOS情報は、例えば、対象ソフトウェアのデバッグ時やコンパイル時に生成された情報に基づき、予め作成されたものである。
【0051】
図10は、検証対象コンピュータ50がOS有りで動作する場合に、コンテキスト分離部10により実行される処理の流れを示すフローチャートの一例である。
図10のフローチャートにおいて、「outfile」はファイルの出力先を示し、「inst」は読み込んだ命令情報を示す符号であり、「m_stack」はファイルの出力先をLIFOで保存するスタックを示す。
【0052】
まず、コンテキスト分離部10は、outfileの初期データをNULLに設定する(S200)。
【0053】
次に、コンテキスト分離部10は、トレースデータ20から命令コードを1つ読み込み、instとする(S202)。
【0054】
次に、コンテキスト分離部10は、読み込んだ命令コードが、タスクIDをもつ変数アドレスA1へのストア命令であるか否かを判定する(S204)。読み込んだ命令コードが、タスクIDをもつ変数アドレスA1へのストア命令である場合、アドレスA1への書込データをタスクIDに設定する(S206)。
【0055】
次に、コンテキスト分離部10は、読み込んだ命令コードの実行アドレスが、スケジューラ出口のアドレスであるか否かを判定する(S208)。
【0056】
読み込んだ命令コードの実行アドレスが、スケジューラ出口のアドレスである場合、コンテキスト分離部10は、ラスクIDが示すタスクの「出力先」をoutfileに設定し(S210)、outfileにinstを出力する(S212)。
【0057】
読み込んだ命令コードの実行アドレスが、スケジューラ出口のアドレスでない場合、コンテキスト分離部10は、読み込んだ命令コードの実行アドレスが、割り込みハンドラの先頭アドレスであるか否かを判定する(S214)。
【0058】
読み込んだ命令コードの実行アドレスが、割り込みハンドラの先頭アドレスである場合、コンテキスト分離部10は、outfileをm_stackにプッシュし(S216)、開始されたコンテキストの「出力先」をoutfileに設定し(S218)、outfileにinstを出力する(S220)。
【0059】
読み込んだ命令コードの実行アドレスが、割り込みハンドラの先頭アドレスでない場合、コンテキスト分離部10は、読み込んだ命令コードの実行アドレスが、割り込みハンドラの終了アドレスであるか否かを判定する(S222)。
【0060】
読み込んだ命令コードの実行アドレスが、割り込みハンドラの終了アドレスである場合、コンテキスト分離部10は、outfileにinstを出力し(S224)、m_stackからoutfileをポップする(S226)。
【0061】
読み込んだ命令コードの実行アドレスが、割り込みハンドラの先頭アドレスでも終了アドレスでもない場合、コンテキスト分離部10は、読み込んだ命令コードの実行アドレスが、OS処理領域内のアドレスであるか否かを判定する(S228)。読み込んだ命令コードの実行アドレスが、OS処理領域内のアドレスでない場合、コンテキスト分離部10は、outfileにinstを出力する(S230)。
【0062】
S204〜S230の処理を実行すると、コンテキスト分離部10は、トレースデータ20から次の命令コードを1つ読み込み、instとする(S232)。
【0063】
そして、コンテキスト分離部10は、instがNULLであるか否かを判定し(S234)、instがNULLでない場合はS204に戻り、instがNULLである場合は本フローチャートの処理を終了する。
【0064】
〔ソース対応付け・メモリフィルタ部〕
図11は、コンテキスト分離部10により生成される分離後トレースデータ24の一部と、ソース対応付け・メモリフィルタ部12により生成される変換データ28とを示す図である。
図11に示すように、分離後トレースデータ24は、コンテキスト毎に抜き出されたトレースデータであり、実行アドレスに命令コードが対応付けられ、更に、ロード・ストア命令に関してはアクセス先のメモリ装置Dのアドレスと、対応するレジスタ番号を含む。ソース対応付け・メモリフィルタ部12が変換データ28の生成のために参照する変換用情報26には、
図11に示すソースとオブジェクトの対応表26A、変数情報26B等が含まれる。これらの変換用情報26は、例えば、対象ソフトウェアのデバッグ時やコンパイル時に生成された情報に基づき、予め作成されたものである。
【0065】
ソースとオブジェクトの対応表26Aにおける「A.c」や「B.c」はファイル名を示し、「100」、「101」、「30」等は各ファイルにおける行番号を示す。また、変数情報26Bは、ソースコードにおける変数名と、検証対象コンピュータ50において変数が格納されるアドレスを対応付けた情報である。
【0066】
ソース対応付け・メモリフィルタ部12は、これらの情報を参照することにより、分離後トレースデータ24を、「ファイル、行番号、ヒープ領域の変数アクセス」の時系列データに変換する。これによって、検証対象コンピュータ50においてなされた動作が、ソースコードにより表現された動作に変換され、ソフトウェアの検証を容易に行うことを可能とする。なお、変数情報26Bに無いメモリへのアクセスは、スタックへのアクセス等、コンピュータ依存のアクセスであるため、変換データ28に反映させないようにしている。
【0067】
図12は、ソース対応付け・メモリフィルタ部12により実行される処理の流れを示すフローチャートの一例である。
【0068】
まず、ソース対応付け・メモリフィルタ部12は、分離後トレースデータ24から命令コードを1つ読み込み、instとする(S300)。
【0069】
次に、ソース対応付け・メモリフィルタ部12は、命令コードの実行アドレスが、ソースとオブジェクトの対応表26Aにあるか否かを判定する(S302)。命令コードの実行アドレスが、ソースとオブジェクトの対応表26Aにある場合、ソース対応付け・メモリフィルタ部12は、命令コードの実行アドレスに対応するソースコードと行番号を出力する(S304)。
【0070】
次に、ソース対応付け・メモリフィルタ部12は、ロード・ストア命令に関する付加情報があるか否かを判定する(S306)。ロード・ストア命令に関する付加情報がある場合、ソース対応付け・メモリフィルタ部12は、アクセスタイプ(ロードかストアか)、変数名、レジスタ値を更に出力する(S308)。
【0071】
次に、ソース対応付け・メモリフィルタ部12は、分離後トレースデータ24から命令コードを1つ読み込み、instとし(S310)、instがNULLであるか否かを判定する(S312)、ソース対応付け・メモリフィルタ部12は、instがNULLでない場合はS302に戻り、instがNULLである場合は本フローチャートの処理を終了する。
【0072】
〔動作判定部〕
図13は、動作判定部14による処理を概念的に示す図である。図示するように、動作判定部14は、検証対象コンピュータ50において検証対象ソフトウェア52が実行されることにより取得されたトレースデータから生成された変換データ28を、比較対象コンピュータにおいて同じソフトウェアが実行されることにより取得されたトレースデータから生成された比較データと、ソースコード毎に比較することにより、検証対象コンピュータ50において検証対象ソフトウェア52が正常に動作しているか否かを判定する。
【0073】
ここで、比較データは、正常が動作していることが判明しているソフトウェア環境で、検証対象データ52と同じソフトウェアが動作したときに取得されたトレースデータから生成されたデータである。
【0074】
図14は、動作判定部14による処理の流れを示すフローチャートの一例である。
【0075】
まず、動作判定部14は、変換データ28と比較データの(例えばユーザによる)指定を受け付ける(S400)。
【0076】
次に、動作判定部14は、変換データ28と比較データからソースコードを1つずつ取得する(S402)。
【0077】
次に、動作判定部14は、ファイル名及び行番号が一致しているか否かを判定する(S404)。
【0078】
ファイル名及び行番号が一致している場合、動作判定部14は、ロード・ストア命令に関する付加情報があるか否かを判定する(S406)。
【0079】
ロード・ストア命令に関する付加情報がある場合、動作判定部14は、タイプ、変数名、アクセス先のアドレス、及びレジスタが一致するか否かを判定する(S408)。
【0080】
タイプ、変数名、アクセス先のアドレス、及びレジスタが一致する場合、動作判定部14は、全てのソースコードについてS404〜S408の比較を行ったか否かを判定する(410)。全てのソースコードについてS404〜S408の比較を行っていない場合、動作判定部14は、S402に戻り、次のソースコードを取得する。
【0081】
全てのソースコードについてS404〜S408の比較を行った場合、動作判定部14は、検証対象ソフトウェア52が正常に動作したことを出力する(S412)。
【0082】
一方、S404又はS408において否定的な判定を得た場合、動作判定部14は、エラー出力、すなわち、検証対象ソフトウェア52が正常に動作しなかったことを出力する(S414)。
【0083】
[適用例]
図15は、あるコンピュータ上で動作しているソフトウェアを、他のコンピュータに移植した際に、ソフトウェアの検証が実行される様子を示す図である。
図15に示すように、現在までソフトウェアを実行していたコンピュータAと、これからソフトウェアを移植するコンピュータBのそれぞれからトレースデータ20を取得し、各トレースデータ20に対してコンテキスト分離部10及びソース対応付け・メモリフィルタ部12が処理を行って生成される変換データ同士を比較することにより、コンピュータBで当該ソフトウェアが正常に動作するか否かを事前に検証することができる。
【0084】
図16は、複数のコンピュータ上で動作しているソフトウェアを、一のコンピュータに統合して動作させる際に、ソフトウェアの検証が実行される様子を示す図である。
図16に示すように、現在までソフトウェアを実行していたコンピュータC、Dと、これからソフトウェアを移植するコンピュータEのそれぞれからトレースデータ20を取得し、各トレースデータ20に対してコンテキスト分離部10及びソース対応付け・メモリフィルタ部12が処理を行って生成される変換データ同士を比較することにより、コンピュータEで各ソフトウェアが正常に動作するか否かを事前に検証することができる。
【0085】
いずれの場合も、ソースコードレベルで比較を行うことができるため、動作環境が異なるにも関わらず、実行されるタイミングやアクセス先のアドレス、変数等が正常であるか否かを検証することができる。また、スタック操作等のソースコード上の記述に無いコンピュータ依存の動作は除外されるため、不要なエラー出力がなされることを抑制することができる。また、
図16に示す機能統合時の検証においては、統合時に新たに追加されたコンテキストや比較する必要が無いコンテキスト(OS処理等)を比較対象としないようにすることができるため、過不足無い検証を行うことができる。
【0086】
[まとめ]
以上説明したソフトウェア実行状況検証装置、ソフトウェア実行状況検証方法、及びソフトウェア実行状況検証プログラムの実施例によれば、ソフトウェアの検証を、より適切に行うことができる。
【0087】
以上、本発明を実施するための形態について実施例を用いて説明したが、本発明はこうした実施例に何等限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々の変形及び置換を加えることができる。
【0088】
例えば、上記実施例では、コンテキストが変更される場合の例として割り込み処理の発生やタスクの切り替えを挙げたが、これらの他(或いはこれらに代えて)、サブルーチンによる分岐等を含んでもよい。