JP4763743B2 - プログラム動作比較装置及び方法及びプログラム - Google Patents

プログラム動作比較装置及び方法及びプログラム Download PDF

Info

Publication number
JP4763743B2
JP4763743B2 JP2008087886A JP2008087886A JP4763743B2 JP 4763743 B2 JP4763743 B2 JP 4763743B2 JP 2008087886 A JP2008087886 A JP 2008087886A JP 2008087886 A JP2008087886 A JP 2008087886A JP 4763743 B2 JP4763743 B2 JP 4763743B2
Authority
JP
Japan
Prior art keywords
function
program
execution
function block
execution history
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2008087886A
Other languages
English (en)
Other versions
JP2009244969A (ja
Inventor
淑美 一柳
誠司 木原
敏 盛合
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nippon Telegraph and Telephone Corp
Original Assignee
Nippon Telegraph and Telephone Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nippon Telegraph and Telephone Corp filed Critical Nippon Telegraph and Telephone Corp
Priority to JP2008087886A priority Critical patent/JP4763743B2/ja
Publication of JP2009244969A publication Critical patent/JP2009244969A/ja
Application granted granted Critical
Publication of JP4763743B2 publication Critical patent/JP4763743B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Description

本発明は、プログラム動作比較装置及び方法及びプログラムに係り、プログラムを実行する環境や、動作するプログラムのバージョンなどのプログラムやその動作環境の違いによって発生するプログラム動作の差異を検出することにより、エラーが発生してからその原因を特定するまでの時間を短縮するためのプログラム動作比較装置及び方法及びプログラムに関する。
現在のデバッグ技術として、プローブをプログラムに挿入する方法、プロファイラやシステムモニタ、デバッガ、ダンプ、トレーサやロガーが存在する。
プローブをプログラムに挿入することによって、デバッグする場合、プログラムのどこにプローブを挿入するかが問題となる。このとき、エラーが発生してからバグを発見するまでの時間の長さは、プログラム自身と、プローブを挿入したユーザのスキルに依存する。そのため、プローブをプログラムに挿入する方法は、エラーの発生からバグを特定するまでの時間を短くする方法ではない。
プロファイラやシステムモニタは、プログラムの計算機資源量の消費量を監視するための方法であるため、プログラムの実行速度の低下といったプログラムの計算機資源消費量に関わるバグを発見する場合には有用だが、プログラムの実行速度、プログラムの処理手順に依存して顕在化するバグ、例えば、競合問題に関するバグを発見することはできない。
デバッガは、ブレークポイントの挿入位置に、エラーが発生してからバグを特定するまでの時間に依存する。具体的には、よりプログラミングスキルのあるユーザがブレークポイントを挿入した方が、エラーが発生してからバグを発見するまでの時間が短くなる傾向にある。
また、自動的にブレークポイントを挿入し、ユーザのスキルに依存せず、エラーが発生してからバグを発見するまでの時間を短くする方法もある(例えば、特許文献1参照)しかし、実行中のプログラムの情報を取得する手段として、ブレークポイントを使用する場合、コンテキストスイッチといったオーバヘッドが高い処理が発生するため、プログラムの実行速度が大幅に低下する。
ダンプを用いてデバッグする場合、プログラムの情報を取得するタイミングが問題となる。ダンプでは、プログラムが実行不可能となるエラーが発生した時や、特定の外部イベントが発生した時にプログラムの情報を取得する。これらのタイミングにおいて取得したプログラムの情報から、プログラムの実行速度、プログラムの処理手順に依存して顕在化するバグを発見することは困難である。
トレーサやロガーは、実行された関数やシステムコールの実行時刻、関数名、引数、返り値などを自動的に取得する。このため、ポータビリティ性が十分に考慮され、モジュール化が進んだプログラムでは、プログラムの処理手順に依存するバグを発見するのに十分な情報が取得できると考えられ、エラーが発生してからバグを発見するまでの時間を短くすることができるため、実行履歴を取得するために必要となる処理時間を低減することができる。しかし、従来のトレーサやロガーは、実行された関数の引数や返り値を正確に取得していない。
特開平7−73070号公報
上記のように、従来のデバッグ手法には、エラーが発生してからバグを発見するまでの時間がデバッグを行うユーザのプログラミングスキルに依存している。さらに、デバッグ手法によっては、プログラムの実行速度、プログラムの処理手順に依存して顕在化するバグを発見することができない。
本発明は、上記の点に鑑みなされたもので、デバッグを行うユーザのプログラミングスキルに依存せず、プログラムの実行速度、プログラムの処理手順に依存して顕在化するバグを発見し、バグを特定するために必要となる情報を自動的に収集するためのプログラム動作比較装置及び方法及びプログラムを提供することを目的とする。
図1は、本発明の原理構成図である。
本発明(請求項1)は、プログラムの動作の差異を発見するためのプログラム動作比較装置であって、
プログラムを実行するプログラム実行手段40と、
プログラム自身が関数の実行履歴を出力可能なように該プログラムの実行ファイルを変更し、プログラム実行手段40により、実行した該プログラムの実行履歴を取得して実行履歴記憶手段180に格納するプログラム実行履歴収集手段100と、
実行履歴記憶手段180のプログラムの実行履歴を、実行された該プログラムの関数コールスタックの深さと、出現パターンに基づいて関数コールシーケンスの局所を関数ブロックとして区切り、関数ブロック記憶手段250に格納するプログラム実行履歴分割手段200と、
関数ブロック記憶手段250の関数ブロックと、プログラム実行手段40により実行中のプログラムの関数コールシーケンスを比較し、異なる箇所を検出し、比較結果記憶手段370に格納する比較手段300と、を有する。
また、本発明(請求項2)は、プログラム実行履歴収集手段100において、
プログラムの実行履歴として取得する関数について、該関数についての情報を収集するためのプログラムの実行ファイルを変更する実行ファイル変更手段と、
取得する関数について、詳細な情報を取得するために必要となる値を取得するデバッグ情報取得手段と、
プログラムの実行ファイル内で定義されている関数や、ユーザが指定した共有ライブラリの関数について、該プログラムがプログラム実行手段により実行された時刻、関数名、引数、コールスタックの深さの情報を取得し、取得した情報を実行履歴記憶手段180に登録する実行履歴収集手段と、を有する。
また、本発明(請求項3)は、プログラム実行履歴分割手段200において、
実行履歴記憶手段180に格納されている履歴情報を読み込んで、関数の呼び出しのみに着目し、呼び出した関数のコールスタックの深さの値が小さくなったところで区切り、区切られた箇所を1つの関数ブロックとする実行履歴区分手段と、
関数ブロック内の関数がその実行順序も含め同一となる関数ブロックが存在するかを検索し、存在する場合は、その次の関数ブロックについても関数ブロック内の関数がその実行順序も含め、同一であるかを調べる処理を繰り返し、同一である関数ブロックが存在した場合には、その一連の長さが最も長い関数ブロックに対して、複数の関数ブロックを1つの関数ブロックとしてまとめ、関数ブロック記憶手段250に登録する手段と、
関数ブロック内の関数の引数、返り値が、全ての関数において同一か、同一の値を持つ関数が存在するか、全ての関数において異なっているかを関数と関連付けした関数ブロック記憶手段250に登録する手段と、を有する。
また、本発明(請求項4)は、比較手段300において、
関数ブロック記憶手段250から関数ブロックを読み出して、該関数ブロックとプログラム実行手段により実行中のプログラムの関数コールシーケンスを比較することにより、該実行中のプログラムの動作がユーザの想定した動作と異なる箇所を検出する手段と、
関数コールシーケンスのみの比較では異なる箇所が検出できなかった場合に、関数ブロック内の実行された関数の引数や返り値と、実行中のプログラムが実行した関数の引数や返り値を比較することにより、該実行中のプログラムの動作がユーザの想定した動作と異なる箇所を検出する手段と、を有する。
図2は、本発明の原理を説明するための図である。
本発明(請求項5)は、プログラムの動作の差異を発見するためのプログラム動作比較方法であって、
プログラム自身が関数の実行履歴を出力可能なように該プログラムの実行ファイルを変更し、該プログラムを実行する機能(プログラム実行手段)により、実行した該プログラムの実行履歴を取得して実行履歴記憶手段に格納するプログラム実行履歴収集ステップ(ステップ1)と、
実行履歴記憶手段のプログラムの実行履歴を、実行された該プログラムの関数コールスタックの深さと、出現パターンに基づいて関数コールシーケンスの局所を関数ブロックとして区切り、関数ブロック記憶手段に格納するプログラム実行履歴分割ステップ(ステップ2)と、
関数ブロック記憶手段の関数ブロックと、プログラムを実行する機能により実行中のプログラムの関数コールシーケンスを比較し、異なる箇所を検出し、比較結果記憶手段に格納する比較ステップ(ステップ3)と、を行う。
また、本発明(請求項6)は、プログラム実行履歴収集ステップ(ステップ1)において、
プログラムの実行履歴として取得する関数について、該関数についての情報を収集するためのプログラムの実行ファイルを変更する実行ファイル変更ステップと、
呼ばれた関数から呼び出し元に戻るときの時刻、呼ばれた関数内で変更された引数、返り値を取得するデバッグ情報取得ステップと、
プログラムの実行ファイル内で定義されている関数や、ユーザが指定した共有ライブラリの関数について、該プログラムがプログラムを実行する機能により実行された時刻、関数名、引数、コールスタックの深さの値、返り値を含む情報を取得し、取得した情報を実行履歴記憶手段に登録する実行履歴収集ステップと、を行う。
また、本発明(請求項7)は、プログラム実行履歴分割ステップ(ステップ2)において、
実行履歴記憶手段に格納されている履歴情報を読み込んで、関数の呼び出しのみに着目し、呼び出した関数のコールスタックの深さの値が小さくなったところで区切り、区切られた箇所を1つの関数ブロックとする実行履歴区分ステップと、
関数ブロック内の関数がその実行順序も含め同一となる関数ブロックが存在するかを検索し、存在する場合は、その次の関数ブロックについても関数ブロック内の関数がその実行順序も含め、同一であるかを調べる処理を繰り返し、同一である関数ブロックが存在した場合には、その一連の長さが最も長い関数ブロックに対して、複数の関数ブロックを1つの関数ブロックとしてまとめ、関数ブロック記憶手段に登録するステップと、
関数ブロック内の関数の引数、返り値が、全ての関数において同一か、同一の値を持つ関数が存在するか、全ての関数において異なっているかを関数と関連付けした関数ブロック記憶手段に登録するステップと、を行う。
また、本発明(請求項8)は、比較ステップ(ステップ3)において、
関数ブロック記憶手段から関数ブロックを読み出して、該関数ブロックとプログラムを実行する機能により実行中のプログラムの関数コールシーケンスを比較することにより、該実行中のプログラムの動作がユーザの想定した動作と異なる箇所を検出するステップと、
関数コールシーケンスのみの比較では異なる箇所が検出できなかった場合に、関数ブロック内の実行された関数の引数や返り値と、実行中のプログラムが実行した関数の引数や返り値を比較することにより、該実行中のプログラムの動作がユーザの想定した動作と異なる箇所を検出するステップと、を行う。
本発明(請求項9)は、請求項1乃至4のいずれか1項に記載のプログラム動作比較装置を構成する各手段としてコンピュータを機能させるためのプログラム動作比較プログラムである。
本発明によれば、プログラムが実行中にエラーが発生した場合に、このプログラムの実行情報を自動的に収集することにより、ユーザが能動的にプログラムの動作情報を収集する必要がなくなるため、エラーが発生してからバグを発見するまでの時間を短くすることができる。
以下、図面と共に本発明の実施の形態を説明する。
本発明は、プログラム実行履歴収集装置、プログラム実行履歴分割装置、プログラム実行履歴比較装置の各処理を行うことにより、エラーを発見してからそのバグを発見するまでの時間を短くすることを可能とする。具体的には、テストで使用する入力値といった、ユーザが出力結果まで想定できる入力値によって実行した実行履歴を取得し、その実行履歴とエラーが発生した実行履歴を比較することによって、エラーが発生してからバグを発見するまでの時間を短くすることができる。
以下、「関数コールシーケンス」とは、プログラムが実行した関数についての実行履歴であり、プログラムが実行されてから終了するまでの間に、実行された関数の順番である。
「特異性の高い関数」とは、同一プログラムによって作成された関数コールシーケンス内に呼び出し関係が同一となる関数が存在しない、または、最も実行率が低い関数のことである。特異性の高い関数ブロックについても、特異性の高い関数と同意である。
[プログラム実行履歴収集装置]
図3は、本発明の一実施の形態におけるプログラム実行履歴収集装置の構成を示す。
プログラム実行履歴収集装置100は、プログラム自身が自身のメモリ上のデータを出力するようにメモリにロードされた実行ファイル10を変更する。変更するタイミングは、メモリにロードされた直後(プログラムのmain関数が実行される前)、または、プログラムが実行中の場合は、OSの機能を使用してプログラムを停止させた時である。また、出力するデータは、実行された時刻、関数名、引数、返り値である。
同図に示すプログラム実行履歴収集装置(ロガー装置)100は、実行ファイル変更部110、デバッグ情報取得部120、実行履歴収集部130、実行履歴を取得する実行ファイルリスト140、シンボル情報格納部150、デバッグ情報格納部160、レジスタリスト170、実行履歴格納部180から構成される。また、同図の左側に従来の実行環境を示す。従来の実行環境は、メモリにロードされた実行ファイル10、プログラムの実行ファイル20、ライブラリの実行ファイル30、プログラム実行部40から構成されている。
まず、実行ファイル変更部110で行う処理手順を説明する。
図4は、本発明の一実施の形態における実行ファイル変更処理のフローチャートである。
ステップ110) まず、実行ファイル変更部110は、プログラム実行ファイル20内に定義されている関数の実行履歴を記録するか否か、ライブラリ実行ファイル30内のライブラリ関数を記録するか否か、さらに、ライブラリ内で定義されている関数の実行履歴を記録するか否かをユーザに問い合わせ、記録しない場合は、ステップ130に移行し、取得する場合は、ステップ120に移行する。
ステップ120) プログラム自身がプログラム実行履歴収集装置100(ロガー)に対して実行した実行ファイル内の関数に関する情報を出力するようにプログラムの実行ファイルを変更する。
ステップ130) ループAの処理として、まず、初期値i=0(増分1)、終値をユーザから指定されたアプリケーションを監視するライブラリ数とする。
ステップ140) プログラム自身がプログラム実行履歴収集装置100に対してライブラリのアプリケーションが実行された関数に関する情報を出力するように、プログラムの実行ファイル20を変更する。
ループAの処理として、i=i+1として、終値になるまで、ステップ140を繰り返す。
ステップ150) ループBとして、初期値i=0(増分1)、終値をユーザから指定されたライブラリ内に記述されている関数を監視するライブラリ数とする。
ステップ160) ユーザにより指定されたライブラリ自身がプログラム実行履歴収集装置100に対して実行したライブラリ内の関数に関する情報を出力するように、ライブラリの実行ファイル30を変更する。
ループbの処理として、i=i+1として、終値になるまで、ステップ160を繰り返す。
図5は、本発明の一実施の形態における実行ファイル変更部の概要動作のフローチャートである。
ステップ2010) ディスクからメモリに実行ファイル20をロードする。
ステップ2020) 実行ファイル20内に定義されている関数の実行履歴を取得する場合は、ステップ2030に移行し、取得しない場合は当該処理を終了する。
ステップ2030) ディスクから実行ファイルを読み出す。
ステップ2040) ループA'として、静的にリンクされる関数のシンボルテーブルの各レコードに対しての処理を行う。
ステップ2050) レコードがmain関数である場合は、ステップ2040に戻り、双でない場合は、ステップ2060に移行する。
ステップ2060) シンボル情報をシンボル情報格納部150に登録する。
ステップ2070) メモリにロードされた実行ファイル中に登録した関数を呼び出す機械語命令があるかを判定し、ある場合は、ステップ2080に移行し、ない場合は、ステップ20120に移行する。
ステップ2080) メモリにロードされた実行ファイルの関数を読み出す機械語命令を実行履歴収集部130を実行する命令と置き換える。
ステップ2090) シンボル情報格納部150に、メモリ上の実行ファイルを変更した箇所に着いての情報を登録する。
ステップ20100) メモリにロードされた実行ファイル中に、実行ファイルを変更した箇所へ分岐する機械語命令があるかを判定し、ある場合は、ステップ20110に移行し、ない場合は、ステップ2070に移行する。
ステップ20110) 分岐する命令を、変更処理にあわせ、分岐先のアドレスを修正し、ステップ20100に移行する。
ステップ20120) デバッグ情報取得部120(図8)の処理を行う。
これにより、プログラム実行部40がmain関数を実行して処理を終了する。
上記のプログラム実行履歴収集装置100の実行ファイル変更部110の処理を詳しく説明する。
図6は、本発明の一実施の形態における実行ファイル変更部の詳細動作のフローチャートである。
まず、実行ファイル変更部110に、実行履歴を取得する実行ファイルリストが格納されたメモリまたはディスク140から処理対象が選択されると、プログラムの実行ファイル20がロードされるものとする。
ステップ1210) ユーザがプログラムを起動すると、ディスクからメモリにプログラムをロードする。
ステップ1220) 実行履歴を取得する実行ファイルリスト(メモリ)140から実行ファイル20内に定義されている関数の実行履歴を取得するか否かの情報を取得する。なお、システムの環境変数から、実行ファイル20内に定義された関数を取得するか否かを取得する。このとき、以下の2つの情報も取得する。
・動的リンク時に使用するライブラリのAPIの実行履歴を取得するライブラリ名;
・動的リンクされるライブラリ内で定義されている関数の実行履歴を取得するライブラリ名:
ディスクに設定ファイルを作成し、設定ファイルからこれらの情報を読み出す方式にすることもできる。
ステップ1230) 実行ファイル20内に定義されている関数の実行履歴を取得するか否かの問い合わせとして、実行ファイル20の静的リンク(ELFの.symtabセクションに定義されている)関数の実行履歴を取得するか判定し、取得する場合はステップ1240に移行し、取得しない場合は処理を終了する。
ステップ1240) ディスクから実行ファイル20を読み出す。
ステップ1250) 次に、関数の静的シンボル情報についての処理として、ディスクから読み出した実行ファイル20内の静的シンボルテーブル(ELFの.symtabセクション)から関数に関するシンボル数を取得する(symnum←静的リンク関数の数)。
ステップ1260) 初期値をi=0とし、i=symnumとするループAの処理を行う。
ステップ1270) 静的シンボルテーブルのi番目のシンボル情報を取得する(symbol←i番目のシンボル情報)。
ステップ1280) symbolが関数のシンボル情報かを判定し、そうであればステップ1290に移行し、そうでない場合はステップ1260に移行する。
ステップ1290) symbol がmain関数のシンボル情報かを判定し、そうであれば、ステップ1260に移行し、そうでなければステップ12100に移行する。
ステップ12100) 取得したシンボル情報をシンボル情報格納部150に登録する。シンボル情報格納部150に登録する情報は、関数名とマッピングされるアドレスである。
ステップ12110) メモリにロードされた実行ファイル10のプログラムの機械語命令(ELFの.textセクション)内にシンボル情報格納部150に登録していない、symbolを呼び出す機械語命令(i.e. call命令、jmp命令等)があるかを判定し、ある場合は、ステップ12130に移行する。ない場合はステップ12170に移行する。
ステップ12120) メモリにロードされた実行ファイル10のsymbolを呼び出す機械語命令を実行履歴収集部130を実行する命令と置き換える。
ステップ12130) シンボル情報格納部150に以下の情報を登録する。
・symbolを呼び出す命令のアドレス;
・置き換えた元の機械語命令;
・置き換えた後のリターンアドレス(関数実行履歴取得部を実行する命令の次の命令のアドレス);
ステップ12140) 「置き換えた元の機械語命令」に、「置き換えた元の機械語命令」の次の命令のアドレスにジャンプする命令(jmp)を追加する。
ステップ12150) メモリにロードされた実行ファイル10のプログラムの機械語命令(ELFの.textセクション)内に置き換えられた命令にjmpする機械語命令があるかを判定し、ある場合は、ステップ12160に移行し、ない場合は、ステップ12110に移行する。
ステップ12160) メモリにロードされた実行ファイル10のジャンプ(jmp)する機械語命令のオペランドとなるアドレスの値を、シンボル情報格納部150に登録した「置き換えた元の機械語命令」のアドレスに置き換え、ステップ12150に戻る。
ステップ12170) デバッグ情報取得部120の処理を行い、プログラム実行部40がmain関数を実行して処理を終了する。
これにより出力される結果を図7に示す。シンボル情報格納部150には、関数名とマッピングされるアドレスが格納される。ここで、マッピングされるアドレスとしては、
・関数を呼び出す命令のアドレス;
・置き換えた元の機械語命令;
・置き換えた後のリターンアドレス;
等である。
次に、プログラム実行履歴収集装置100のデバック情報取得部120の動作を詳細に説明する。デバッグ情報取得部120は、実行された関数の引数、返り値の情報を、正確に取得するために必要となる情報(返り値や引数の型情報、引数の格納場所)を取得する処理部である。
なお、以下の説明における「実行ファイル」とは、プログラムの実行ファイル20、ライブラリの実行ファイル30の両者を指すものとする。
また、「コンパイルユニット」とは、ソースファイルの情報である。コンパイルユニットは、ソースファイルで定義されている関数、グローバル変数、構造体などについて、名前、型情報、使用するレジスタ、使用するメモリの位置などの情報が関連付けて格納されている。
当該デバッグ情報取得部120には、プログラムの実行のファイルが入力値となる。図10にデバッグ情報の例を示す。サンプルソースコード(a)をGCCでコンパイルした場合、func()のデバッグ情報は、(b)GCCが付加するfunc()についてのデバッグ情報(DWARF)となる。
図8は、本発明の一実施の形態におけるデバッグ情報取得部の概要動作のフローチャートである。
ステップ2110) ディスクから実行ファイル20,30を読み出す。
ステップ2120) 実行ファイル20,30にデバッグ情報が含まれているかを判定し、含まれている場合には、ステップ2130に移行し、含まれていない場合は当該処理を終了する。
ステップ2130) デバッグ情報格納部160にデバッグ位置情報を登録する。
ステップ2140) 登録していないコンパイルユニットの情報があるかを判定し、ある場合はステップ2150に移行し、ない場合は、当該処理を終了する。
ステップ2150) デバッグ情報格納部160に、コンパイルユニットのデバッグ情報を登録する。
ステップ2160) 取得したコンパイルユニットについて、登録していない関数の情報があるかを判定し、ある場合はステップ2170に移行し、無い場合はステップ2140に移行する。
ステップ2170) デバッグ情報格納部160に関数のデバッグ情報を登録する。
ステップ2180) 取得した関数について登録していない引数の情報があるかを判定し、ある場合はステップ2190に移行し、無い場合はステップ2160に移行する。
図9は、本発明の一実施の形態におけるデバッグ情報取得部の詳細動作のフローチャートである。
ステップ13010) ディスクから実行ファイル20,30を読み出す。
ステップ13020) 実行ファイル20,30にデバッグ情報が含まれているかを判定する。ここで、デバッグ情報とは、変数などの型情報であり、この情報が含まれているか否かを判定する。含まれている場合はステップ1330に移行し、含まれていない場合はその処理を終了する。
ステップ1330) 引数の値を正確に取得するため、実行中に格納場所が変更される場合の、引数の格納場所を示す情報を取得するために、実行ファイル20,30のデバッグ位置情報テーブル(.debug_locセクション)にデバッグ情報格納部160に登録されていないレコードがあるかを判定し、ある場合はステップ1340に移行し、ない場合はステップ1360に移行する。
ステップ1340) 登録されていないレコードを取得する。
ステップ1350) デバッグ情報格納部160に取得したレコード内の情報を登録し、ステップ303に戻る。登録する情報は、
・オフセット;
・有効アドレスの範囲;
・格納場所(レジスタ名、ベースポインタからの距離);
である。
ステップ1360) 引数の値を正確に取得するため、引数、返り値の型情報と、引数の格納場所を示す情報を取得する。このとき、実行ファイル20,30のデバッグ情報テーブル(.debug_infoセクション)に、デバッグ情報格納部160に登録していないコンパイルユニットレコードがあるかを判定し、ある場合はステップ1370に移行し、ない場合は処理を終了する。
ステップ1370) デバッグ情報テーブルから登録していないコンパイルユニットのレコードを取得する(cu←取得したコンパイルユニットのレコード)。
ステップ1380) デバッグ情報格納部160に、cu内の情報を登録する。登録する情報は、
・ソースファイル名;
・コンパイル時のディレクトリ名;
である。
ステップ1390) 実行ファイル20,30のデバッグ情報テーブル(.debug_infoセクション)にデバッグ情報格納部160に登録していないcuに関連付けて格納されている関数のレコードがあるかを判定し、ある場合はステップ13100に移行し、ない場合はステップ1360に移行する。
ステップ13100) cuに関連付けて格納されている関数のうち、登録していない関数のレコードを取得する(function←取得した関数のレコード)。
ステップ13110) デバッグ情報格納部160にfunction内の情報を登録し、ステップ13120に移行する。登録する情報は、
・関数名;
・マッピングされるアドレス範囲;
・ソースファイルに記述されている位置;
・返り値の型情報;
である。
ステップ13120) 実行ファイル20,30のデバッグ情報テーブル(.debug_infoセクション)にデバッグ情報格納部160に登録していないfunctionの引数のレコードがあるかを判定し、ある場合はステップ13130に移行し、ない場合は、ステップ1390に移行する。
ステップ13130) functionの引数のうち、登録していない引数のレコードを取得する(argument←取得した引数のレコード)。
ステップ13140) デバッグ情報格納部160にargument内の情報を登録し、ステップ13120に移行する。登録する情報は、
・引数名;
・ソースファイルに記述されている位置;
・型情報;
・値の格納場所(レジスタ名、ベースポインタからの距離、デバッグ位置情報テーブルのオフセット);
である。関数を実行中に格納場所が変更されない変数や引数の「値の格納場所」には、「レジスタ名」、「ベースポインタから距離」がデバッグ情報テーブルに登録されている。変更される変数や引数の「値の格納場所」には、「デバッグ位置情報テーブルのオフセット」がデバッグ情報に登録されている。「レジスタ」は、値が格納されているレジスタを示す。「ベースポインタからの距離」は、ベースポインタから距離、つまり、メモリ上の位置を示す。
上記の図9に示すデバッグ情報取得部120の処理により、図11に示すデータがデバッグ情報格納部160に格納される。
次に実行ファイル20,30を変更した後に、プログラムを実行し、実行履歴収集部130が実行履歴を取得する処理について説明する。
図12は、本発明の一実施の形態における実行履歴収集部の概要動作のフローチャートである。
ステップ2210) レジスタリスト170にプログラムの実行状態を保持する。
ステップ2220) 実行しているプログラムにデバッグ情報が付加されているかを判定し、付加されている場合には、ステップ2260に移行し、付加されていない場合はステップ2230に移行する。
ステップ2230) 実行履歴格納部180に実行した関数の情報を登録する。
ステップ2240) 保持したプログラムの状態を復元する。
ステップ2250) フックした関数に対してjmp命令を実行し、処理を終了する。
ステップ2260) ステップ2220において、実行しているプログラムにデバッグ情報が付加されている場合は、実行しようとした関数について、引数を取得する。
ステップ2270) 実行履歴格納部180に実行された引数の情報を登録する。
ステップ2280) 保持したプログラムの状態を保持する。
ステップ2290) フックした関数に対してcall命令を実行する。
ステップ22100) レジスタリスト170にプログラムの実行状態を保持する。
ステップ22110) 実行履歴格納部180に実行した関数についての情報を登録する。
ステップ22120) 保持したプログラムの状態を復元する。
ステップ22130) ret命令を実行し、当該処理を終了し、プログラム実行部に制御を移行する。
図13は、本発明の一実施の形態における実行履歴収集部の詳細動作のフローチャートである。
ステップ1410) プログラム実行部40が履歴を取得する関数を実行すると、実行履歴収集部130は、メモリ上のレジスタリスト170に汎用レジスタとインデックスレジスタを退避し、現状のプログラムの実行状態を保持する。
例えば、Intel x86アーキテクチャでは「汎用レジスタ」は、
−eax,ebx,ecx,edx
であり、「インデックスレジスタ」は、
−esi,edi
である。
ステップ1420) デバッグ情報がプログラムに付加されていたかを確認するために、デバッグ情報格納部160にフックされた関数のレコードが登録されているかを判定し、登録されている場合はステップ14110に移行し、登録されていない場合は、ステップ1430に移行する。
ステップ1430) シンボル情報格納部150からフックされた関数のレコードを読み出す。
ステップ1440) 実行された関数に関する情報として、情報を実行履歴格納部180に登録するために、読み出したレコードの関数名、マッピングされるアドレスを実行履歴格納部180に登録する。
ステップ1450) スタックレジスタ、ベースレジスタをSTART時の状態に戻す。
ステップ1460) レジスタリスト170から汎用レジスタとインデックスレジスタを復元する。
ステップ1470) 「置き換えた元の機械語命令」が2命令以上である場合は、ステップ1480に移行し、そうでない場合は、ステップ1490に移行する。
ステップ1480) メモリ上のスタックの戻り値を「置き換えた元の機械語命令」の実行履歴取得部を実行する命令の次の命令に変更する。
ステップ1490) フックした関数に対してjmp命令を実行する。これにより特定のプログラムの実行状態を復元する。
ステップ14110) ステップ1420において、デバッグ情報格納部160にフックされた関数のレコードが登録されている場合は、実行された関数の引数の値を取得するために、デバッグ情報格納部160から、フックした関数のレコード、フックした関数の引数のレコードを取得する。
ステップ14120) 値を取得していない引数のレコードがあるかを判定し、ある場合は、ステップ14130に移行し、ない場合はステップ14140に移行する。
ステップ14130) 取得した引数のレコードの情報を用いて、メモリ、または、レジスタリスト170から引数の値を取得し、ステップ14120に戻る。
ステップ14140) 実行された関数に関する情報を実行履歴格納部180に登録する。登録される情報は、
・フックした関数の関数名;
・フックした関数のマッピングされるアドレス;
・取得した引数;
である。
ステップ14150) 取得した引数のうち、「値の格納場所」がメモリ上となる引数があるかを判定し、ある場合は、ステップ14160に移行し、ない場合はステップ14180に移行する。
ステップ14160) スタックポインタレジスタの値を引数が格納されるサイズだけずらす。
ステップ14170) スタックポインタレジスタから次に関数を呼び出した後のベースポインタレジスタの値を推定し、メモリに保存する。
ステップ14180) 実行履歴取得部130がメモリに格納していない「値の格納場所」がメモリとなる引数があるかを判定し、ある場合はステップ14190に移行し、ない場合はステップ14200に移行する。
ステップ14190) 「値の格納場所」と、推定したベースポインタレジスタの値から、メモリの適切なアドレスに、取得した引数の値を格納し、ステップ14180に戻る。
ステップ14200) メモリ上のレジスタリスト170から汎用レジスタとインデックスレジスタを復元する。
ステップ14210) フックした関数に対してcall命令を実行する。
ステップ14220) 現状のプログラムの実行状態を保持するため、メモリ上のレジスタリスト170に、汎用レジスタとインデックスレジスタを退避する。
ステップ14230) 取得した関数のレコードを用いて、汎用レジスタ、または、浮動小数点レジスタから関数の返り値を取得する。
ステップ14240) プログラム実行履歴格納部180に、実行した関数を登録する。詳しくは、返り値を、ステップ14140で登録したレコードと関連付けて、プログラム実行履歴格納部180に登録する。
ステップ14250) メモリ上のスタックの戻り値を「置き換えた元の機械語命令」の2番目の命令に変更する。
ステップ14260) シンボル情報格納部150からフックされた関数のレコードを読み出す。
ステップ14270) 保持したプログラムの実行状態を復元するために、メモリ上のレジスタリスト170から汎用レジスタとインデックスレジスタを復元する。
ステップ14280) ret命令を実行し、プログラム実行部40に制御を移行する。
さらに、図4では、プログラム起動時にプログラムを変更しているが、実行中のプログラムに対しても、メモリにロードされた実行ファイル10に実行履歴を取得する処理を挿入することができる。挿入する処理を以下に示す。
図14は、本発明の一実施の形態における実行中のプログラムの実行ファイルを変更する処理のフローチャートである。
ステップ1910) まず、実行ファイル変更部110が、プログラムに対してシグナル(SIGSTOP)を配送することにより、実行プログラムを停止する。
ステップ1920) メモリにロードされた実行プログラムを変更する。
ステップ1930) 実行ファイル変更部110が、プログラムに対してシグナル(SIGCONT)を配送し、実行プログラムを継続する。
このとき、従来のデバッガでは、実行ファイルにブレークポイントを設定し、制御をデバッガに強制的に移行させる。しかし、本発明は、プログラム自身が関数の実行履歴を出力するように、プログラムの実行ファイルを変更することにより、ブレークポイントを設定して関数の実行履歴を出力するより、出力に必要となる時間を短くすることができる。
[プログラム実行履歴分割装置]
次に、プログラム実行履歴分割装置について説明する。
ユーザが出力結果まで想定できる入力値を用いて、プログラムを実行し、実行履歴を取得する。この取得した実行履歴を実行された関数のコールスタックの深さと、出現パターンに着目し、関数コールシーケンスの局所を関数ブロックと定義する。
以下に実行履歴の区分処理について説明する。
図15は、本発明の一実施の形態におけるプログラム実行履歴分割装置の構成を示す。
プログラム実行履歴分割装置200は、実行履歴を区分する処理を行う。この区分は、関数のコールスタックの深さの値が小さくなる箇所に着目している。それは、スタックのコールスタックの深さの値が、前後と比較し、最も大きくなる関数というのは、実行しているプログラムのサービスを提供するための処理であると言える。その前のコールスタックの深さの値が大きくなっていく部分の関数コールシーケンスは、このサービスを提供する関数の前処理をしている箇所であるといえる。そのため、関数のコールスタックの深さが小さくなる部分で区切り、これを関数ブロックとして扱う。このとき、関数ブロックのシーケンスにおいて、同一のシーケンスが存在した場合、同一のものが存在するシーケンスを1つの関数ブロックとする。当該関数ブロックをプログラムの出力パターンとする。
プログラム実行履歴分割装置200は、実行履歴読込み部210、実行履歴区分部220、関数ブロック生成部230、関数ブロック登録部240から構成される。
図16は、本発明の一実施の形態における実行履歴区分部の概要動作のフローチャートである。
ステップ2310) ループC'として、実行履歴格納部180から各実行履歴を読み出す。
ステップ2320) サービスを提供している処理を検索し、検索できた場合は、ステップ2330に移行し、検索できない場合は、次の実行履歴を読み出す。
ステップ2330) 検索されたサービスを提供している処理と、その前処理を1つの処理として関数ブロックテーブル250に登録する。
ステップ2340) ループC'が終了したら、最後の処理を関数ブロックテーブル250に登録する。
図17は、本発明の一実施の形態における実行履歴区分部の詳細動作のフローチャートである。
ステップ310) 初期値として、id=0,head=0とする。
ステップ320) 初期値i=0(増分1)、終値を、取得したプログラムの実行履歴に含まれる関数の個数とし、以下のループ(ループC)処理を行う。
ステップ330) 実行履歴格納部180から実行履歴が読み込まれると、実質的にサービスを提供している処理を検索するために、関数のi番目に呼ばれた関数より(i+1)番目に呼ばれた関数の方がコールスタックの深さが浅いかを判定し、浅い場合はステップ340に移行し、深い場合は、終値(取得したプログラムの実行履歴に含まれる関数の個数)になるまでステップ320に移行する。
ステップ350) id=id+1,head=i+1とし、ステップ330の処理を繰り返す。
ステップ360) head番目からi番目に呼ばれた関数を1つのブロックとし、関数ブロックID番号をidとして、関数ブロックテーブル250に登録する。
上記の具体例として、サンプルソースコードと、このコードを実行したときの関数コールシーケンスの区切り方を図18に示す。このとき、関数コールシーケンスを区切った箇所を関数ブロックとする。
関数ブロック生成部230は、比較対象となる関数パターンを生成する。上記で作成した関数ブロックについて、複数回実行される処理を検索し、比較対象となる関数パターンを1つの関数ブロックにすることによって、関数パターンを削減する。また、複数回繰り返される処理を関数ブロックにすることにより、その処理が一連の処理であるという信頼性を高めることができる。
関数ブロック同士を比較し、関数ブロック内の関数が順序も含め同一である関数ブロックを検索する。さらに、一致した関数ブロックの次の関数ブロックについても関数ブロック内の関数が順序も含め同一の関数ブロックであるか調べ、この調べる処理を同一の関数ブロックである間、繰り返す。同一の関数ブロックが存在する場合、同一であった一連の関数ブロックを1つの関数ブロックとして扱う。さらに、作成した関数ブロックには、関数ブロックを一意に特定できる関数ブロックIDを付与する。この処理を図19、20に示す。
図19は、本発明の一実施の形態における関数ブロック生成部の概要動作のフローチャートである。
ステップ2410) ループD'として、図16で作成した各関数ブロックに対しての処理を行う。
ステップ2420) 関数の実行パターンとして、関数ブロックを作成する。
ステップ2430) 作成した関数ブロックを関数ブロックテーブル250に登録する。
全ての関数ブロックを処理するまで、ループD'として、上記の処理を繰り返す。
上記の動作を以下で詳細に説明する。
図20は、本発明の一実施の形態における関数ブロック生成部の詳細動作のフローチャートである。以下では、関数ブロック生成部230内のメモリに、図21(b)に示すような関数ブロック一致リストを有するものとする。
ステップ410) id=関数ブロックの個数とする。
ステップ420) 初期値としてi=0(増分1)、終値をidとする。
ステップ430) 関数ブロック一致リストを初期化する。
ステップ440) ループEの初期値としてk=i(増分1)、終値をidとする。
ステップ450) 関数ブロックID番号がiの関数ブロックと、関数ブロックID番号がkの関数ブロックを比較し、ブロック内の関数名が順序も含め、完全に一致するか判定し、一致する場合は、ステップ460に移行し、ループEの処理を繰り返す。
ステップ460) ループFの初期値としてnum=1(増分1)、終値=(k−1)とする。
ステップ470)関数ブロックID番号が(i+num)の関数ブロックと関数ブロックID番号が(k+num)の関数ブロックを比較し、ブロック内の関数名が順序も含め、完全に一致するか判定し、一致する場合は、num=num+1とし、ループFの処理を終値(num=k-1)になるまで繰り返し、不一致の場合はステップ480に移行する。
ステップ480) 関数ブロック一致リストにIDがkの関数ブロックと、一致したブロック個数であるnumの値を登録したノードを追加し、ループEの処理をk=idとなるまで繰り返す。
ステップ490) 関数ブロック一致リストにノードがあるかを判定し、ある場合は、ステップ4100に移行し、ない場合は、ループDの処理をi=idになるまで繰り返す。
ステップ4100) 関数ブロック一致リストの各ノードを比較し、関数ブロックID番号がiの関数ブロックと、最も長く一致した関数ブロックについて、一致したブロック数を1つのブロックとして連結させたものを1つのブロックとする。
ステップ4110) 連結したブロックに対応するブロックを削除し、作成したブロックを関数ブロックテーブル250に登録する。 ループDの処理として、i=i+1とし、i=idとなるまで、ループDの処理を繰り返す。
図21(b)に示す関数ブロック一致リストは、この検索した結果が登録されたものである。この関数ブロック一致リストを用いて、複数の関数ブロックを1つに纏めるか否かを判断する。図21(a)のシーケンス2は、関数ブロック一致リストを用いて、複数のブロックを1つのブロックに纏めた結果となる関数ブロックシーケンスであり、これが関数ブロック登録部240を介して関数ブロックテーブル250に登録される。
上記のプログラム実行履歴分割装置200では、プログラムが実行した関数コールシーケンスをユーザにとって意味のある処理単位で区切ることにより、どの処理にバグが存在するのか、ユーザに知らせることができる。そのため、デバッグのためにユーザがソースコードを見る範囲を絞らせることができ、バグを発見するまでの時間を短くすることの手助けとなる。
[プログラム実行履歴比較装置]
上記のプログラム実行履歴分割装置200によって作成した関数ブロックが、ユーザが想定しているプログラムの実行結果であると定義する。このため、エラーが発生したプログラムの関数コールシーケンスに、作成した関数ブロックとは異なる関数が実行されている箇所、これらの箇所においても、関数の呼び出し関係が同一となる関数が存在しない関数、特異性が高い関数にバグが存在する可能性が高い。これは、プログラムのバグとは、開発者の想定していない入力値がプログラムに入力されることによって、顕在化するためである。さらに、プログラムの開発や検証で使用している計算機の性能と、このプログラムを実行している計算機の性能が異なることによっても顕在化する。
以下、特異性が高い関数を検索するためのプログラム実行履歴比較装置について説明する。
プログラム実行履歴比較装置は、プログラム実行履歴分割装置200で作成したプログラムの出力パターンと、エラーが発生したプログラムの出力を比較する。このとき、出力パターンが存在せず、かつ、エラーが発生したプログラムの出力中にも、複数存在しないコールパターンを検索し、出現頻度が低い関数コールパターンを、強調して表示する。
図22は、本発明の一実施の形態におけるプログラム実行履歴比較装置の構成を示す。
同図に示すプログラム実行履歴比較装置300は、関数ブロック読込み部310、プログラム実行履歴収集部320、実行履歴データ格納部330、関数ブロックと実行履歴の比較部340、関数ブロック登録部350、関数登録部360、比較結果格納テーブル370から構成される。
図23は、本発明の一実施の形態におけるプログラム実行履歴比較装置の動作を示す図である。
ステップ810) 関数ブロック読込み部310は、関数ブロックテーブル250から作成したテーブルを読み込む。
ステップ820) 次に、プログラム実行部40で関数ブロックを作成したプログラムと同一のプログラムが実行されると、プログラム実行履歴収集部320は、プログラムの実行履歴を取得できるかを判定し、できる場合はステップ830に移行し、取得でできない場合は、プログラムの実行履歴と関数ブロックの比較処理を終了する。
ステップ830) プログラム実行履歴収集部320は、プログラムの実行履歴を取得する。
ステップ840) 実行履歴データ格納部330は、取得した実行履歴の、実行された時刻、関数名、引数、返り値、コールスタックの深さを取得し、格納する。
ステップ850) 関数ブロックと実行履歴の比較部340は、読み込んだ関数ブロックと、実行履歴データ格納部330から取得した関数実行シーケンスを比較し、一致する場合は、ステップ860に移行し、一致しない場合は、ステップ870に移行する。
ステップ860) 一致する場合は、一致した関数ブロックと関数ブロック内の関数に関する情報を比較結果格納テーブルに370に格納する。
ステップ870) 一致しない場合は、実行された関数に関する情報(コールスタックの深さ、関数名、引数、返り値)を比較結果格納テーブル370に格納する。
これにより、実行中のプログラムにプログラムエラーが発生した場合は、この比較結果格納テーブル370から特異性の高い関数、または、関数ブロックを選択し、ユーザに提示する。
次に、比較結果格納テーブル370に、関数と関数ブロックが登録された場合と関数ブロックのみが登録された場合について説明する。
図24は、本発明の一実施の形態における比較結果格納テーブルに関数と関数ブロックが登録された場合の例を示す。
図24では、関数ブロックと関数実行シーケンスを比較した結果、一致する関数ブロックと、関数ブロックに一致しなかった関数に分類された場合の特異性の高い関数の発見手段である。特異性の高い関数は、関数ブロックと一致しない箇所にあると考えられる。そのため、関数ブロックと一致しなかった関数の中から、特異性の高い関数を選択する。これらの関数の中においても、呼び出し関係が同一となる実行パスが存在するか否かを検索する。図24では、関数A⇒関数Bという実行パスが同一となる箇所と、関数Cのみがブロックの間に挟まれて存在する箇所がある。このとき、複数実行されている関数A⇒関数Bという実行パスより、1回のみ実行されている関数Cの特異性の方が低いと考えられる。ユーザに特異性が低い箇所から順に提示することよって、バグが存在する関数をより早く提示することができる。
図25は、本発明の一実施の形態における比較結果格納テーブルに関数ブロックのみが登録された場合の例を示す。
図25の例は、関数ブロックと関数実行シーケンスを比較した結果、その結果が関数ブロックのみに分類された場合における、特異性の高い関数の発見手段である。実行回数が最小値となる関数ブロックを検索する。図25では、関数ブロックA,B,Cのうち、関数ブロックCが実行回数が最も少ない。そのため、関数ブロックCの特異性が高いと定義できる。関数ブロックC内のどの関数の特異性が高いかの判断は、引数、返り値を比較し、それぞれの値が、関数ブロックテーブル250に登録されていた値と同一であるか否かによってその特異性の高さを判断する。
上記のプログラム実行履歴分割装置200は、ユーザが出力結果まで想定できる入力値によって実行した実行履歴を取得し、プログラムの実行履歴の出力パターンを検出する。次に、プログラム実行履歴比較装置300において、プログラム実行履歴分割装置200で作成されたプログラムの出力パターンと、エラーが発生したプログラムの出力中にも、出現頻度の低い関数コールパターンを検索し、該関数コールパターンを強調して表示する。これにより、デバッグを行うユーザのスキルに依存せず、エラーが発生してから、このエラーに対応するソースコード上のバグを発見するまでの時間を短くできる。
なお、上記のプログラム実行履歴収集装置、プログラム実行履歴分割装置、プログラム実行履歴比較装置を一つのデバッグ支援装置として構築することが可能である。
また、プログラム実行履歴収集装置、プログラム実行履歴分割装置、プログラム実行履歴比較装置の動作をプログラムとして構築し、プログラム実行履歴収集装置、プログラム実行履歴分割装置、プログラム実行履歴比較装置からなる装置として利用されるコンピュータにインストールして実行させる、または、ネットワークを介して流通させることが可能である。
また、構築されたプログラムをハードディスク装置や、フレキシブルディスク・CD−ROM等の可搬記憶媒体に格納し、コンピュータにインストールする、または、配布することが可能である。
なお、本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において種々変更・応用が可能である。
本発明は、プログラムの開発・実行におけるデバッグに適用可能である。
また、プログラムのバージョンアップの前と後や、プログラムの動作環境変更の前と後のプログラムの動作の差異を検出して、デグレーションの発生を自動検出する技術等にも適用可能である。
本発明の原理構成図である。 本発明の原理を説明するための図である。 本発明の一実施の形態におけるプログラム実行履歴収集装置の構成図である。 本発明の一実施の形態における実行ファイル変更処理のフローチャートである。 本発明の一実施の形態における実行ファイル変更部の概要動作のフローチャートである。 本発明の一実施の形態における実行ファイル変更部の詳細動作のフローチャートである。 本発明の一実施の形態におけるシンボル情報格納部に格納されるデータの例である。 本発明の一実施の形態におけるデバッグ情報取得部の概要動作のフローチャートである。 本発明の一実施の形態におけるデバッグ情報取得部の詳細動作のフローチャートである。 本発明の一実施の形態における付加されるデバッグ情報(図9に対する入力値)の例である。 本発明の一実施の形態におけるデバッグ情報格納部に格納されるデータである。 本発明の一実施の形態における実行履歴収集部の概要動作のフローチャートである。 本発明の一実施の形態における実行履歴収集部の詳細動作のフローチャートである。 本発明の一実施の形態における実行中のプログラムの実行ファイルを変更する処理のフローチャートである。 本発明の一実施の形態におけるプログラム実行履歴分割装置の構成図である。 本発明の一実施の形態における実行履歴区分部の概要動作のフローチャートである。 本発明の一実施の形態における実行履歴区分部の詳細動作のフローチャートである。 本発明の一実施の形態における実行履歴区分部の関数コールシーケンスの区切り方の例である。 本発明の一実施の形態における関数ブロック生成部の概要動作のフローチャートである。 本発明の一実施の形態における関数ブルック生成部の詳細動作のフローチャートである。 本発明の一実施の形態における関数ブロック生成の例である。 本発明の一実施の形態におけるプログラム実行履歴比較装置の構成図である。 本発明の一実施の形態におけるプログラム実行履歴比較装置の概要動作のフローチャートである。 本発明の一実施の形態における比較結果格納テーブルに関数と関数ブロックが登録された場合の例である。 本発明の一実施の形態における比較結果格納テーブルに関数ブロックのみが登録された場合の例である。
符号の説明
10 メモリにロードされた実行ファイル
20 プログラムの実行ファイル
30 ライブラリの実行ファイル
40 プログラム実行手段、プログラム実行部
100 プログラム実行履歴収集手段、プログラム実行履歴収集装置
110 実行ファイル変更部
120 デバッグ情報取得部
130 実行履歴収集部
140 実行履歴を取得する実行ファイルリスト(メモリまたはディスク)
150 シンボル情報格納部(メモリ)
160 デバッグ情報格納部(メモリ)
170 レジスタリスト(メモリ)
180 実行履歴記憶手段、実行履歴格納部
200 プログラム実行履歴分割手段、プログラム実行履歴分割装置
210 実行履歴読込み部
220 実行履歴区分部
230 関数ブロック生成部
240 関数ブロック登録部
250 関数ブロック記憶手段、関数ブロックテーブル
300 比較手段、プログラム実行履歴比較装置
310 関数ブロック読込み部
320 プログラム実行履歴収集部
330 実行履歴データ格納部
340 関数ブロックと実行履歴の比較部
350 関数ブロック登録部
360 関数登録部
370 比較結果記憶手段、比較結果格納テーブル

