JP6069719B2 - ソフトウェアデバッグ方法、情報処理装置およびプログラム - Google Patents

ソフトウェアデバッグ方法、情報処理装置およびプログラム Download PDF

Info

Publication number
JP6069719B2
JP6069719B2 JP2015529270A JP2015529270A JP6069719B2 JP 6069719 B2 JP6069719 B2 JP 6069719B2 JP 2015529270 A JP2015529270 A JP 2015529270A JP 2015529270 A JP2015529270 A JP 2015529270A JP 6069719 B2 JP6069719 B2 JP 6069719B2
Authority
JP
Japan
Prior art keywords
information
instruction
cpu
area
address
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.)
Active
Application number
JP2015529270A
Other languages
English (en)
Other versions
JPWO2015015591A1 (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.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
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 Fujitsu Ltd filed Critical Fujitsu Ltd
Application granted granted Critical
Publication of JP6069719B2 publication Critical patent/JP6069719B2/ja
Publication of JPWO2015015591A1 publication Critical patent/JPWO2015015591A1/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging

Description

本発明はソフトウェアデバッグ方法、情報処理装置およびプログラムに関する。
コンピュータで実行されるソフトウェアが途中で異常停止・異常終了するなど、ソフトウェアの動作に仕様と異なる不具合(バグ)が含まれていることがあり、その不具合を検出し修正するためにデバッグ作業が行われる。デバッグ作業では、不具合の発生状況を示す情報(例えば、エラーログやメモリダンプなど)を収集し、収集した情報を分析してその不具合の原因を特定し、ソフトウェアの修正(例えば、ソースコードの書き換え)を行う。
ここで、複数のプロセッサ(プロセッサコアと呼ばれるものを含む)でソフトウェアを並列に動作させる場合、1つのプロセッサのみでソフトウェアを動作させる場合とは異なる環境条件によって不具合が発生し得る。そのような不具合の原因の一例として、メモリ上の領域に対する排他制御の不備が挙げられる。メモリ上の領域を使用するとき適切にロックが獲得されないと、2つ以上のプロセッサが同時期に同じメモリアドレスの領域にアクセスし、あるプロセッサの使用するデータが他のプロセッサによって意図せず書き換えられてしまうことがある。
例えば、あるプロセッサが、ある変数に一時的に値を代入してからその値を読み出すとする。変数への値の代入と変数からの値の読み出しの間に、排他制御が適切に行われずに他のプロセッサによって当該変数の値が書き換えられてしまうと、当該プロセッサの処理で異常が発生することがある。このような排他制御の不備に基づく不具合は、各プロセッサにおける命令の実行タイミングにも依存するため再現率が低くなることがあり、デバッグ作業においてその原因を特定することが容易でないことが多い。
そこで、例えば、ソフトウェアとしてのシミュレータ上に、仮想的なプロセッサや仮想的なメモリなどのハードウェアモデルを構築し、シミュレータ上で並列プログラムを実行するシミュレーション方法が提案されている。このシミュレーション方法では、シミュレータ上で並列プログラムを実行する間、仮想的なメモリモニタが、各プロセッサからメモリへのアクセスについての情報を収集する。そして、メモリモニタが、収集した情報に基づいて、複数のプロセッサが重複してアクセスしたメモリ領域を特定する。
また、例えば、プロセッサおよびメモリが接続されたバスに、ハードウェアとしてのメモリ監視回路を設けたデータ処理装置が提案されている。このメモリ監視回路は、ユーザから指定された所定のアドレス範囲の領域について、メモリへのアクセスを監視する。メモリ監視回路は、データ書込用のカウンタとデータ読込用のカウンタとを有し、所定のアドレス範囲の領域に対するデータ書込およびデータ読込の回数をそれぞれカウントする。カウンタの値は、メモリ監視回路から分析ロジックに出力される。
特開2009−32197号公報 特開2010−20767号公報
しかし、メモリアクセスの情報を収集して排他制御の不備を判定するために、上記のような特殊なシミュレーション環境または特殊なハードウェアを使用することは、デバッグ作業の負担が大きくなることがあるという問題がある。デバッグ作業時の環境によっては、デバッグ対象のソフトウェアが動作する本番システムまたは本番環境と同等のハードウェア構成のシステムのもとで、デバッグ作業を実施したいことがある。
1つの側面では、本発明は、メモリに対する排他制御の不備の判定を容易にするソフトウェアデバッグ方法、情報処理装置およびプログラムを提供することを目的とする。
1つの態様では、複数のプロセッサを含むコンピュータが実行するソフトウェアデバッグ方法が提供される。第1および第2のプロセッサそれぞれが、命令の実行を制御する制御ソフトウェアを用いて、デバッグするソフトウェアに含まれる命令を実行する。第1のプロセッサが、メモリに対するデータ書込またはデータ参照を示す第1の命令を実行するとき、第1の命令に応じた第1の履歴情報を生成する。第2のプロセッサが、メモリに対するデータ書込を示す第2の命令を実行するとき、第2の命令に応じた第2の履歴情報を生成する。第1のプロセッサが、第2の履歴情報を取得し、第1および第2の履歴情報に基づいて、メモリ上の領域に対する排他制御の不備を判定する。
また、1つの態様では、命令の実行を制御する制御ソフトウェアを用いて、デバッグするソフトウェアに含まれる命令を実行する第1および第2のプロセッサと、第1および第2のプロセッサからアクセスされるメモリと、を有する情報処理装置が提供される。第1のプロセッサは、メモリに対するデータ書込またはデータ参照を示す第1の命令を実行するとき、第1の命令に応じた第1の履歴情報を生成する。第2のプロセッサは、メモリに対するデータ書込を示す第2の命令を実行するとき、第2の命令に応じた第2の履歴情報を生成する。第1のプロセッサは、第2の履歴情報を取得し、第1および第2の履歴情報に基づいて、メモリ上の領域に対する排他制御の不備を判定する。
また、1つの態様では、複数のプロセッサを含むコンピュータに、次の処理を実行させるプログラムが提供される。第1および第2のプロセッサそれぞれにおいて、デバッグするソフトウェアに含まれる命令が実行されるように制御する。第1のプロセッサを用いて、メモリに対するデータ書込またはデータ参照を示す第1の命令が実行されるとき、第1の命令に応じた第1の履歴情報を生成する。第2のプロセッサを用いて、メモリに対するデータ書込を示す第2の命令が実行されるとき、第2の命令に応じた第2の履歴情報を生成する。第1のプロセッサを用いて、第2の履歴情報を取得し、第1および第2の履歴情報に基づいて、メモリ上の領域に対する排他制御の不備を判定する。
1つの側面では、メモリに対する排他制御の不備の判定が容易になる。
本発明の上記および他の目的、特徴および利点は本発明の例として好ましい実施の形態を表す添付の図面と関連した以下の説明により明らかになるであろう。
第1の実施の形態の情報処理装置を示す図である。 情報処理装置のハードウェア例を示すブロック図である。 ソフトウェアの階層例を示す図である。 データ書込時の排他制御不備の例を示す図である。 データ書込時の排他制御不備の検出例を示すシーケンス図である。 排他制御不備の有無の判定例を示す図である。 情報処理装置の機能例を示すブロック図である。 第2の実施の形態の制御情報の全体構造例を示す図である。 第2の実施の形態の管理情報のデータ構造例を示す図である。 第1のポインタテーブルのデータ構造例を示す図である。 収集領域のデータ構造例を示す図である。 収集領域ヘッダのデータ構造例を示す図である。 集計領域のデータ構造例を示す図である。 書込ビットマップのデータ構造例を示す図である。 追記領域のデータ構造例を示す図である。 第2のポインタテーブルのデータ構造例を示す図である。 ログ管理情報のデータ構造例を示す図である。 第2の実施の形態のログ情報のデータ構造例を示す図である。 起動処理および停止処理の手順例を示すフローチャートである。 データ書込時のデバッグ支援の手順例を示すフローチャートである。 アドレス情報収集の手順例を示すフローチャートである。 ロック獲得記録の手順例を示すフローチャートである。 ロック解放判定の手順例を示すフローチャートである。 排他制御不備検出の手順例を示すフローチャートである。 排他制御不備検出の手順例を示すフローチャート(続き)である。 書込衝突判定の手順例を示すフローチャートである。 データ参照時の排他制御不備の例を示す図である。 データ参照時の排他制御不備の検出例を示すシーケンス図である。 第3の実施の形態の制御情報の全体構造例を示す図である。 第3の実施の形態の管理情報のデータ構造例を示す図である。 第3のポインタテーブルのデータ構造例を示す図である。 収集依頼情報のデータ構造例を示す図である。 比較命令情報のデータ構造例を示す図である。 第4のポインタテーブルのデータ構造例を示す図である。 衝突情報のデータ構造例を示す図である。 第3の実施の形態のログ情報のデータ構造例を示す図である。 データ参照時のデバッグ支援の手順例を示すフローチャートである。 衝突情報収集の手順例を示すフローチャートである。 読み書き衝突判定の手順例を示すフローチャートである。 データ参照時の排他制御不備検出の手順例を示すフローチャートである。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理装置を示す図である。
第1の実施の形態の情報処理装置10は、デバッグ対象のソフトウェアとして、複数のプロセッサを使用して並列処理を行うソフトウェアを実行できる。このソフトウェアは、OS(Operating System)やデバイスドライバなどのシステムプログラムを含んでもよいし、システムプログラム上で動作するユーザプログラムを含んでもよい。
情報処理装置10は、プロセッサ11,12およびメモリ13を有する。プロセッサ11,12は、メモリ13を用いて、算術演算命令・論理演算命令・比較命令・分岐命令・データ転送命令などの各種の命令を実行する。プロセッサ11,12それぞれは、CPU(Central Processing Unit)などのプロセッサパッケージでもよいし、プロセッサパッケージ内のプロセッサコアであってもよい。メモリ13は、プロセッサ11,12からアクセスされる共有メモリであり、例えば、RAM(Random Access Memory)である。
ここで、プロセッサ11,12それぞれは、命令の実行を制御する制御ソフトウェア14を用いて、デバッグ対象のソフトウェアに含まれる命令を実行する。制御ソフトウェア14は、例えば、エミュレータと呼ばれるものである。エミュレータは、デバッグ対象のソフトウェアが使用する命令セットとプロセッサ11,12が解釈可能な命令セットとが異なる場合に、前者の命令セットを後者の命令セットに変換する。エミュレータは、ハードウェアとソフトウェアの間の命令セットの違いを吸収していると言うこともできる。
第1の実施の形態では、制御ソフトウェア14には、デバッグ作業を支援するため、メモリ13上の領域に対する排他制御の不備を判定する機能が実装される。メモリ13上のある領域を使用するときに適切にロックが獲得されないと、プロセッサ11,12が同時期に同じメモリアドレスの領域にアクセスし、プロセッサ11で使用されているデータがプロセッサ12によって意図せず破壊されてしまうことがある。排他制御の不備によって不具合が発生する場合として、例えば、プロセッサ11とプロセッサ12が同じ領域に対して同時期にデータを書き込む場合が挙げられる。また、不具合が発生する他の場合として、例えば、プロセッサ11がメモリ13上の複数のブロックに跨がるデータを参照している間に、プロセッサ12がそのうちの1つのブロックのデータを書き換えてしまう場合が挙げられる。
そこで、プロセッサ11,12は、デバッグ対象のソフトウェアを実行する間、制御ソフトウェア14の制御に従って次のような処理を行う。プロセッサ11は、デバッグ対象のソフトウェアに含まれる命令のうち、メモリ13に対するデータ書込またはデータ参照を伴う命令15を実行するとき、命令15に応じた履歴情報17を生成する。データ書込を伴う命令の一例としては、ストア命令が挙げられ、データ参照を伴う命令の一例としては、メモリ13上のデータを利用する比較命令が挙げられる。履歴情報17は、アクセスされるメモリ13の領域を示すアドレス情報を含んでもよい。また、履歴情報17は、命令15が属するプログラムモジュールの識別情報を含んでもよい。生成された履歴情報17は、例えば、メモリ13上に予め設けられたプロセッサ11用の領域に格納される。
また、プロセッサ12は、デバッグ対象のソフトウェアに含まれる命令のうち、メモリ13に対するデータ書込を伴う命令16を実行するとき、命令16に応じた履歴情報18を生成する。履歴情報18は、アクセスされるメモリ13の領域を示すアドレス情報を含んでもよい。また、履歴情報18は、命令16が属するプログラムモジュールの識別情報を含んでもよい。生成された履歴情報18は、例えば、メモリ13上に予め設けられたプロセッサ11用の領域およびプロセッサ12用の領域の少なくとも一方に格納される。
そして、プロセッサ11は、プロセッサ12が生成した履歴情報18を収集し、生成した履歴情報17と収集した履歴情報18とに基づいて、デバッグ対象のソフトウェアに排他制御の不備があるか判定する。履歴情報17,18は、例えば、メモリ13上に予め設けられたプロセッサ11用の領域に集められる。プロセッサ11は、例えば、履歴情報17が示すアドレスと履歴情報18が示すアドレスとを比較し、履歴情報17,18が同一または近いアドレスを指し示しているとき、排他制御の不備があると判定する。
排他制御の不備があると判定したとき、プロセッサ11は、判定結果を示すログ情報を生成してもよい。このログ情報は、命令15が属するプログラムモジュールの識別情報や命令16が属するプログラムモジュールの識別情報含んでもよい。これにより、デバッグ作業において、不具合の原因となるプログラムモジュール中の位置を特定することが容易となる。ログ情報は、例えば、制御ソフトウェア14に従ってメモリ13に格納される。ログ情報は、メモリ13とは異なる不揮発性の記憶装置に書き出されてもよい。
なお、プロセッサ11は、デバッグ対象のソフトウェアが実行される時間を複数の区間に分割し、同じ区間に属する履歴情報同士を比較し、異なる区間に属する履歴情報同士は比較しないようにしてもよい。この区間は、経過時間や命令の実行数に基づいて決定される周期的な区間であってもよい。また、プロセッサ11は、ロック獲得命令またはロック解放命令が実行されたとき、実行するプログラムモジュールが切り替えられたとき、または、実行中のプログラムモジュールの動作モードが変わったときに、区間が変わったと判定してもよい。これにより、不具合の原因となるプログラムモジュールの判定結果の精度を向上させることができる。
第1の実施の形態の情報処理装置10によれば、プロセッサ11,12が、制御ソフトウェア14を用いてデバッグ対象のソフトウェアの命令を実行し、制御ソフトウェア14の制御のもとで、実行した命令に関する履歴情報を収集し排他制御の不備を判定する。これにより、特殊なハードウェアやシミュレーション環境を用意しなくてもよく、デバッグ対象のソフトウェアが動作する本番システムまたは本番環境と同等のハードウェア構成のシステムを用いて、デバッグ対象のソフトウェアの排他制御の不備を判定することが可能となる。
[第2の実施の形態]
次に、第2の実施の形態を説明する。第2の実施の形態の情報処理装置は、排他制御の不備によって、2つ以上のCPUからRAMへのデータ書込が衝突したことを検出する。
図2は、情報処理装置のハードウェア例を示すブロック図である。
情報処理装置100は、CPU111〜114およびRAM115を有する。CPU111〜114とRAM115とは、システムバス116に接続されている。また、情報処理装置100は、HDD(Hard Disk Drive)121、画像信号処理部122、入力信号処理部123、媒体リーダ124および通信インタフェース125を有する。HDD121、画像信号処理部122、入力信号処理部123、媒体リーダ124および通信インタフェース125は、入出力バス126に接続されている。システムバス116と入出力バス126とは、例えば、ブリッジ(図示せず)で接続されている。
CPU111〜114は、プログラムを実行するプロセッサである。CPU111〜114は、HDD121からプログラムやデータの少なくとも一部をRAM115にロードし、RAM115を利用してプログラムを実行する。CPU111〜114は、物理的に並列にプログラムを実行することができる。CPU111〜114それぞれは、複数のプロセッサコアを有していてもよく、1または2以上のキャッシュメモリを有してもよい。なお、第2の実施の形態では、複数のCPUが並列にプログラムを実行する場合を説明するが、複数のプロセッサコアが並列にプログラムを実行する場合にも応用可能である。
RAM115は、プログラムやデータを一時的に記憶する揮発性メモリである。RAM115は、CPU111〜114から高速なシステムバス116を介してアクセスされる共有メモリであると言うことができる。なお、情報処理装置100は、RAM115以外の種類の揮発性メモリを備えていてもよく、複数個のメモリを備えていてもよい。
HDD121は、OSプログラム、ドライバプログラム、ユーザプログラムなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、情報処理装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えていてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部122は、何れかのCPUからの命令に従って、情報処理装置100に接続されたディスプレイ101に画像を出力する。ディスプレイ101としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ(PDP:Plasma Display Panel)、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
入力信号処理部123は、情報処理装置100に接続された入力デバイス102から入力信号を取得し、何れかのCPUに出力する。入力デバイス102としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、入力信号処理部123には、複数の種類の入力デバイスが接続されていてもよい。
媒体リーダ124は、記録媒体103に記録されたプログラムやデータを読み取る駆動装置である。記録媒体103として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ124は、例えば、記録媒体103から読み取ったプログラムやデータをRAM115またはHDD121に格納する。
通信インタフェース125は、ネットワーク104に接続され、ネットワーク104を介して他の情報処理装置と通信するインタフェースである。通信インタフェース125は、ケーブルでスイッチやルータなどの通信装置と接続される有線通信インタフェースでもよいし、無線で基地局と接続される無線通信インタフェースであってもよい。
なお、情報処理装置100は、クライアントコンピュータであってもよいし、サーバコンピュータであってもよい。情報処理装置100は、媒体リーダ124を備えていなくてもよい。また、ユーザが操作する端末装置からネットワーク104経由で情報処理装置100を制御できる場合、情報処理装置100は、画像信号処理部122や入力信号処理部123を備えていなくてもよい。また、ディスプレイ101や入力デバイス102が、情報処理装置100の筐体と一体に形成されてもよい。なお、CPU111,112は、前述の第1の実施の形態におけるプロセッサ11,12の一例である。また、RAM115は、前述の第1の実施の形態におけるメモリ13の一例である。
図3は、ソフトウェアの階層例を示す図である。
情報処理装置100で実行されるソフトウェアには、ユーザプログラム、システムプログラムおよび命令エミュレータが含まれる。ユーザプログラムは、アプリケーションプログラムなど、システムプログラムの機能を利用するものである。システムプログラムは、OSプログラムやドライバプログラムなど、1または2以上のユーザプログラムの実行を制御するものである。命令エミュレータは、システムプログラムの使用する命令セットがCPU111〜114の命令セットと異なるとき、命令の変換によって、当該システムプログラムをCPU111〜114上で実行可能にするものである。命令エミュレータは、例えば、OSプログラムと合わせて情報処理装置100にインストールされる。
ユーザプログラムは、スーパーバイザコール(システムコール)によってOSカーネルの機能を呼び出すことがある。OSカーネルの機能が呼び出されると、CPUの動作モードが変更され、制御がユーザプログラムからOSに移る。要求されたOS処理が完了すると、制御がOSからユーザプログラムに戻される。また、ユーザプログラムとシステムプログラムの間だけでなく、ユーザプログラム間においても切替が発生し得る。ユーザプログラムの切替は、例えば、他のユーザプログラムの呼び出し、呼び出したユーザプログラムからの復帰、タイマ割り込みなどによって発生する。
プログラム(ユーザプログラムやシステムプログラムを含む)の命令が実行されるとき、命令エミュレータが、プログラムの命令をCPUが解釈可能な命令セットの命令に変換する。これにより、例えば、新しいCPUを用いて古いOSを実行することが可能となる。命令エミュレータは、プログラムの命令を読み込み、読み込んだ命令を変換してCPUに実行させる。CPU111〜114は、プログラムや命令エミュレータを並列に実行できる。第2の実施の形態では、後述するように、排他制御の不備によってRAM115へのデータ書込が衝突したことを検出する機能を命令エミュレータの中に実装する。
次に、排他制御の不備によって2つ以上のデータ書込が衝突する例およびCPU111〜114がこのような排他制御の不備を判定する流れについて説明する。
図4は、データ書込時の排他制御不備の例を示す図である。
プログラムA,B,C,Dの4つを考える。例えば、プログラムA,Bはユーザプログラムであり、プログラムCはOSプログラムである。プログラムA,B,CはCPU111で実行され、プログラムDはCPU112で実行される。プログラムAは、呼出命令によってプログラムBを呼び出す。これにより、実行中のプログラムがプログラムAからプログラムBに切り替わる。プログラムBは、スーパーバイザコール命令(SVC命令)によってプログラムCを呼び出す。これにより、CPU111の動作モードが変更され、実行中のプログラムがプログラムBからプログラムCに切り替わる(ST10)。
その後に、プログラムC,DがRAM115のブロック#2にユーザデータを書き込む場合を考える。排他制御が正常に行われるとき、プログラムCは、テストアンドセット命令(TS命令)によって、RAM115のブロック#1に記憶されたロックワードを更新する。ロックワードは、RAM115上の領域のロックが獲得されているか否かを示すフラグの集合である。ブロック#2に対応するフラグをOFFからONに更新することで、プログラムCはブロック#2のロックを獲得したことになる(ST11)。
プログラムDがTS命令によってブロック#2のロックを獲得しようとしたとき、プログラムCによって既にロックが獲得されていれば(フラグがONになっていれば)、プログラムDのTS命令は失敗する(ST12)。そして、プログラムDは、継続的に(例えば、定期的に)ブロック#1に記憶されたロックワードを確認し、ブロック#2のロックが解放されるまで(ブロック#2に対応するフラグがOFFになるまで)待つことになる。このような排他制御の方法は、スピンロックと呼ばれることがある。
ブロック#2のロックを獲得したプログラムCは、ストア命令(STR命令)によってブロック#2にデータを書き込む(ST13)。データ書込が成功すると、プログラムCは、STR命令によってブロック#1に記憶されたロックワードを更新する。ブロック#2に対応するフラグをONからOFFに更新することで、プログラムCはブロック#2のロックを解放したことになる(ST14)。
ブロック#2のロックが解放されると、プログラムDは、TS命令によってブロック#1に記憶されたロックワードを更新し、ブロック#2のロックを獲得する(ST15)。ブロック#2のロックを獲得したプログラムDは、プログラムCの場合と同様に、ブロック#2にデータを書き込む(ST16)。ブロック#2へのデータ書込が成功すると、プログラムDは、STR命令によってブロック#1に記憶されたロックワードを更新し、ブロック#2のロックを解放する(ST17)。同一の領域に対するデータ書込が連続しても、排他制御が正常に行われる限り、それらデータ書込は正常であると言える。
その後に、プログラムC,DがRAM115のブロック#3にデータを書き込む場合を考える。排他制御が正常に行われないとき、プログラムCは、ブロック#3のロックを獲得せずに(ブロック#3に対応するフラグをONにせずに)、STR命令によってブロック#3にデータを書き込む(ST18)。また、プログラムDも、ブロック#3にデータを書き込む(ST19)。排他制御なしにプログラムCによるデータ書込とプログラムDによるデータ書込とが短い時間内に行われた場合、このデータ書込の衝突によって、プログラムCのデータが意図せず破壊されることになり得る。その結果、プログラムCの処理が異常停止するなどの不具合が発生する可能性がある。
図5は、データ書込時の排他制御不備の検出例を示すシーケンス図である。
ここでは、CPU111がCPU112との間でデータ書込が衝突していないか確認する場合を考える。実装時はCPU111は、CPU112と同様に他CPU(CPU113,114)との間でも、データ書込が衝突していないか確認する。また、CPU111以外のCPUも、CPU111と同様にデータ書込が衝突していないか確認する。
RAM115には、各CPUに対応する制御領域が用意される。CPU111用の制御領域には、CPU111がデータを書き込んだ領域を示すアドレス情報やCPU112〜114から収集したアドレス情報が格納される。また、CPU111用の制御領域には、アドレス情報の収集をCPU112〜114に依頼するか否かを示す依頼フラグが格納される。CPU112用の制御領域にも、同様の情報が格納される。
CPU111は、以下の制御を開始するとき、CPU111用の制御領域に格納された依頼フラグをONにする(ST20)。命令エミュレータを用いてCPU111でSTR命令が実行されるとき、CPU111は、アクセス先の領域を示すアドレス情報を生成して、CPU111用の制御領域に格納する(ST21)。また、命令エミュレータを用いてCPU112でSTR命令が実行されるとき、CPU112は、アクセス先の領域を示すアドレス情報を生成して、CPU112用の制御領域に格納する(ST22)。このとき、CPU112は、CPU111の依頼フラグを確認し、依頼フラグがONであるときは、生成したアドレス情報をCPU111用の制御領域にコピーする(ST23)。
同様にして、CPU111は、CPU111でSTR命令が実行されるとき、アドレス情報を生成してCPU111用の制御領域に格納する(ST24)。CPU112は、CPU112でSTR命令が実行されるとき、アドレス情報を生成してCPU112用の制御領域に格納する(ST25)。また、CPU112は、依頼フラグがONであることを確認し、アドレス情報をCPU111用の制御領域にコピーする(ST26)。
後述する所定の条件が満たされると、CPU111は、CPU111用の制御領域に格納された依頼フラグをOFFにし、CPU112からのアドレス情報の収集を停止する。そして、CPU111は、CPU111用の制御領域に収集されているアドレス情報を用いて、直近の1区間内でCPU111とCPU112とが同一または近い領域に対してデータ書込を行ったか(データ書込の衝突があったか)確認する。すなわち、CPU111は、CPU111のアドレス情報が示すアドレスとCPU112のアドレス情報が示すアドレスとが、重複または近接しているか確認する(ST27)。
データ書込の衝突が検出された場合、CPU111は、CPU111で実行中のプログラムおよびCPU112で実行中のプログラムの少なくとも一方に排他制御の不備があると判定する。一方、データ書込の衝突が検出されない場合、CPU111は、直近の1区間内で実行された命令については排他制御の不備がないと判定する。図5の排他制御不備なしの例では、直近の1区間について排他制御の不備がないと判定している。なお、直近の1区間とは、依頼フラグを前回ONにしてから、依頼フラグをOFFにするまで(後述する所定の条件が満たされるまで)の区間である。CPU111は、排他制御の不備の有無を判定した後は、収集したアドレス情報を破棄してよい。
その後、CPU111は、CPU111用の制御領域に格納された依頼フラグをONにし、CPU112からのアドレス情報の収集を再開する(ST28)。ステップST21〜ST26と同様に、CPU111は、アドレス情報を適宜生成してCPU111用の制御領域に格納する。また、CPU112は、アドレス情報を適宜生成してCPU112用の制御領域に格納すると共に、CPU111用の制御領域にコピーする。
所定の条件が満たされると、CPU111は、CPU111用の制御領域に格納された依頼フラグをOFFにし、PU112からのアドレス情報の収集を停止する。そして、CPU111は、CPU111用の制御領域に収集されているアドレス情報を用いて、排他制御の不備の有無を判定する。図5の排他制御不備ありの例では、ここで排他制御の不備があると判定している(ST29)。排他制御の不備があると判定した場合、CPU111は、CPU111,112で実行されていたプログラムを特定するためのプログラム情報などを含むログ情報を生成し、ログファイルとしてHDD121に出力する。
このように、CPU111は、1つの区間内で収集されたアドレス情報同士を比較することで、排他制御の不備を判定する。排他制御の不備を判定するタイミング、すなわち、区間を区切るタイミングは、次の6つの条件の何れかが満たされたときとする。
第1の条件は、他のユーザプログラムの呼び出し、呼び出したユーザプログラムからの復帰、タイマ割り込みなどによってユーザプログラム間の切替が発生したことである。第2の条件は、SVC命令などによってユーザプログラムとシステムプログラム間の切替が発生したことである。第1および第2の条件に応じて区間を区切ることで、排他制御の不備があるプログラムの範囲が限定できるので、不備の特定が容易になる。第3の条件は、RAM115の領域に対してロックが獲得されたことである。第4の条件は、ロックが解放されたことである。第3および第4の条件に応じて区間を区切ることで、正常な排他制御のもとで行われるデータ書込が排他制御の不備であると誤判定されるのを抑制できる。
第5の条件は、実行中のプログラムの動作モードの切り替えが発生したことである。動作モードには、入出力装置からの割り込みやタイマ割り込みを禁止するモードと禁止しないモードとがある。第6の条件は、排他制御の不備が前回判定されてから(依頼フラグがONになってから)、所定数の命令が実行されたことである。
図6は、排他制御不備の有無の判定例を示す図である。
排他制御の不備を判定するにあたり、第2の実施の形態では、RAM115の各ブロックに対するデータ書込の有無を示す書込ビットマップが用いられる。書込ビットマップでは、直近の区間においてデータ書込があったブロック(ブロックについては、後述する図14に関する説明を参照)に対応するビットが1に設定され、データ書込がなかったブロックに対応するビットが0に設定されている。
CPU111は、CPU111で生成された書込ビットマップとCPU112で生成された書込ビットマップの論理積(AND)を求める。論理積としてのビットマップでは、CPU111,112の両方からデータ書込のあったブロックに対応するビットが1になり、それ以外のブロックに対応するビットが0になる。論理積の全ビットが0であれば、CPU111,112は同じブロックに対してデータ書込を行っていないことになる。
ただし、論理積としてのビットマップの中に1のビットがあっても、そのビットに対応するブロックはロックワードが記憶されているブロックである可能性がある。CPU111,112の両方がロックワードを更新することは正常な排他制御であるため、ロックワードへのアクセスを除外して排他制御の不備を判定することが好ましい。
そこで、CPU111は、ロック獲得命令としてのTS命令によってアクセスされたブロックを示す書込ビットマップを生成する。CPU111は、上記の論理積としてのビットマップと排他制御用の書込ビットマップの排他的論理和(XOR)を求める。排他的論理和としてのビットマップでは、ロックワードでないデータがCPU111,112の両方から書き込まれたブロックに対応するビットが1になり、それ以外のブロックに対応するビットが0になる。論理積としてのビットマップの中に1のビットがあっても、排他的論理和の全ビットが0であれば、CPU111,112は排他制御の不備に該当するような同一ブロックへのデータ書込を行っていないことになる。
以上では、同一ブロックに対するデータ書込の有無を確認したが、CPU111は、同様にして近接するブロックに対するデータ書込の有無についても確認する。例えば、CPU111は、CPU111の書込ビットマップで1に設定されているビットの前後所定数のビットも1に書き換えて、CPU112の書込ビットマップとの論理積を求める。この論理積としてのビットマップの中に1のビットがある場合、CPU111は、この論理積としてのビットマップと排他制御用の書込ビットマップとの排他的論理和を求める。
このようにして、書換前のCPU111の書込ビットマップを用いた論理積または排他的論理和の全ビットが0になれば、同一ブロックに対する実質的なデータ書込の衝突がないと判断できる。また、書換後のCPU111の書込ビットマップを用いた論理積または排他的論理和の全ビットが0になれば、近接するブロックに対する実質的なデータ書込の衝突がないと判断できる。CPU111は、同一または近接するブロックに対する実質的なデータ書込の衝突がなければ、直近の区間について排他制御の不備がないと判定する。一方、CPU111は、それ以外の場合は排他制御の不備があると判定する。
次に、情報処理装置100の機能およびデータ構造について説明する。
図7は、情報処理装置の機能例を示すブロック図である。
情報処理装置100は、命令判別部131、命令変換部132、制御情報記憶部133、ログファイル記憶部134、起動部135およびデバッグ支援部136を有する。
命令判別部131、命令変換部132、起動部135およびデバッグ支援部136は、命令エミュレータの中のソフトウェアモジュールとして実現できる。命令判別部131、命令変換部132およびデバッグ支援部136の処理は、複数のCPU(CPU111〜114)で並列に実行される。ここでは主に、命令判別部131、命令変換部132、起動部135およびデバッグ支援部136がCPU111で動作する場合を説明する。制御情報記憶部133は、RAM115に確保した領域として実現できる。ログファイル記憶部134は、HDD121に確保した記憶領域として実現できる。
命令判別部131は、命令(例えば、システムプログラムの命令)が読み込まれると、読み込まれた命令の種類を判別する。命令の種類が所定の種類である場合、命令判別部131は、命令を命令変換部132とデバッグ支援部136の両方に渡す。命令の種類が所定の種類でない場合、命令判別部131は、命令を命令変換部132に渡す。第2の実施の形態では、所定の種類の命令として主に、データの書込またはロック解放に用いるSTR命令、ロック獲得に用いるTS命令、ユーザプログラムの呼出に用いる呼出命令、および、システムプログラムの呼出に用いるSVC命令の4種類を考える。
命令変換部132は、命令判別部131から渡された命令をCPU111が解釈可能な命令に変換し、CPU111に実行させる。命令の実行が完了すると、命令変換部132は、命令の実行結果をデバッグ支援部136に通知する。例えば、命令変換部132は、TS命令が実行されたときにはロック獲得の成否をデバッグ支援部136に通知する。
制御情報記憶部133は、排他制御の不備の判定に用いられる制御情報を記憶する。制御情報記憶部133の領域は、デバッグ支援部136が起動するときに起動部135によってRAM115上に確保される。制御情報記憶部133は、CPU111〜114から共通にアクセス可能である。ただし、アドレス情報やプログラム情報を収集する領域については、制御情報記憶部133内にCPU毎に区分して設けられている。
ログファイル記憶部134は、ログファイルを記憶する。ログファイルには、排他制御の不備に該当するデータ書込の衝突が検出されたときに、問題となったデータ書込についての情報(アドレス情報やプログラム情報など)がログ情報として書き込まれる。情報処理装置100のユーザは、デバッグ作業において、ログファイルに記載されたログ情報を分析することで、排他制御の不備のあるプログラムを特定することが容易となり、不具合が発生しないようにプログラムを修正することが容易となる。
起動部135は、ユーザからデバッグ開始のコマンドやデバッグ終了のコマンドを受け付ける。デバッグ開始のコマンドが入力されると、起動部135は、RAM115に制御情報記憶部133の領域を確保し、デバッグ支援部136を起動して排他制御の不備を判定できるようにする。デバッグ終了のコマンドが入力されると、起動部135は、デバッグ支援部136を停止させ、制御情報記憶部133の領域を解放する。
デバッグ支援部136は、命令判別部131によって読み込まれる命令を監視し、CPU111〜114で実行されるプログラムの排他制御の不備を判定する。デバッグ支援部136は、情報収集部137、情報提供部138および検出部139を有する。
情報収集部137は、CPU111が排他制御の不備の判定に用いる情報を収集する。情報収集部137は、CPU111でSTR命令が実行されるとき、当該STR命令に関するアドレス情報やプログラム情報などを生成して制御情報記憶部133に格納する。また、情報収集部137は、CPU111でTS命令が実行されるとき、当該TS命令に関するアドレス情報などを生成して制御情報記憶部133に格納する。また、情報収集部137は、CPU111の依頼フラグをONにすることで、CPU112〜114からSTR命令に関するアドレス情報やプログラム情報などを収集する。
情報提供部138は、CPU112〜114が排他制御の不備の判定に用いる情報を、CPU112〜114に提供する。情報提供部138は、CPU111でSTR命令が実行されるとき、CPU112〜114の依頼フラグを確認する。依頼フラグがONであれば、情報提供部138は、情報収集部137が生成した当該STR命令に関するアドレス情報やプログラム情報などをCPU112〜114に提供する。具体的には、情報提供部138は、生成されたアドレス情報やプログラム情報などを、制御情報記憶部133の中のCPU112〜114に対応する領域にコピーする。
検出部139は、前述のような所定の条件が満たされたタイミングで、制御情報記憶部133の中のCPU111に対応する領域に収集された情報を用いて、排他制御の不備を判定する。所定の条件は、例えば、CPU111で呼出命令またはSVC命令などが実行されてプログラムの切り替えが発生すること、TS命令によりロック獲得が成功したこと、ロックが解放されること、または、前回判定を行ってからCPU111で所定数の命令が実行されたことである。
なお、情報収集部137は、命令の実行が完了する前に当該命令に関する情報を生成してもよいし、命令の実行が完了してから当該命令に関する情報を生成してもよい。生成された情報を情報提供部138がコピーするタイミングについても同様である。また、検出部139は、呼出命令、SVC命令またはロック解放を示すSTR命令に応じて排他制御の不備を判定するときは、その命令の実行が完了する前に判定を開始してもよいし、命令の実行が完了してから判定を開始してもよい。また、検出部139は、命令実行数に応じて排他制御の不備を判定するときは、最後の命令の実行が完了する前に判定を開始してもよいし、最後の命令の実行が完了してから判定を開始してもよい。
図8は、第2の実施の形態の制御情報の全体構造例を示す図である。
制御情報記憶部133には、図8に示すような構造をもつ制御情報が格納される。制御情報は、他CPU情報を管理するために、管理情報141、ポインタテーブル142を含む複数の第1のポインタテーブル、および、収集領域143を含む複数の収集領域を有する。また、制御情報は、自CPU情報を管理するために、ポインタテーブル151(第2のポインタテーブル)、一般記録領域152を含む複数の一般記録領域、排他記録領域153を含む複数の排他記録領域、排他管理情報154を含む複数の排他管理情報、および、作業領域155を含む複数の作業域を有する。また、制御情報は、ログ情報を管理するために、ログ管理情報156およびログ記録領域157を有する。
管理情報141は、情報処理装置100全体の状態やCPU111〜114それぞれの状態を示す。第1のポインタテーブルは、CPU111〜114に対応して設けられる。1つの第1のポインタテーブルは、1つの「自CPU」を示す。管理情報141から第1のポインタテーブルを辿ることができる。収集領域には、他CPUから収集された情報が格納される。収集領域は、「自CPU」と「他CPU」の組み合わせ毎に設けられる。1つの「自CPU」に対応する第1のポインタテーブルから、「他CPU」に対応する3つの収集領域を辿ることができる。例えば、CPU111に対応する第1のポインタテーブルから、CPU112〜114に対応する収集領域を辿ることができる。
ポインタテーブル151は、CPU111〜114それぞれのロック獲得状況を示す情報を含む。一般記録領域には、自CPUで実行されるSTR命令に関するアドレス情報やプログラム情報などが格納される。排他記録領域には、自CPUで実行されるTS命令に関するアドレス情報などが格納される。排他管理情報は、ロック獲得時に更新されたロックワードのアドレスを含む。ロックワードのアドレスは、STR命令がロック解放を示すものであるか判断するために用いられる。作業領域は、自CPUで生成された情報を一時的に記憶する。一般記録領域、排他記録領域、排他管理情報および作業領域は、CPU111〜114に対応して設けられ、ポインタテーブル151から辿ることができる。
ログ管理情報156は、ログ記録領域157を管理するための情報を含む。ログ記録領域157には、排他制御の不備があると判定されたときに、検出部139によって生成されたログ情報が格納される。ログ記録領域157に格納されたログ情報は、ログファイル記憶部134に記憶された(HDD121上の)ログファイルに書き出される。
図9は、第2の実施の形態の管理情報のデータ構造例を示す図である。
管理情報141は、ヘッダ内に、システム状態、ロックワードおよび対象プログラムの項目を有する。また、管理情報141は、CPU111〜114それぞれについて、CPU状態およびポインタテーブルのアドレスの項目を有する。
システム状態の項目は、デバッグ開始フラグを含む。デバッグ開始フラグは、デバッグ支援部136が動作中であるか否かを示す。デバッグ開始フラグは、1ビットで表現できる。例えば、デバッグ開始フラグ=1(ON)は、デバッグ支援部136が動作中であり排他制御の不備が判定されることを示す。デバッグ開始フラグ=0(OFF)は、デバッグ支援部136が停止中であり排他制御の不備が判定されないことを示す。ロックワードの項目は、管理情報141へのアクセスの排他制御に用いられるロックワードを含む。対象プログラムの項目は、デバッグ対象のプログラム(排他制御の不備を判定するプログラム)の識別情報を含む。対象プログラムは、例えば、ユーザが指定することもできる。対象プログラムを限定することで、情報処理装置100の負荷を軽減できる。
CPU状態の項目は、依頼フラグを含む。依頼フラグは、あるCPUが他CPUに対して情報収集を依頼しているか否かを示す。依頼フラグは、1ビットで表現できる。例えば、依頼フラグ=1(ON)は、情報収集を依頼中であることを示す。依頼フラグ=0(OFF)は、情報収集を依頼していないことを示す。ポインタテーブルのアドレスの項目は、第1のポインタテーブルが存在するRAM115の領域の先頭アドレスである。
図10は、第1のポインタテーブルのデータ構造例を示す図である。
ポインタテーブル142は、「他CPU」それぞれについて(例えば、CPU112〜114それぞれについて)、領域状態、ロックワードおよび収集領域のアドレスの項目を有する。領域状態の項目は、使用フラグを含む。使用フラグは、収集領域が使用されているか否か、すなわち、他CPUから収集された情報が存在するか否かを示す。使用フラグは、1ビットで表現できる。例えば、使用フラグ=1(ON)は、収集された情報が存在することを示す。使用フラグ=0(OFF)は、収集された情報が存在しないことを示す。ロックワードの項目は、ポインタテーブル142へのアクセスの排他制御に用いられる。収集領域のアドレスの項目は、RAM115上の収集領域の先頭アドレスである。
図11は、収集領域のデータ構造例を示す図である。
収集領域143は、収集領域ヘッダ144、集計領域145を含む複数の集計領域、および、追記領域147を含む複数の追記領域を有する。
収集領域ヘッダ144は、集計領域の集合の状態を示す。各集計領域は、RAM115上のデータ書込が行われたブロックを示す書込ビットマップを含む。1つの集計領域は、RAM115の1つのアドレス範囲に対応する。1つの集計領域が担当するアドレス範囲の大きさは、予め設定されている。排他制御の不備を判定する1つの区間内で、異なるアドレス範囲に属する領域に対してデータ書込が行われた場合、複数の集計領域が使用されることになる。複数の集計領域は、連結リストとして形成されている。収集領域ヘッダ144からは、先頭の集計領域と末尾の集計領域とを辿ることができる。
1つの集計領域に対して、複数の追記領域が設けられる。各追記領域は、書込ビットマップ以外のアドレス情報やプログラム情報や時刻情報などを含む。1つの追記領域は、1回のデータ書込に対応する。1つの集計領域に対応する複数の追記領域は、連結リストとして形成されている。集計領域からは、先頭の追記領域を辿ることができる。
図12は、収集領域ヘッダのデータ構造例を示す図である。
収集領域ヘッダ144は、領域状態、先頭の集計領域のアドレスおよび末尾の集計領域のアドレスの項目を有する。領域状態の項目は、使用フラグを含む。使用フラグは、少なくとも1つの集計領域が使用されているか否かを示す。使用フラグは、1ビットで表現できる。例えば、使用フラグ=1(ON)は、少なくとも1つの集計領域が使用されていることを示す。使用フラグ=0(OFF)は、何れの集計領域も使用されていないことを示す。先頭の集計領域のアドレスの項目は、RAM115上の先頭の集計領域の先頭アドレスである。末尾の集計領域のアドレスの項目は、末尾の集計領域の先頭アドレスである。
図13は、集計領域のデータ構造例を示す図である。
集計領域145は、ヘッダ内に、次の集計領域のアドレス、領域状態、書込ビットマップに対応するメモリアドレス、先頭の追記領域のアドレスおよび末尾の追記領域のアドレスの項目を有する。また、集計領域145は、書込ビットマップ146を有する。
次の集計領域のアドレスの項目は、RAM115上の次の集計領域の先頭アドレスを含む。領域状態の項目は、末尾フラグおよび使用フラグを含む。末尾フラグは、集計領域145が連結リストの末尾であるか否かを示す。末尾フラグは、1ビットで表現できる。例えば、末尾フラグ=1(ON)は、集計領域145が連結リストの末尾であることを示す。末尾フラグ=0(OFF)は、集計領域145の後方に他の集計領域があることを示す。使用フラグは、集計領域145が使用されているか否かを示す。使用フラグは、1ビットで表現できる。例えば、使用フラグ=1(ON)は、集計領域145が使用中であることを示す。使用フラグ=0(OFF)は、集計領域145が未使用であることを示す。
書込ビットマップに対応するメモリアドレスの項目は、書込ビットマップ146が担当するRAM115のアドレス範囲の先頭アドレスを含む。先頭の追記領域のアドレスの項目は、集計領域145に対応するRAM115上の複数の追記領域のうち、先頭の追記領域の先頭アドレスを含む。末尾の追記領域のアドレスの項目は、集計領域145に対応するRAM115上の複数の追記領域のうち、末尾の追記領域の先頭アドレスである。
図14は、書込ビットマップのデータ構造例を示す図である。
書込ビットマップ146は、32列×4行=128個のビットを含む。1つのビットは、RAM115上の1つのブロックに対応する。ブロックは、CPU111〜114がアクセスする領域の最小単位であり、例えば、4バイトの領域である。この場合、書込ビットマップ146は、128ブロック×4バイト=512バイトの領域をカバーすることができる。書込ビットマップ146に含まれる各ビットは、当該ビットに対応するブロックに対してデータ書込が行われたか否かを示す。ビット=1(ON)は、データが書き込まれたことを示し、ビット=0(OFF)は、データ書き込まれていないことを示す。書込ビットマップ146の初期化時には、全てのビットが0に設定される。
図15は、追記領域のデータ構造例を示す図である。
追記領域147は、領域状態、次の追記領域のアドレス、書込が行われたメモリアドレス、ベースアドレス、プログラム情報、書込時刻およびCPU番号の項目を有する。
領域状態の項目は、末尾フラグおよび使用フラグを含む。末尾フラグは、1つの集計領域に対する追記領域の連結リストの中で、追記領域147が末尾であるか否かを示す。末尾フラグは、1ビットで表現できる。使用フラグは、追記領域147が使用されているか否かを示す。使用フラグは、1ビットで表現できる。この末尾フラグおよび使用フラグのON・OFFの意味は、前述の集計領域145のものと同様である。
次の追記領域のアドレスの項目は、RAM115上の次の追記領域の先頭アドレスである。書込が行われたメモリアドレスの項目は、データ書込が行われた領域の先頭アドレスである。ベースアドレスの項目は、データ書込が行われた時点のベースアドレス、すなわち、アクセス先の領域を特定するための起点となるアドレスを含む。ベースアドレスは、各CPUが備えるベースレジスタに格納されている。ベースレジスタとしては、各CPUが備える複数のレジスタのうちの1または2以上のレジスタが使用される。ベースアドレスは、アクセス先の領域が不適切になった原因を分析するのに有用な情報である。
プログラム情報の項目は、データ書込を行ったCPUにおいてデータ書込の時点で実行されていたプログラムを特定するための情報を含む。プログラム情報としては、例えば、プログラム状態ワード(PSW:Program Status Word)を用いることができる。PSWは、次に実行する命令を示す命令アドレスや、CPUによる命令実行を制御するための各種の制御フラグを含む。書込時刻の項目は、データ書込が行われた時刻を含む。CPU番号は、データ書込を行ったCPUを識別するための識別番号を含む。なお、CPU111〜114それぞれには、予め識別番号が付与されているものとする。
図16は、第2のポインタテーブルのデータ構造例を示す図である。
ポインタテーブル151は、CPU111〜114それぞれについて、一般記録領域のアドレス、排他記録領域のアドレス、ロック状態、ロック獲得数、命令カウンタ、排他管理情報のアドレスおよび作業領域のアドレスの項目を有する。
一般記録領域のアドレスの項目は、当該CPU用の一般記録領域(例えば、一般記録領域152)の先頭アドレスを含む。排他記録領域のアドレスの項目は、当該CPU用の排他記録領域(例えば、排他記録領域153)の先頭アドレスを含む。
ロック状態の項目は、ロック獲得フラグを含む。ロック獲得フラグは、当該CPUがRAM115の少なくとも1つの領域に対して、ロックを現在獲得しているか否かを示す。ロック獲得フラグは、1ビットで表現できる。例えば、ロック獲得フラグ=1(ON)は、ロックを獲得していることを示す。ロック獲得フラグ=0(OFF)は、ロックを獲得していないことを示す。ロック獲得数の項目は、当該CPUが獲得しているロックの数を含む。ロック獲得フラグがONであれば、ロック獲得数は1以上になる。
命令カウンタの項目は、排他制御の不備を前回判定してから当該CPUが実行した命令の数を含む。命令カウンタは、当該CPUが命令を実行する毎にカウントアップされ、当該CPUが排他制御の不備を判定する毎に0にリセットされる。排他管理情報のアドレスの項目は、当該CPU用の排他管理情報(例えば、排他管理情報154)が記憶されているRAM115の領域の先頭アドレスを含む。作業領域のアドレスの項目は、当該CPU用の作業領域(例えば、作業領域155)の先頭アドレスを含む。
図17は、ログ管理情報のデータ構造例を示す図である。
ログ管理情報156は、ロックワード、ログ情報のサイズ、ログ記録領域の全体サイズ、先頭のログ情報のアドレスおよび末尾のログ情報のアドレスの項目を含む。
ロックワードの項目は、ログ管理情報156へのアクセスの排他制御に用いられるロックワードを含む。ログ情報のサイズの項目は、ログ記録領域157に現在記憶されているログ情報の量(例えば、バイト数)を示す。ログ記録領域の全体サイズの項目は、使用領域と空き領域の両方を含むログ記録領域157の大きさ(例えば、バイト数)を示す。先頭のログ情報のアドレスは、ログ記録領域157に記憶された先頭のログ情報(最初に追加されたもの)の先頭アドレスを含む。末尾のログ情報のアドレスは、ログ記録領域157に記憶された末尾のログ情報(最後に追加されたもの)の先頭アドレスを含む。
図18は、第2の実施の形態のログ情報のデータ構造例を示す図である。
ログ記録領域157は、図18に示すようなログ情報158を1単位として、1単位または2単位以上のログ情報を記憶することができる。2単位以上のログ情報は、例えば、連結リストとして記憶される。ログ情報158は、検出時刻の項目を有する。また、ログ情報158は、「他CPU」に関して、書込が行われたメモリアドレス、ベースアドレス、プログラム情報および書込時刻の項目を有する。また、「自CPU」に関して、書込が行われたメモリアドレス、ベースアドレスおよびプログラム情報の項目を有する。
検出時刻の項目は、自CPUが排他制御の不備を検出した時刻を含む。
他CPUに関して、他CPU番号の項目は、自CPUと衝突するデータ書込を行った他CPUの識別番号を含む。書込が行われたメモリアドレスの項目は、他CPUがデータ書込を行ったRAM115の領域の先頭アドレスを含む。ベースアドレスの項目は、他CPUがデータ書込を行った時点の他CPUのベースレジスタの値を含む。プログラム情報の項目は、他CPUがデータ書込を行った時点において他CPUが実行していたプログラムを特定するための情報(例えば、PSW)を含む。書込時刻の項目は、他CPUがデータ書込を行った時刻を含む。他CPUに関する情報としては、図15に示すように、当該他CPUに対応する収集領域の中の追記領域に記憶された情報を用いることができる。
自CPUに関して、自CPU番号の項目は、自CPUの識別番号を含む。書込が行われたメモリアドレスの項目は、自CPUがデータ書込を行ったRAM115の領域の先頭アドレスを含む。ベースアドレスの項目は、自CPUがデータ書込を行った時点の自CPUのベースレジスタの値を含む。プログラム情報の項目は、自CPUがデータ書込を行った時点において自CPUが実行していたプログラムを特定するための情報(例えば、PSW)を含む。これらの自CPUに関する情報としては、当該自CPUに対応する一般記録領域の中の追記領域に記憶された情報を用いることができる。
なお、一般記録領域152は、収集領域143と同様のデータ構造によって実現できる。すなわち、一般記録領域152は、収集領域ヘッダ、複数の集計領域および複数の追記領域を有する。排他記録領域153は、収集領域143と同様に、収集領域ヘッダおよび複数の集計領域を有する。ただし、排他記録領域153は、追記領域を有しなくてよい。排他管理情報154は、現在獲得しているロックについてのロックワード(当該ロックの獲得時に更新されたロックワード)のアドレスを含む。ロック獲得数が2以上である場合、例えば、複数のロックワードのアドレスが連結リストとして記憶される。
次に、情報処理装置100が実行する処理について説明する。
図19は、起動処理および停止処理の手順例を示すフローチャートである。
(S110)起動部135は、デバッグ開始のコマンドを受け付ける。デバッグ開始のコマンドは、デバッグ支援部136を起動することによって、情報処理装置100をデバッグモード(排他制御の不備のログ情報が出力されるモード)で動作させることを示す。デバッグ開始のコマンドは、例えば、ユーザが入力デバイス102を用いて入力する。
(S111)起動部135は、情報処理装置100が既にデバッグモードで動作しているか、すなわち、デバッグ支援部136が起動中か判断する。既にデバッグモードである場合は処理が終了し、デバッグモードでない場合はステップS112に処理が進む。
(S112)起動部135は、RAM115に制御情報記憶部133のための領域を確保し、図8に示した構造の制御情報が記憶されるように当該領域を初期化する。
(S113)情報収集部137は、管理情報141に含まれるCPU111〜114の依頼フラグをOFFからONに変更する。これにより、CPU114〜114それぞれは、他CPUで実行されたSTR命令に関する情報の収集を開始することになる。そして、デバッグ開始のコマンドに応じた起動部135のプロセスは終了する。
(S114)起動部135は、デバッグ終了のコマンドを受け付ける。デバッグ終了のコマンドは、デバッグ支援部136を停止することによって情報処理装置100を非デバッグモード(排他制御の不備のログ情報が出力されないモード)で動作させることを示す。デバッグ終了のコマンドは、例えば、ユーザが入力デバイス102を用いて入力する。
(S115)起動部135は、制御情報記憶部133のための領域を解放する。そして、デバッグ終了のコマンドに応じた起動部135のプロセスは終了する。
なお、起動部135は、CPU111〜114の何れか1つ(例えば、ユーザ入力を受け付ける所定のCPU)で動作すればよい。一方、命令判別部131、命令変換部132およびデバッグ支援部136は、CPU111〜114それぞれで動作する。以下では、「自CPU」をCPU111として、デバッグ支援について説明する。
図20は、データ書込時のデバッグ支援の手順例を示すフローチャートである。
(S120)命令判別部131は、命令(例えば、システムプログラムの命令)を1つ読み込む。読み込まれた命令は、命令変換部132によってCPU111が解釈可能な命令に変換されて実行される。以下のステップS121以降の処理は、命令の実行が完了する前に開始してもよいし、命令の実行が完了してから開始してもよい。
(S121)命令判別部131は、読み込まれた命令がSTR命令(ストア命令)であるか判断する。読み込まれた命令がSTR命令である場合はステップS122に処理が進み、STR命令でない場合はステップS125に処理が進む。
(S122)情報収集部137は、CPU111のデータ書込の情報として、STR命令に関するアドレス情報などを収集する。また、情報提供部138は、CPU111の情報をCPU112〜114に提供する。アドレス情報収集の詳細は後述する。
(S123)情報収集部137は、読み込まれたSTR命令が、獲得済みのロックを解放するための命令であるか判定する。STR命令がロック解放を意図したものか否かは、アクセス先のRAM115のアドレスが、ロック獲得時に更新されたロックワードを指し示しているか否かによって判定できる。ロック解放判定の詳細は後述する。
(S124)読み込まれたSTR命令がロック解放を意図したものと判定された場合、ステップS129に処理が進む。それ以外の場合、ステップS128に処理が進む。
(S125)命令判別部131は、読み込まれた命令がTS命令(テストアンドセット命令)であるか判断する。読み込まれた命令がTS命令である場合はステップS126に処理が進み、TS命令でない場合はステップS127に処理が進む。
(S126)情報収集部137は、TS命令が実行されてロック獲得が成功した場合、TS命令によって更新されたロックワードの位置を示すアドレス情報を記録しておく。ロックワードのアドレス情報は、ステップS123においてSTR命令がロック解放を意図したものか判定するときに用いられる。そして、ステップS129に処理が進む。
(S127)命令判別部131は、読み込まれた命令が呼出命令やSVC命令(スーパーバイザコール命令)など、プログラムの切替を示す命令であるか判断する。読み込まれた命令がプログラムの切替を示す命令である場合はステップS129に処理が進み、プログラムの切替を示す命令でない場合はステップS128に処理が進む。
(S128)情報収集部137は、ポインタテーブル151に含まれるCPU111の命令カウンタの値が、閾値を超えたか判断する。すなわち、情報収集部137は、情報処理装置100がデバッグモードになって以降、または、排他制御の不備を前回判定して以降、CPU111で実行された命令の数が閾値を超えたか判断する。命令カウンタの値が閾値を超えた場合はステップS129に処理が進み、それ以外の場合は処理が終了する。
(S129)検出部139は、CPU111に対応する一般記録領域、排他記録領域および収集領域に収集されたアドレス情報に基づいて、CPU111とCPU112〜114との間におけるデータ書込の衝突を検出する。CPU111と何れかの他CPUとの間でデータ書込の衝突があると、検出部139は、CPU111が実行したプログラムおよび当該他CPUが実行したプログラムの少なくとも一方に排他制御の不備があると判定し、プログラム情報などを含むログ情報を出力する。排他制御不備検出の詳細は後述する。
このように、デバッグ支援部136は、CPU111〜114が行ったデータ書込についてのアドレス情報やプログラム情報を収集する。そして、デバッグ支援部136は、ロック獲得、ロック解放、ユーザプログラム間の切替、ユーザプログラムとシステムプログラム間の切替、一定数の命令の実行の何れかがCPU111において発生した時点で、排他制御の不備を判定する。排他制御の不備が検出されると、デバッグ支援部136は、排他制御の不備があるプログラムを特定するのに有用な情報を含むログ情報を出力する。
図21は、アドレス情報収集の手順例を示すフローチャートである。
このアドレス情報収集は、前述のステップS122において実行される。
(S130)情報収集部137は、管理情報141を参照して、CPU111で実行されているプログラムがデバッグ対象であるか判断する。プログラムがデバッグ対象である場合はステップS131に処理が進み、デバッグ対象でない場合は処理が終了する。
(S131)情報収集部137は、命令判別部131から受け取ったSTR命令に基づいて、データ書込が行われるRAM115のアドレス(絶対アドレス)を算出する。
(S132)情報収集部137は、CPU111に対応する作業領域に、ステップS131で算出したアドレスを格納する。また、情報収集部137は、CPU111が備えるベースレジスタの現在値(現在のベースアドレス)やCPU111で実行されているプログラムを示すプログラム情報(例えば、現在のPSW)を確認し、作業領域に格納する。
(S133)情報収集部137は、図14に示したような書込ビットマップを生成し、CPU111に対応する作業領域に格納する。このとき、情報収集部137は、ステップS131で算出されたアドレスに対応するビットを1とし、他のビットを0にする。
(S134)情報収集部137は、CPU111に対応する一般記録領域の中から、ステップS133で生成した書込ビットマップと担当するアドレス範囲が一致する集計領域を探す。情報収集部137は、該当する集計領域があれば当該集計領域を使用し、なければ未使用の集計領域を1つ獲得する。そして、情報収集部137は、論理和(OR)を求めることで、作業領域に格納された書込ビットマップを、使用する集計領域の書込ビットマップに合成する。また、情報収集部137は、上記の集計領域に対応する未使用の追記領域を1つ獲得し、ステップS132で生成した書込先のアドレス、ベースアドレスおよびプログラム情報を、作業領域から獲得した追記領域にコピーする。
(S135)情報提供部138は、CPU112〜114の1つ(1つの他CPU)を特定する。情報提供部138は、管理情報141を参照し、特定した他CPUの依頼フラグがONであるか、すなわち、当該他CPUから情報収集が依頼されているか判断する。依頼フラグがONである場合はステップS136に処理が進み、依頼フラグがOFFである場合はステップS138に処理が進む。
(S136)情報提供部138は、特定した他CPUに対応する複数の収集領域のうち、CPU111の情報を収集するための収集領域を検出する。
(S137)情報提供部138は、ステップS134と同様の方法で、CPU111の作業領域にある情報をステップS136で検出した収集領域にコピーする。すなわち、情報提供部138は、検出した収集領域の中から、ステップS133で生成した書込ビットマップと担当するアドレス範囲が一致する集計領域を探して集計領域を1つ使用する。情報提供部138は、論理和(OR)を求めることで、作業領域に格納された書込ビットマップを、使用する集計領域の書込ビットマップに合成する。また、情報提供部138は、上記の集計領域に対応する未使用の追記領域を1つ獲得し、作業領域に格納された書込先のアドレス、ベースアドレスおよびプログラム情報を追記領域にコピーする。
(S138)情報提供部138は、全ての他CPU(CPU112〜114)を確認したか判断する。全ての他CPUを確認し終えた場合は処理が終了し、未確認の他CPUがある場合はステップS135に処理が進む。
図22は、ロック獲得記録の手順例を示すフローチャートである。
このロック獲得記録は、前述のステップS126において実行される。
(S140)情報収集部137は、TS命令の完了を検出する。
(S141)情報収集部137は、管理情報141を参照して、CPU111で実行されているプログラムがデバッグ対象であるか判断する。プログラムがデバッグ対象である場合はステップS142に処理が進み、デバッグ対象でない場合は処理が終了する。
(S142)情報収集部137は、TS命令によりロック獲得が成功したか判断する。ロック獲得が成功した場合は、ステップS143に処理が進む。ロック獲得が失敗した場合(ロック解放を待ち、後でTS命令が再実行される場合)は、処理が終了する。
(S143)情報収集部137は、実行されたTS命令に基づいて、ロック獲得のためにアクセスされたRAM115の領域を示すアドレス、すなわち、更新されたロックワードが記憶されている領域のアドレス(絶対アドレス)を算出する。
(S144)情報収集部137は、CPU111に対応する排他管理情報の中に、ステップS143で算出したアドレスを追加する。また、情報収集部137は、ポインタテーブル151の中のCPU111に対応する情報を更新する。すなわち、情報収集部137は、ロック獲得フラグがOFFであるときはロック獲得フラグをONに変更する。また、情報収集部137は、ロック獲得数をインクリメント(1だけ加算)する。
(S145)情報収集部137は、図14に示したような書込ビットマップを生成し、CPU111に対応する作業領域に格納する。このとき、情報収集部137は、ステップS143で算出されたアドレスに対応するビットを1とし、他のビットを0とする。
(S146)情報収集部137は、CPU111に対応する排他記録領域の中から、生成した書込ビットマップと担当するアドレス範囲が一致する集計領域を探す。情報収集部137は、該当する集計領域があれば当該集計領域を使用、なければ未使用の集計領域を1つ獲得する。そして、情報収集部137は、論理和(OR)を求めることで、生成した書込ビットマップを使用する集計領域の書込ビットマップに合成する。
図23は、ロック解放判定の手順例を示すフローチャートである。
このロック解放判定は、前述のステップS123において実行される。
(S150)情報収集部137は、管理情報141を参照して、CPU111で実行されているプログラムがデバッグ対象であるか判断する。プログラムがデバッグ対象である場合はステップS151に処理が進み、デバッグ対象でない場合は処理が終了する。
(S151)情報収集部137は、CPU111に対応する排他管理情報の中から、読み込まれたSTR命令に基づいてデータ書込が行われるRAM115上の領域のアドレス(前述のステップS131で算出されたアドレス)を検索する。
(S152)情報収集部137は、ステップS151において排他管理情報の中から該当するアドレスが検索されたか判断する。読み込まれたSTR命令が、ロック解放のためにロックワードを更新するものである場合、排他管理情報の中に該当するアドレスが存在する。排他管理情報の中から該当するアドレスが検索された場合はステップS153に処理が進み、該当するアドレスが検索されなかった場合は処理が終了する。
(S153)情報収集部137は、CPU111に対応する排他管理情報から、前述のステップS131で算出されたアドレスを削除する。また、情報収集部137は、ポインタテーブル151の中のCPU111に対応する情報を更新する。すなわち、情報収集部137は、ロック獲得数をデクリメント(1だけ減算)する。ロック獲得数が0になった場合、情報収集部137は、ロック獲得フラグをONからOFFに変更する。
図24は、排他制御不備検出の手順例を示すフローチャートである。
この排他制御不備検出は、前述のステップS129において実行される。
(S160)検出部139は、管理情報141を参照して、CPU111で現在実行されているプログラムがデバッグ対象であるか判断する。デバッグ対象である場合はステップS162に処理が進み、デバッグ対象でない場合はステップS161に処理が進む。
(S161)検出部139は、CPU111において直近の所定時間以内にプログラムの切替が発生しており、かつ、現在実行されているプログラムの1つ前に実行されていたプログラムがデバッグ対象であるか判断する。上記の条件に該当する場合はステップS162に処理が進み、上記の条件に該当しない場合は処理が終了する。
(S162)検出部139は、管理情報141の中のCPU111に対応する依頼フラグをONからOFFに変更する。これにより、他CPUからの情報収集が中断される。
(S163)検出部139は、CPU111に対応する一般記録領域に、CPU111で行われたデータ書込についての情報が存在するか判断する。CPU111が直近の1区間内でSTR命令を1つ以上実行した場合、一般記録領域にデータ書込の情報が存在することになる。CPU111のデータ書込の情報が存在する場合はステップS166に処理が進み、存在しない場合はステップS164に処理が進む。
(S164)検出部139は、CPU111の収集領域にある情報を破棄する。
(S165)検出部139は、管理情報141の中のCPU111に対応する依頼フラグをOFFからONに変更する。これにより、他CPUからの情報収集が再開される。
図25は、排他制御不備検出の手順例を示すフローチャート(続き)である。
(S166)検出部139は、CPU112〜114の1つ(1つの他CPU)を特定する。検出部139は、CPU111が特定した他CPUから情報を収集するための収集領域の中に、情報が存在するか判断する。特定した他CPUが直近の1区間内でSTR命令を1つ以上実行した場合、当該収集領域にデータ書込の情報が存在することになる。特定した他CPUのデータ書込の情報が存在する場合はステップS167に処理が進み、存在しない場合はステップS172に処理が進む。
(S167)検出部139は、CPU111に対応する一般記録領域の中から、使用されている集計領域(使用フラグがONであるもの)を1つ特定する。検出部139は、特定した他CPUに対応する収集領域の中から、CPU111の集計領域と担当するアドレス範囲が一致する他CPUの集計領域を検索する。該当する他CPUの集計領域がある場合はステップS168に処理が進み、ない場合はステップS171に処理が進む。
(S168)検出部139は、特定したCPU111の集計領域に含まれる書込ビットマップと、これに対応する他CPUの集計領域に含まれる書込ビットマップとを用いて、データ書込の衝突を判定する。書込衝突判定の詳細は後述する。
(S169)検出部139は、ステップS168でデータ書込の衝突が検出されたか判断する。データ書込の衝突が検出された場合、ステップS170に処理が進む。データ書込の衝突が検出されなかった場合、ステップS171に処理が進む。
(S170)検出部139は、衝突したデータ書込についての情報を含むログ情報を生成し、ログ記録領域157に格納する。具体的には、検出部139は、特定したCPU111の集計領域と関連付けられている複数の追記領域の中から、データ書込先のアドレスに基づいて、衝突したデータ書込に対応する追記領域を探す。また、検出部139は、ステップS167で検索された他CPUの集計領域と関連付けられている複数の追記領域の中から、データ書込先のアドレスに基づいて、衝突したデータ書込に対応する追記領域を探す。そして、検出部139は、検索されたCPU111の追記領域と他CPUの追記領域からプログラム情報などを抽出し、ログ情報に挿入する。
(S171)検出部139は、使用されているCPU111の集計領域を全て確認したか判断する。全ての集計領域を確認し終えた場合はステップS172に処理が進み、未確認の集計領域がある場合はステップS167に処理が進む。
(S172)検出部139は、全ての他CPU(CPU112〜114)を確認したか判断する。全ての他CPUを確認し終えた場合はステップS173に処理が進み、未確認の他CPUがある場合はステップS166に処理が進む。
(S173)検出部139は、ログ記録領域157に格納されているログ情報を、ログファイル記憶部134に記憶されるログファイルに書き出す。このとき、検出部139は、ログファイルに書き出したログ情報をログ記録領域157から削除してよい。
(S174)検出部139は、CPU111に対応する一般記録領域、排他記録領域および作業領域にある情報を破棄する。そして、ステップS164に処理が進む。
図26は、書込衝突判定の手順例を示すフローチャートである。
この書込衝突判定は、前述のステップS170において実行される。
(S180)検出部139は、CPU111の一般記録領域にある書込ビットマップ(一般用ビットマップ)と他CPUの書込ビットマップとの論理積(AND)を求める。
(S181)検出部139は、ステップS180で算出された論理積の全ビットが0であるか判断する。論理積の全ビットが0である場合はステップS184に処理が進み、少なくとも1つのビットが1である場合はステップS182に処理が進む。
(S182)検出部139は、CPU111に対応する排他記録領域の中から、上記の一般用ビットマップと担当するアドレス範囲が一致する集計領域の書込ビットマップ(排他用ビットマップ)を探す。そして、検出部139は、ステップS180で算出された論理積としてのビットマップと排他用ビットマップとの排他的論理和(XOR)を求める。
(S183)検出部139は、ステップS182で算出された排他的論理和の全ビットが0であるか判断する。排他的論理和の全ビットが0である場合はステップS184に処理が進み、少なくとも1つのビットが1である場合はステップS190に処理が進む。
(S184)検出部139は、一般用ビットマップの中で値が1になっているビットの周辺ビット(例えば、前後所定数のビット)を1に変更する。
(S185)検出部139は、ステップS184で修正した一般用ビットマップと他CPUの書込ビットマップとの論理積(AND)を求める。
(S186)検出部139は、ステップS185で算出された論理積の全ビットが0であるか判断する。論理積の全ビットが0である場合はステップS189に処理が進み、少なくとも1つのビットが1である場合はステップS187に処理が進む。
(S187)検出部139は、ステップS185で算出された論理積としてのビットマップと排他用ビットマップとの排他的論理和(XOR)を求める。
(S188)検出部139は、ステップS187で算出された排他的論理和の全ビットが0であるか判断する。排他的論理和の全ビットが0である場合はステップS189に処理が進み、少なくとも1つのビットが1である場合はステップS190に処理が進む。
(S189)検出部139は、データ書込の衝突がないと判定する。
(S190)検出部139は、データ書込の衝突があると判定する。
このようにして、検出部139は、CPU111と他CPUの両方から同じブロックに対してデータ書込が行われたか判断する。同じブロックに対してデータ書込が行われた場合、検出部139は、原則として実行されたプログラムに排他制御の不備があると判定する。ただし、データ書込先がロックワードの記憶されているブロックである場合、そのデータ書込は正常な排他制御に基づくものであるため、排他制御の不備としては扱わない。
上記で排他制御の不備があると判定しなかった場合、検出部139は次に、CPU111と他CPUから、アドレスの近いブロックに対してデータ書込が行われたか判断する。近いブロックに対してデータ書込が行われた場合、検出部139は、原則として実行されたプログラムに排他制御の不備があると判定する。ただし、他CPUのデータ書込先がロックワードの記憶されているブロックである場合、そのデータ書込は正常な排他制御に基づくものであるため、排他制御の不備としては扱わない。
以上、第2の実施の形態によれば、CPU111〜114それぞれが命令エミュレータを用いて、自CPUで行われたデータ書込および他CPUで行われたデータ書込についてのアドレス情報やプログラム情報を収集する。そして、CPU111〜114それぞれが命令エミュレータを用いて、直近の1区間で収集されたアドレス情報に基づいて排他制御の不備を判定し、プログラム情報などを含むログ情報を出力する。これにより、特殊なハードウェアやシミュレーション環境を用意しなくても、RAM115へのアクセスの排他制御に不備があることを効率的に検出することができる。特に、第2の実施の形態では、スピンロック方式の排他制御について、その不備を効率的に検出できる。
また、ユーザは、ログ情報に含まれるプログラム情報に基づいて、排他制御の不備のあるプログラムを特定することができ、デバッグ作業が容易となる。また、ロック獲得やロック解放を契機として情報収集区間を区切ることで、正常な排他制御によるアクセスを排他制御の不備と誤判定するのを抑制できる。また、ロックワードへのアクセスを除外してアドレス情報を比較することで、排他制御の不備の判定精度を向上させることができる。また、実行するプログラムの切替を形式として情報収集区間を区切ることで、排他制御の不備があるプログラムの判定精度を向上させることができる。
[第3の実施の形態]
次に、第3の実施の形態を説明する。第2の実施の形態との違いを中心に説明し、第2の実施の形態と同様の事項については説明を省略する。第3の実施の形態の情報処理装置は、排他制御の不備によって、あるCPUからRAMへのデータ参照と他の1以上のCPUからRAMへのデータ書込とが衝突したことを検出する。
第3の実施の形態の情報処理装置は、図2に示した第2の実施の形態と同様のハードウェア構成によって実現できる。また、第3の実施の形態の情報処理装置は、図7に示した第2の実施の形態と同様のソフトウェア構成によって実現できる。以下、図2,7で用いたものと同様の符号を用いて、第3の実施の形態の情報処理装置を説明する。
まず、排他制御の不備によってデータ参照とデータ書込が衝突する例およびCPU111〜114がこのような排他制御の不備を判定する流れについて説明する。
図27は、データ参照時の排他制御不備の例を示す図である。
互いに異なるCPUで実行されるプログラムE,Fを考える。例えば、プログラムEはCPU111で実行され、プログラムFはCPU112で実行される。
プログラムEは、RAM115に対するデータ参照を伴う命令として、複数のブロックに跨がるデータ同士を比較する比較命令(CMP命令)を含む。プログラムEは、このCMP命令により、ブロック#1,#2に跨がって格納されているデータXとブロック#3,#4に跨がって格納されているデータYとを比較する。前述のように、ブロックはRAM115へのアクセスの最小単位である。そこで、プログラムEは、ブロック#1のデータとブロック#3のデータを読み込んで比較する(ST30)。また、プログラムEは、ブロック#2のデータとブロック#4のデータを読み込んで比較する(ST32)。
一方、プログラムFは、ブロック#3にデータを書き込むストア命令(STR命令)を含む。ここで、プログラムEとプログラムFの間で排他制御が正常に行われないとする。その場合、プログラムEのCMP命令が実行されている途中で、プログラムFのSTR命令が実行される可能性がある。例えば、プログラムEがブロック#3のデータを参照した後、CMP命令が完了する前に、プログラムFがブロック#3のデータを更新する(ST31)。その結果、CMP命令が完了した時点のデータX,Yの同一性とCMP命令の結果とが整合しない場合があるなど、CMP命令の結果の正しさが保証されなくなる。
なお、図27の例では、比較されるデータX,Yの両方がRAM115に格納されているとしたが、データX,Yの一方がCPU111のレジスタに格納されていてもよい。例えば、プログラムEは、データXをレジスタにロードしておき、CMP命令を実行するときにブロック#3,#4に格納されているデータYを参照してもよい。
図28は、データ参照時の排他制御不備の検出例を示すシーケンス図である。
ここでは、CPU111が、CPU111によるデータ参照とCPU112によるデータ書込とが衝突していないか確認する場合を考える。CPU111は、CPU112と同様にCPU113,114によるデータ書込についても衝突の有無を確認する。また、CPU112〜114も、CPU111と同様に衝突の有無を確認する。
RAM115には、CPU111〜114それぞれに対応する制御領域が用意される。CPU111用の制御領域には、CPU111が参照するRAM115の領域を示すアドレス情報が格納される。また、CPU111用の制御領域には、データ書込の監視をCPU112〜114に依頼するか否かを示す依頼フラグや、CPU111が参照する領域へのデータ書込の発生(データ参照とデータ書込の衝突)を示す衝突情報が格納される。CPU112〜114用の制御領域にも、同様の情報が格納される。
命令エミュレータを用いてCPU111でCMP命令が開始されるとき、CPU111は、比較されるデータが格納されている1つまたは2つの領域を示すアドレス情報を生成して、CPU111用の制御領域に格納する。そして、CPU111は、CPU111用の制御領域に格納された依頼フラグをONにする(ST40)。
一方、命令エミュレータを用いてCPU112でSTR命令が実行されるとき、CPU112は、CPU111の依頼フラグを確認し、依頼フラグがONであればCPU111用の制御領域からアドレス情報を読み込む。そして、CPU112は、CPU112によるデータ書込がCPU111によるデータ参照と衝突するか、すなわち、データ書込先がアドレス情報の示す領域に含まれるか判断する(ST41)。データ参照とデータ書込の衝突が検出された場合、CPU112は、衝突発生を示す衝突情報を生成してCPU111用の制御領域に格納する。図28の排他制御不備なしの例では、この時点で衝突は検出されない。
CMP命令が完了すると、CPU111は、CPU111用の制御領域に格納された依頼フラグをOFFにし、CPU112からの衝突情報の収集を停止する。そして、CPU111は、CPU111用の制御領域に衝突情報があるか確認する(ST42)。衝突情報がある場合、CPU111は、CPU111で実行中のプログラムおよびCPU112で実行中のプログラムの少なくとも一方に排他制御の不備があると判定する。一方、衝突情報がない場合、CPU111は、CMP命令が実行された区間について排他制御の不備がないと判定する。図28の排他制御不備なしの例では、排他制御の不備がないと判定されている。
その後、ステップST40〜ST42と同様にして、CPU111は、CMP命令が開始されるとき、アドレス情報を生成してCPU111用の制御領域に格納し、依頼フラグをONにする(ST43)。CPU112は、STRが実行されるとき、依頼フラグがONであることを確認し、データ書込先がアドレス情報の示す領域に含まれるか判断する(ST44)。図28の排他制御不備ありの例では、この時点で衝突が検出されている。そこで、CPU112は、衝突情報を生成してCPU111用の制御領域に格納する(ST45)。
CMP命令が完了すると、CPU111は、依頼フラグをOFFにし、CPU111用の制御領域に衝突情報があるか確認する(ST46)。CPU111は、衝突情報を検出すると、CPU111で実行中のプログラムおよびCPU112で実行中のプログラムの少なくとも一方に排他制御の不備があると判定する。そして、CPU111は、プログラム情報などを含むログ情報を生成し、ログファイルとしてHDD121に出力する。
図29は、第3の実施の形態の制御情報の全体構造例を示す図である。
制御情報記憶部133には、図29に示すような構造をもつ制御情報が格納される。制御情報は、自CPU情報を管理するために、管理情報161、ポインタテーブル162(第3のポインタテーブル)、収集依頼情報163を含む複数の収集依頼情報、および、比較記録領域164を含む複数の比較記録領域を有する。また、制御情報は、他CPU情報を管理するために、ポインタテーブル171を含む複数の第4のポインタテーブル、および、収集領域172を含む複数の収集領域を有する。また、制御情報は、ログ情報を管理するために、ログ管理情報174およびログ記録領域175を有する。
管理情報161は、情報処理装置100全体の状態を示す情報を含み、ポインタテーブル162を指し示す。ポインタテーブル162は、CPU111〜114の依頼フラグを含み、CPU111〜114それぞれに対応する収集依頼情報、比較記録領域および第4のポインタテーブルを指し示す。収集依頼情報には、CMP命令によって比較されるデータが格納されている領域を示すアドレスが格納される。比較記録領域には、「自CPU」で実行されるCMP命令に関するアドレスやプログラム情報などが格納される。収集依頼情報および比較記録領域は、CPU111〜114に対応して設けられる。
第4のポインタテーブルは、CPU111〜114に対応して設けられる。1つの第4のポインタテーブルは、1つの「自CPU」を示す。第4のポインタテーブルは、複数の「他CPU」に対応する収集領域を指し示す。収集領域は、「自CPU」と「他CPU」の組み合わせ毎に設けられる。収集領域には、他CPUから収集された衝突情報が格納される。衝突情報は、STR命令によってデータ書込が行われた領域を示すアドレス情報やプログラム情報を含む。ただし、衝突が発生していないとき衝突情報は格納されない。
ログ管理情報174は、ログ記録領域175を管理するための情報を含む。ログ記録領域175には、排他制御の不備があると判定されたときに、収集された情報に基づいて生成されたログ情報が格納される。ログ記録領域175に格納されたログ情報は、ログファイル記憶部134に記憶された(HDD121上の)ログファイルに書き出される。
図30は、第3の実施の形態の管理情報のデータ構造例を示す図である。
管理情報161は、システム状態、ロックワード、対象プログラムおよびポインタテーブルのアドレスの項目を有する。システム状態の項目は、デバッグ開始フラグをもつ。デバッグ開始フラグは、デバッグ支援部136が動作中であるか否かを示す。デバッグ開始フラグは、1ビットで表現できる。ロックワードの項目は、管理情報161へのアクセスの排他制御に用いられるロックワードを含む。対象プログラムの項目は、デバッグ対象のプログラムの識別情報をもつ。ポインタテーブルのアドレスの項目は、ポインタテーブル162が存在するRAM115の領域の先頭アドレスである。
図31は、第3のポインタテーブルのデータ構造例を示す図である。
ポインタテーブル162は、CPU111〜114に対応して、依頼状態、収集依頼情報のアドレス、比較記録領域のアドレスおよび他CPU用ポインタテーブルのアドレスの項目を有する。依頼状態の項目は、依頼フラグとしてデータ1依頼フラグおよびデータ2依頼フラグをもつ。データ1依頼フラグは、後述する収集依頼情報が示す1番目のアドレス範囲について、データ書込の監視を他CPUへ依頼しているか否かを示す。データ2依頼フラグは、後述する収集依頼情報が示す2番目のアドレス範囲について、データ書込の監視を他CPUへ依頼しているか否かを示す。各依頼フラグは、1ビットで表現できる。例えば、依頼フラグ=1(ON)は、監視を依頼中であることを示す。依頼フラグ=0(OFF)は、監視を依頼していないことを示す。
収集依頼情報のアドレスの項目は、「自CPU」に対応する収集依頼情報が存在するRAM115の領域の先頭アドレスである。比較記録領域のアドレスの項目は、「自CPU」に対応する比較記録領域が存在するRAM115の領域の先頭アドレスである。他CPU用ポインタテーブルのアドレスの項目は、「自CPU」に対応する第4のポインタテーブルが存在するRAM115の領域の先頭アドレスである
図32は、収集依頼情報のデータ構造例を示す図である。
収集依頼情報163は、比較データ1の先頭メモリアドレスおよび末尾メモリアドレスと、比較データ2の先頭メモリアドレスおよび末尾メモリアドレスの項目を有する。
比較データ1の先頭メモリアドレスおよび末尾メモリアドレスは、CMP命令の1番目の引数に相当するデータが格納されているRAM115の領域の先頭アドレスおよび末尾アドレスである。なお、CMP命令の1番目の引数がレジスタを参照している場合(CMP命令を実行するときRAM115上にある比較データ1を参照しなくてよい場合)は、比較データ1の先頭メモリアドレスおよび末尾メモリアドレスの項目は空でよい。
比較データ2の先頭メモリアドレスおよび末尾メモリアドレスは、CMP命令の2番目の引数に相当するデータが格納されているRAM115の領域の先頭アドレスおよび末尾アドレスである。なお、CMP命令の2番目の引数がレジスタを参照している場合(CMP命令を実行するときRAM115上にある比較データ2を参照しなくてよい場合)は、比較データ2の先頭メモリアドレスおよび末尾メモリアドレスの項目は空でよい。比較データ1,2の少なくとも一方は、RAM115にあるものがアクセスされるとする。
図33は、比較命令情報のデータ構造例を示す図である。
比較記録領域164は、図33に示すような比較命令情報165を記憶する。比較命令情報165は、領域状態、プログラム情報および比較時刻の項目を有する。また、比較命令情報165は、比較データ1について、参照されたメモリアドレス、ベースアドレスおよびサイズの項目を有する。同様に、比較命令情報165は、比較データ2について、参照されたメモリアドレス、ベースアドレスおよびサイズの項目を有する。
領域状態の項目は、データ1フラグおよびデータ2フラグを含む。データ1フラグは、比較命令情報165の比較データ1の項目が使用されているか否かを示す。データ2フラグは、比較命令情報165の比較データ2の項目が使用されているか否かを示す。データ1フラグおよびデータ2フラグは、それぞれ1ビットで表現できる。例えば、データ1フラグ=1(ON)は、比較データ1の項目が使用されている(有効なデータが記憶されている)ことを示す。データ1フラグ=0(OFF)は、比較データ1の項目が使用されていない(有効なデータがない)ことを示す。
比較データ1について、参照されたメモリアドレスの項目は、比較データ1が記憶されているRAM115の領域の先頭アドレスである。ベースアドレスの項目は、CMP命令が開始された時点のベースレジスタの値であって、比較データ1が記憶された領域を特定するための起点となるアドレスである。サイズの項目は、参照する比較データ1の大きさを示す情報(例えば、バイト数)を含む。比較データ2について、参照されたメモリアドレス、ベースアドレスおよびサイズの項目は、比較データ1と同様の情報を含む。
プログラム情報の項目は、「自CPU」で実行されたCMP命令を含むプログラムを特定するための情報である。プログラム情報としては、例えば、プログラム状態ワード(PSW)を用いることができる。比較時刻の項目は、CMP命令が実行された時刻を含む。
図34は、第4のポインタテーブルのデータ構造例を示す図である。
ポインタテーブル171は、「他CPU」(例えば、CPU112〜114)に対応して、領域状態、CPU番号、ロックワードおよび収集領域のアドレスの項目を有する。領域状態の項目は、使用フラグをもつ。使用フラグは、収集領域が使用されているか否か、すなわち、他CPUから収集された衝突情報が存在するか否かを示す。使用フラグは、1ビットで表現できる。CPU番号の項目には、「他CPU」を識別するための識別番号が格納される。ロックワードの項目は、ポインタテーブル171へのアクセスの排他制御に用いられる。収集領域のアドレスの項目は、RAM115上の当該収集領域の先頭アドレスである。
図35は、衝突情報のデータ構造例を示す図である。
収集領域172は、図35に示すような衝突情報173を1単位として、1単位または2単位以上の衝突情報を記憶する。2単位以上の衝突情報は、連結リストとして記憶される。衝突情報173は、次の衝突情報のアドレス、領域状態、書込が行われたメモリアドレス、ベースアドレス、プログラム情報および書込時刻の項目を有する。
次の衝突情報のアドレスの項目は、連結リストにおける次の衝突情報が記憶されたRAM115の領域の先頭アドレスである。領域状態の項目は、末尾フラグおよび使用フラグを含む。末尾フラグは、衝突情報173が連結リストの末尾であるか否かを示す。使用フラグは、他CPUから情報が収集されたか否かを示す。末尾フラグおよび使用フラグは、それぞれ1ビットで表現できる。
書込が行われたメモリアドレスの項目は、他CPUによってデータ書込が行われた領域の先頭アドレスを含む。ベースアドレスの項目は、データ書込が行われた時点の他CPUのベースアドレス、すなわち、他CPUがアクセスした領域を特定するための起点となるアドレスを含む。プログラム情報の項目は、データ書込の時点で実行されていたプログラムを特定するための情報である。プログラム情報としては、例えば、PSWを用いることができる。書込時刻の項目は、データ書込が行われた時刻である。
ログ管理情報174は、例えば、図17に示した第1の実施の形態のログ管理情報156と同様のデータ構造によって実現することができる。
図36は、第3の実施の形態のログ情報のデータ構造例を示す図である。
ログ記録領域175は、図36に示すようなログ情報176を1単位として、1単位または2単位以上のログ情報を記憶する。2単位以上のログ情報は、連結リストとして記憶される。ログ情報176は、次のログ情報のアドレス、領域状態およびログサイズの項目を有する。また、ログ情報176は、CMP命令を実行したCPU(自CPU)について、CPU番号、比較時刻、比較データ1,2の参照されたメモリアドレス、比較データ1,2のベースアドレスおよびプログラム情報の項目を有する。また、ログ情報176は、データ書込を行ったCPU(他CPU)について、他CPU番号、書込時刻、書込が行われたメモリアドレス、ベースアドレスおよびプログラム情報の項目を有する。
次のログ情報のアドレスの項目は、連結リストにおける次のログ情報が記憶されたRAM115の領域の先頭アドレスである。領域状態の項目は、データ1フラグおよびデータ2フラグを含む。データ1フラグは、ログ情報176の比較データ1の項目が使用されているか否かを示す。データ2フラグは、ログ情報176の比較データ2の項目が使用されているか否かを示す。データ1フラグおよびデータ2フラグは、それぞれ1ビットで表現できる。ログサイズの項目は、ログ情報176の大きさを示す。
CPU番号の項目は、CMP命令を実行したCPUを識別するための識別番号である。CMP命令を実行したCPUの情報としては、例えば、比較記録領域164に記憶された比較命令情報165に含まれるものが用いられる。他CPU番号の項目は、CMP命令と衝突するストア命令を実行したCPUを識別するための識別番号である。データ書込を行ったCPUの情報としては、例えば、収集領域172に記憶された衝突情報173に含まれるものが用いられる。
次に、第3の実施の形態で情報処理装置100が実行する処理について説明する。起動処理の手順は、図19に示した第2の実施の形態のものと同様であるため説明を省略する。以下では、「自CPU」をCPU111として、デバッグ支援について説明する。
図37は、データ参照時のデバッグ支援の手順例を示すフローチャートである。
(S210)命令判別部131は、命令を1つ読み込む。
(S211)命令判別部131は、読み込まれた命令がCMP命令(比較命令)であるか判断する。読み込まれた命令がCMP命令である場合はステップS212に処理が進み、CMP命令でない場合はステップS213に処理が進む。
(S212)情報収集部137は、読み込まれたCMP命令の開始時に、CMP命令によって参照されるRAM115の領域に対してデータ書込が行われていないか監視するよう他CPUに依頼する。また、情報収集部137は、CMP命令に関するアドレス情報やプログラム情報を生成する。そして、ステップS215に処理が進む。この処理(衝突情報収集)の詳細は後述する。
(S213)命令判別部131は、読み込まれた命令がSTR命令(ストア命令)であるか判断する。読み込まれた命令がSTR命令である場合はステップS214に処理が進み、STR命令でない場合は処理が終了する。なお、読み込まれた命令は、命令変換部132によってCPU111が解釈可能な命令に変換されて実行される。
(S214)情報提供部138は、CPU112〜114によるデータ参照とCPU111によるデータ書込とが衝突したか、すなわち、CMP命令で比較されたデータが記憶されているRAM115の領域に対して、データ書込が行われるか判定する。データ参照とデータ書込の衝突を検出した場合、情報提供部138は、STR命令に関するアドレス情報やプログラム情報を含む衝突情報を生成する。そして、読み込まれた命令の処理が終了する。この処理(読み書き衝突判定)の詳細は後述する。
(S215)検出部139は、CMP命令が開始されてから完了するまでの間に、CPU111に対応する収集領域に衝突情報が収集されたか確認する。衝突情報が収集されていることで、検出部139は、CPU111によるデータ参照とCPU112〜114の少なくとも1つのCPUによるデータ書込とが衝突したことを検出する。検出部139は、衝突を検出すると、CPU111で実行されたプログラムおよびデータ書込を行った他CPUで実行されたプログラムの少なくとも一方に排他制御の不備があると判定し、プログラム情報などを含むログ情報を出力する。排他制御不備検出の詳細は後述する。
図38は、衝突情報収集の手順例を示すフローチャートである。
この衝突情報収集は、前述のステップS212において実行される。
(S220)情報収集部137は、管理情報161を参照して、CPU111で実行されているプログラムがデバッグ対象であるか判断する。プログラムがデバッグ対象である場合はステップS221に処理が進み、デバッグ対象でない場合は処理が終了する。
(S221)情報収集部137は、実行しようとするCMP命令が所定の条件を満たす命令であるか判断する。第3の実施の形態では、所定の条件は、比較する2つのデータの少なくとも一方がRAM115へアクセスすることで参照され、かつ、RAM115上の当該データが複数のブロックに跨がって記憶されていることである。ブロックは、1回にアクセスされるRAM115の領域の単位である。CMP命令が所定の条件を満たす場合はステップS222に処理が進み、所定の条件を満たさない場合は処理が終了する。
(S222)情報収集部137は、命令判別部131から受け取ったCMP命令に基づいて、参照されるRAM115の領域を示すアドレス範囲(絶対アドレス)を算出する。ここでは、CMP命令の引数に応じて1つまたは2つのアドレス範囲が算出される。CMP命令の2つの引数の一方がレジスタを指している場合はアドレス範囲が1つ算出され、2つの引数が共にRAM115を指している場合はアドレス範囲が2つ算出される。
(S223)情報収集部137は、CPU111に対応する収集依頼情報に、ステップS222で算出した1つまたは2つのアドレス範囲を示す情報を格納する。
(S224)情報収集部137は、CPU111が備えるベースレジスタの現在値(現在のベースアドレス)や、CPU111で実行されているプログラムを示すプログラム情報(例えば、現在のPSW)を収集する。そして、情報収集部137は、アドレス範囲を示す情報、ベースアドレス、プログラム情報などを含む比較命令情報を生成し、CPU111に対応する比較記録領域に比較命令情報を格納する。
(S225)情報収集部137は、ポインタテーブル162に含まれるCPU111に対応する依頼フラグをONに変更する。このとき、CMP命令の引数に応じて、データ1依頼フラグとデータ2依頼フラグが設定される。データ1依頼フラグとデータ2依頼フラグの少なくとも一方がONになる。
図39は、読み書き衝突判定の手順例を示すフローチャートである。
この読み書き衝突判定は、前述のステップS214において実行される。
(S230)情報提供部138は、CPU112〜114の1つ(1つの他CPU)を特定する。情報提供部138は、ポインタテーブル162を参照して、特定した他CPUに対応する2つの依頼フラグ(データ1依頼フラグおよびデータ2依頼フラグ)の少なくとも一方がONであるか判断する。少なくとも一方の依頼フラグがONであることは、当該他CPUからデータ書込の監視が依頼されていることを示す。少なくとも一方の依頼フラグがONである場合はステップS231に処理が進み、2つの依頼フラグが共にOFFである場合はステップS235に処理が進む。
(S231)情報提供部138は、命令判別部131から受け取ったSTR命令に基づいて、データ書込が行われるRAM115のアドレス(絶対アドレス)を算出する。
(S232)情報提供部138は、特定した他CPUに対応する収集依頼情報を参照して、当該他CPUから指定された1つまたは2つのアドレス範囲(ONの依頼フラグに対応するアドレス範囲)を確認する。そして、情報提供部138は、ステップS231で算出されたデータ書込先のアドレスが、指定された何れかのアドレス範囲に含まれるか判断する。データ書込先が指定されたアドレス範囲に属する場合はステップS233に処理が進み、属さない場合はステップS235に処理が進む。
(S233)情報提供部138は、特定した他CPUに対応する複数の収集領域のうち、CPU111の衝突情報を収集するための収集領域を検出する。
(S234)情報提供部138は、CPU111のベースレジスタの値(ベースアドレス)やプログラム情報(例えば、PSW)を収集し、データ書込先のアドレス、ベースアドレスおよびプログラム情報を含む衝突情報を生成する。そして、情報提供部138は、ステップS233で検出した収集領域に衝突情報を格納する。
(S235)情報提供部138は、全ての他CPU(CPU112〜114)を確認したか判断する。全ての他CPUを確認し終えた場合は処理が終了し、未確認の他CPUがある場合はステップS230に処理が進む。
図40は、データ参照時の排他制御不備検出の手順例を示すフローチャートである。
この排他制御不備検出は、前述のステップS215において実行される。
(S240)検出部139は、CMP命令の完了を検出する。
(S241)検出部139は、管理情報161を参照して、CPU111で実行されているプログラムがデバッグ対象であるか判断する。プログラムがデバッグ対象である場合はステップS242に処理が進み、デバッグ対象でない場合は処理が終了する。
(S242)検出部139は、CMP命令が所定の条件を満たす命令であるか判断する。所定の条件は前述の図39におけるステップS221と同様である。CMP命令が所定の条件を満たす場合はステップS243に処理が進み、所定の条件を満たさない場合は処理が終了する。
(S243)検出部139は、ポインタテーブル162に含まれるCPU111に対応するデータ1依頼フラグおよびデータ2依頼フラグをOFFにする。
(S244)検出部139は、CPU112〜114の1つ(1つの他CPU)を特定する。検出部139は、CPU111と特定した他CPUの組に対応する収集領域に、当該他CPUの衝突情報が存在するか判断する。衝突情報がある場合はステップS245に処理が進み、ない場合はステップS246に処理が進む。
(S245)検出部139は、衝突情報に含まれるアドレス情報やプログラム情報などを、ログ情報の一部としてログ記録領域175にコピーする。
(S246)検出部139は、全ての他CPU(CPU112〜114)を確認したか判断する。全ての他CPUを確認し終えた場合はステップS247に処理が進み、未確認の他CPUがある場合はステップS244に処理が進む。
(S247)検出部139は、少なくとも1つの他CPUで衝突情報が収集されていたか、すなわち、ステップS245が実行されたか判断する。衝突情報が収集された場合はステップS248に処理が進み、収集されていない場合は処理が終了する。
(S248)検出部139は、CPU111に対応する比較記録領域から比較命令情報を取得する。検出部139は、比較命令情報に含まれるアドレス情報やプログラム情報などを、ログ情報の一部としてログ記録領域175にコピーする。
(S249)検出部139は、ログ記録領域175に格納されているログ情報を、ログファイル記憶部134に記憶されるログファイルに書き出す。このとき、検出部139は、ログファイルに書き出したログ情報をログ記録領域175から削除してよい。
以上、第3の実施の形態によれば、CPU111〜114それぞれが命令エミュレータを用いて、自CPUで行われたデータ参照および他CPUで行われたデータ書込についてのアドレス情報やプログラム情報などを収集する。そして、CPU111〜114それぞれが命令エミュレータを用いて、データ参照とデータ書込の間の排他制御の不備を判定してログ情報を出力する。これにより、特殊なハードウェアやシミュレーション環境を用意しなくても、RAM115へのアクセスの排他制御に不備があることを効率的に検出できる。特に、第3の実施の形態では、スピンロック方式の排他制御について、その不備を効率的に判定できる。また、ユーザは、ログ情報に含まれるプログラム情報に基づいて、排他制御の不備のあるプログラムを特定することができ、デバッグ作業が容易となる。
なお、前述のように、第1の実施の形態の情報処理は、情報処理装置10にプログラムを実行させることで実現することができる。また、第2および第3の実施の形態の情報処理は、情報処理装置100にプログラムを実行させることで実現することができる。
プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体103)に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からHDDなどの他の記録媒体(例えば、HDD121)にプログラムを複製して(インストールして)実行してもよい。
上記については単に本発明の原理を示すものである。更に、多数の変形や変更が当業者にとって可能であり、本発明は上記に示し、説明した正確な構成および応用例に限定されるものではなく、対応する全ての変形例および均等物は、添付の請求項およびその均等物による本発明の範囲とみなされる。
10 情報処理装置
11,12 プロセッサ
13 メモリ
14 制御ソフトウェア
15,16 命令
17,18 履歴情報