Claims (9)

  1. プログラムの動作の差異を発見するためのプログラム動作比較装置であって、
    プログラムを実行するプログラム実行手段と、
    プログラム自身が関数の実行履歴を出力可能なように該プログラムの実行ファイルを変更し、前記プログラム実行手段により、実行した該プログラムの実行履歴を取得して実行履歴記憶手段に格納するプログラム実行履歴収集手段と、
    前記実行履歴記憶手段のプログラムの実行履歴を、実行された該プログラムの関数コールスタックの深さと、出現パターンに基づいて関数コールシーケンスの局所を関数ブロックとして区切り、関数ブロック記憶手段に格納するプログラム実行履歴分割手段と、
    前記関数ブロック記憶手段の前記関数ブロックと、前記プログラム実行手段により実行中のプログラムの関数コールシーケンスを比較し、異なる箇所を検出し、比較結果記憶手段に格納する比較手段と、
    を有することを特徴とするプログラム動作比較装置。
  2. 前記プログラム実行履歴収集手段は、
    プログラムの実行履歴として取得する関数について、該関数についての情報を収集するためのプログラムの実行ファイルを変更する実行ファイル変更手段と、
    取得する関数について詳細な情報を取得するために必要となる値を取得するデバッグ情報取得手段と、
    プログラムの実行ファイル内で定義されている関数や、ユーザが指定した共有ライブラリの関数について、該プログラムが前記プログラム実行手段により実行された時刻、関数名、引数、コールスタックの深さの値、返り値を含む情報を取得し、取得した情報を実行履歴記憶手段に登録する実行履歴収集手段と、
    を有する請求項1記載のプログラム動作比較装置。
  3. 前記プログラム実行履歴分割手段は、
    前記実行履歴記憶手段に格納されている履歴情報を読み込んで、関数の呼び出しのみに着目し、呼び出した関数のコールスタックの深さの値が小さくなったところで区切り、区切られた箇所を1つの関数ブロックとする実行履歴区分手段と、
    前記関数ブロック内の関数がその実行順序も含め同一となる関数ブロックが存在するかを検索し、存在する場合は、その次の関数ブロックについても関数ブロック内の関数がその実行順序も含め、同一であるかを調べる処理を繰り返し、同一である関数ブロックが存在した場合には、その一連の長さが最も長い関数ブロックに対して、複数の関数ブロックを1つの関数ブロックとしてまとめ、前記関数ブロック記憶手段に登録する手段と、
    前記関数ブロック内の関数の引数、返り値が、全ての関数において同一か、同一の値を持つ関数が存在するか、全ての関数において異なっているかを関数と関連付けした前記関数ブロック記憶手段に登録する手段と、
    を有する請求項1記載のプログラム動作比較装置。
  4. 前記比較手段は、
    前記関数ブロック記憶手段から前記関数ブロックを読み出して、該関数ブロックと前記プログラム実行手段により実行中のプログラムの関数コールシーケンスを比較することにより、該実行中のプログラムの動作がユーザの想定した動作と異なる箇所を検出する手段と、
    前記関数コールシーケンスのみの比較では異なる箇所が検出できなかった場合に、関数ブロック内の実行された関数についての情報と、前記実行中のプログラムが実行した関数についての情報を比較することにより、該実行中のプログラムの動作がユーザの想定した動作と異なる箇所を検出する手段と、
    を有する請求項1記載のプログラム動作比較装置。
  5. プログラムの動作の差異を発見するためのプログラム動作比較方法であって、
    プログラム自身が関数の実行履歴を出力可能なように該プログラムの実行ファイルを変更し、該プログラムを実行する機能により、実行した該プログラムの実行履歴を取得して実行履歴記憶手段に格納するプログラム実行履歴収集ステップと、
    前記実行履歴記憶手段のプログラムの実行履歴を、実行された該プログラムの関数コールスタックの深さと、出現パターンに基づいて関数コールシーケンスの局所を関数ブロックとして区切り、関数ブロック記憶手段に格納するプログラム実行履歴分割ステップと、
    前記関数ブロック記憶手段の前記関数ブロックと、前記プログラムを実行する機能により実行中のプログラムの関数コールシーケンスを比較し、異なる箇所を検出し、比較結果記憶手段に格納する比較ステップと、
    を行うことを特徴とするプログラム動作比較方法。
  6. 前記プログラム実行履歴収集ステップにおいて、
    プログラムの実行履歴として取得する関数について、該関数を取得するためのプログラムの実行ファイルを変更する実行ファイル変更ステップと、
    呼ばれた関数から呼び出し元に戻るときの時刻、呼ばれた関数内で変更された引数、返り値を取得するデバッグ情報取得ステップと、
    プログラムの実行ファイル内で定義されている関数や、ユーザが指定した共有ライブラリの関数について、該プログラムが前記プログラムを実行する機能により実行された時刻、関数名、引数、コールスタックの深さの値、返り値を含む情報を取得し、取得した情報を実行履歴記憶手段に登録する実行履歴収集ステップと、
    を行う請求項5記載のプログラム動作比較方法。
  7. プログラム実行履歴分割ステップにおいて、
    前記実行履歴記憶手段に格納されている履歴情報を読み込んで、関数の呼び出しのみに着目し、呼び出した関数のコールスタックの深さの値が小さくなったところで区切り、区切られた箇所を1つの関数ブロックとする実行履歴区分ステップと、
    前記関数ブロック内の関数がその実行順序も含め同一となる関数ブロックが存在するかを検索し、存在する場合は、その次の関数ブロックについても関数ブロック内の関数がその実行順序も含め、同一であるかを調べる処理を繰り返し、同一である関数ブロックが存在した場合には、その一連の長さが最も長い関数ブロックに対して、複数の関数ブロックを1つの関数ブロックとしてまとめ、前記関数ブロック記憶手段に登録するステップと、
    前記関数ブロック内の関数の引数、返り値が、全ての関数において同一か、同一の値を持つ関数が存在するか、全ての関数において異なっているかを関数と関連付けした前記関数ブロック記憶手段に登録するステップと、
    を行う請求項5記載のプログラム動作比較方法。
  8. 前記比較ステップにおいて、
    前記関数ブロック記憶手段から前記関数ブロックを読み出して、該関数ブロックと前記プログラムを実行する機能により実行中のプログラムの関数コールシーケンスを比較することにより、該実行中のプログラムの動作がユーザの想定した動作と異なる箇所を検出するステップと、
    前記関数コールシーケンスのみの比較では異なる箇所が検出できなかった場合に、関数ブロック内の実行された関数の引数や返り値と、前記実行中のプログラムが実行した関数の引数や返り値を比較することにより、該実行中のプログラムの動作がユーザの想定した動作と異なる箇所を検出するステップと、
    を行う請求項5記載のプログラム動作比較方法。
  9. 請求項1乃至4のいずれか1項に記載のプログラム動作比較装置を構成する各手段としてコンピュータを機能させるためのプログラム動作比較プログラム。