Claims (9)

  1. 複数のプロセッサを含むコンピュータが実行するソフトウェアデバッグ方法であって、
    第1および第2のプロセッサそれぞれが、命令の実行を制御する制御ソフトウェアを用いて、デバッグするソフトウェアに含まれる命令を実行し、
    前記第1のプロセッサが、メモリに対するデータ書込またはデータ参照を示す第1の命令を実行するとき、前記第1の命令に応じた第1の履歴情報を生成し、
    前記第2のプロセッサが、前記メモリに対するデータ書込を示す第2の命令を実行するとき、前記第2の命令に応じた第2の履歴情報を生成し、
    前記第1のプロセッサが、前記第2の履歴情報を取得し、前記第1および第2の履歴情報に基づいて、前記メモリ上の領域に対する排他制御の不備を判定する、
    ソフトウェアデバッグ方法。
  2. 前記第1のプロセッサが、前記デバッグするソフトウェアの実行時間を、ロック獲得またはロック解放を行う第3の命令の実行タイミングに応じて複数の区間に分割し、
    前記排他制御の不備の判定は、区間毎に当該区間で生成された前記第1の履歴情報と前記第2の履歴情報とを比較することによって行う、
    請求項1記載のソフトウェアデバッグ方法。
  3. 前記第1のプロセッサが、前記デバッグするソフトウェアの実行時間を、ソフトウェアモジュールの切替または動作モードの切替を行う第3の命令の実行タイミングに応じて複数の区間に分割し、
    前記排他制御の不備の判定は、区間毎に当該区間で生成された前記第1の履歴情報と前記第2の履歴情報とを比較することによって行う、
    請求項1記載のソフトウェアデバッグ方法。
  4. 前記第1および第2の履歴情報は、前記メモリのアドレスを示す情報を含み、
    前記第1のプロセッサが、ロック獲得またはロック解放を行う第3の命令を実行するとき、更新されるロック制御情報のアドレスを含む第3の履歴情報を生成し、
    前記排他制御の不備の判定は、前記第1および第2の履歴情報が示すアドレスから前記第3の履歴情報が示すアドレスを除外することによって行う、
    請求項1記載のソフトウェアデバッグ方法。
  5. 前記第1の命令は、前記メモリ上の複数のブロックに跨がるデータ参照を行い、
    前記排他制御の不備の判定は、前記第1の命令が読み込まれてから前記第1の命令の実行が完了するまでの間に生成された第2の履歴情報を用いることによって行う、
    請求項1記載のソフトウェアデバッグ方法。
  6. 前記制御ソフトウェアは、前記デバッグするソフトウェアの命令セットを前記第1および第2のプロセッサに応じた他の命令セットに変換するエミュレータである、
    請求項1記載のソフトウェアデバッグ方法。
  7. 前記第1の履歴情報は、前記制御ソフトウェアを用いて、前記メモリ上の前記第1のプロセッサに対応する第1の領域に保存され、
    前記第2の履歴情報は、前記制御ソフトウェアを用いて、前記第1の領域および前記メモリ上の前記第2のプロセッサに対応する第2の領域の少なくとも一方に保存される、
    請求項1記載のソフトウェアデバッグ方法。
  8. 命令の実行を制御する制御ソフトウェアを用いて、デバッグするソフトウェアに含まれる命令を実行する第1および第2のプロセッサと、
    前記第1および第2のプロセッサからアクセスされるメモリと、を有し、
    前記第1のプロセッサは、前記メモリに対するデータ書込またはデータ参照を示す第1の命令を実行するとき、前記第1の命令に応じた第1の履歴情報を生成し、
    前記第2のプロセッサは、前記メモリに対するデータ書込を示す第2の命令を実行するとき、前記第2の命令に応じた第2の履歴情報を生成し、
    前記第1のプロセッサは、前記第2の履歴情報を取得し、前記第1および第2の履歴情報に基づいて、前記メモリ上の領域に対する排他制御の不備を判定する、
    情報処理装置。
  9. 複数のプロセッサを含むコンピュータに、
    第1および第2のプロセッサそれぞれにおいて、デバッグするソフトウェアに含まれる命令が実行されるように制御し、
    前記第1のプロセッサを用いて、メモリに対するデータ書込またはデータ参照を示す第1の命令が実行されるとき、前記第1の命令に応じた第1の履歴情報を生成し、
    前記第2のプロセッサを用いて、前記メモリに対するデータ書込を示す第2の命令が実行されるとき、前記第2の命令に応じた第2の履歴情報を生成し、
    前記第1のプロセッサを用いて、前記第2の履歴情報を取得し、前記第1および第2の履歴情報に基づいて、前記メモリ上の領域に対する排他制御の不備を判定する、
    処理を実行させるプログラム。
JP2015529270A 2013-07-31 2013-07-31 ソフトウェアデバッグ方法、情報処理装置およびプログラム Active JP6069719B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2013/070734 WO2015015591A1 (ja) 2013-07-31 2013-07-31 ソフトウェアデバッグ方法、情報処理装置およびプログラム

Publications (2)

Publication Number Publication Date
JP6069719B2 true JP6069719B2 (ja) 2017-02-01
JPWO2015015591A1 JPWO2015015591A1 (ja) 2017-03-02

Family

ID=52431171

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015529270A Active JP6069719B2 (ja) 2013-07-31 2013-07-31 ソフトウェアデバッグ方法、情報処理装置およびプログラム

Country Status (2)

Country Link
JP (1) JP6069719B2 (ja)
WO (1) WO2015015591A1 (ja)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2006318412A (ja) * 2005-05-16 2006-11-24 Toshiba Corp 半導体装置
JP2010160704A (ja) * 2009-01-08 2010-07-22 Toshiba Corp デバッグ支援装置

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2006318412A (ja) * 2005-05-16 2006-11-24 Toshiba Corp 半導体装置
JP2010160704A (ja) * 2009-01-08 2010-07-22 Toshiba Corp デバッグ支援装置

Also Published As

Publication number Publication date
WO2015015591A1 (ja) 2015-02-05
JPWO2015015591A1 (ja) 2017-03-02