JP2008087886A 2008-03-28 2008-03-28 プログラム動作比較装置及び方法及びプログラム Expired - Fee Related JP4763743B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2008087886A JP4763743B2 (ja) 2008-03-28 2008-03-28 プログラム動作比較装置及び方法及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008087886A JP4763743B2 (ja) 2008-03-28 2008-03-28 プログラム動作比較装置及び方法及びプログラム

Publications (2)

Publication Number Publication Date
JP2009244969A JP2009244969A (ja) 2009-10-22
JP4763743B2 true JP4763743B2 (ja) 2011-08-31

Family

ID=41306815

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008087886A Expired - Fee Related JP4763743B2 (ja) 2008-03-28 2008-03-28 プログラム動作比較装置及び方法及びプログラム

Country Status (1)

Country Link
JP (1) JP4763743B2 (ja)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6006577B2 (ja) * 2012-08-01 2016-10-12 株式会社日立システムズ デグレードテスト支援システム、デグレードテスト支援方法及びデグレードテスト支援プログラム
US10380342B2 (en) * 2016-07-29 2019-08-13 Qualcomm Incorporated Kernel-based detection of target application functionality using virtual address mapping
KR102496539B1 (ko) * 2020-12-15 2023-02-06 현대오토에버 주식회사 소프트웨어 검증 방법 및 이를 위한 장치