Similar Documents

Publication Publication Date Title
US10649853B2 (en) Tracking modifications to a virtual machine image that occur during backup of the virtual machine
JP2557180B2 (ja) ソフトウェア例外条件に対する選択的データ捕獲方法
US8117600B1 (en) System and method for detecting in-line synchronization primitives in binary applications
US8949671B2 (en) Fault detection, diagnosis, and prevention for complex computing systems
ES2734305T3 (es) Predicción, diagnóstico y recuperación de fallos de aplicaciones en base a patrones de acceso a recursos
US9218234B2 (en) Memory dump and analysis in a computer system
US8326894B2 (en) Method and system to space-efficiently track memory access of object-oriented language in presence of garbage collection
US7346809B2 (en) Bootable post crash analysis environment
CN110741354B (zh) 呈现代码实体调用之间的差异
US7698690B2 (en) Identifying code that wastes time performing redundant computation
US6523141B1 (en) Method and apparatus for post-mortem kernel memory leak detection
US8032869B2 (en) Profiling method and computer product
Eizenberg et al. Remix: Online detection and repair of cache contention for the jvm
US10346255B2 (en) Method for flagging data modification during a virtual machine backup
JPH07319735A (ja) メモリの不正アクセス検出方法及びシステム
US8489652B2 (en) Tracking object fields using relocatable object watchpoints
US8412751B2 (en) Determining whether a Java object has been scan-missed by a garbage collector scan
CN108628726B (zh) Cpu状态信息记录方法和装置
JP2015114750A (ja) 調査用プログラム,情報処理装置及び情報処理方法
US20110202903A1 (en) Apparatus and method for debugging a shared library
JP6069719B2 (ja) ソフトウェアデバッグ方法、情報処理装置およびプログラム
US11010158B2 (en) Determining the availability of memory optimizations by analyzing a running binary
JP2009129025A (ja) 記憶情報配置システム、記憶情報配置方法、および記憶情報配置プログラム
JP6079868B2 (ja) エラー分析方法、情報処理装置およびエラー分析プログラム
JP2016076152A (ja) エラー検出システム、エラー検出方法およびエラー検出プログラム

Legal Events

Date Code Title Description
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: 20161129

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20161212

R150 Certificate of patent or registration of utility model

Ref document number: 6069719

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150