Also Published As

Publication number Publication date
JP2009244969A (ja) 2009-10-22

Similar Documents

Publication Publication Date Title
Sridharan et al. Thin slicing
US6430741B1 (en) System and method for data coverage analysis of a computer program
Blazytko et al. {AURORA}: Statistical crash analysis for automated root cause explanation
US10019240B2 (en) Method and apparatus for detecting code change
Scott et al. Minimizing faulty executions of distributed systems
US7536678B2 (en) System and method for determining the possibility of adverse effect arising from a code change in a computer program
US20080028378A1 (en) Utilizing prior usage data for software build optimization
WO2016138953A1 (en) A method for identifying a cause for a failure of a test
JP6342129B2 (ja) 混合モードプログラムのソースコードエラー位置検出装置及び方法
CN103559123A (zh) 基于VxWorks操作系统的函数调用栈分析方法及装置
JP6303749B2 (ja) ソフトウェアプログラムを解析する方法及びシステム並びに非一時的なコンピュータ可読媒体
CN107220175B (zh) 应用程序死循环定位方法、装置、计算机设备和存储介质
JP2017167984A (ja) 情報処理装置、情報処理プログラムおよび検査システム
US9189372B2 (en) Trace coverage analysis
JP4763743B2 (ja) プログラム動作比較装置及び方法及びプログラム
CN112433706B (zh) 编译选项调优方法、装置、处理器芯片及服务器
KR102165747B1 (ko) 보안성을 고려한 경량 크래시 리포트 기반 디버깅 방법
Xin et al. An automation-assisted empirical study on lock usage for concurrent programs
Bai et al. Effective detection of sleep-in-atomic-context bugs in the Linux kernel
JP2005338987A (ja) 例外テスト支援プログラム及び例外テスト支援装置
TWI484413B (zh) 基於功能性的程式比較方法
Mahmud et al. Acid: an api compatibility issue detector for android apps
JP5891976B2 (ja) コンパイル実行・管理方法、装置、及びプログラム
JP4869581B2 (ja) カバレッジ計測システム及びそのプログラム
JP2017041196A (ja) スタブ化対象判定装置、方法、及びプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20100208

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20110531

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20110607

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20110609

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140617

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

S531 Written request for registration of change of domicile

Free format text: JAPANESE INTERMEDIATE CODE: R313531

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

LAPS Cancellation because of no payment of annual fees