(57)【要約】【課題】ソースプログラムのメンテナンスを行う場合に、コンパイラ指示子と表示メソッドの定義のメンテナンス作業を不要にする。【解決手段】デバッグ情報のパターンから、構造体変数がリスト構造であるかどうかを判断し、リスト構造であればリスト構造用の表示を行う。デバッグ装置（１０）は、入力装置（２０）により操作され、実行形式プログラム（３０）を、ターゲット（４０）にダウンロードし、プログラムの実行を制御して、現在のＣＰＵとメモリの状態を表示装置（５０）に表示させる。また、デバッグ装置（１０）は、デバッグ装置（１０）への操作を解析する入力解析部（１０２）と、入力された実行形式プログラム（３０）のデバッグ情報を解析するデバッグ情報解析部（１０３）と、プログラムの実行／停止を制御し、ＣＰＵの状態を取得するプログラム実行制御部（１０１）と、表示装置（５０）への出力を制御する出力制御部（１０４）を備えている。【選択図】図５
2008146310.tif 000002
【特許請求の範囲】
【請求項１】
構造体変数がリスト構造であるかどうかを判断するためのデバッグ情報がコンパイラにより埋め込まれた実行形式プログラムを格納するための記憶部と、
前記実行形式プログラムの実行及び停止を制御するプログラム実行制御部と、
前記実行形式プログラムの実行中、実行結果情報を表示させたい変数名の入力と、前記デバッグ情報とに基づいて前記変数名に対応する変数が構造体であるかどうかを判定し、構造体であった場合は、当該構造体型のメンバを解析し、前記変数の構造体型と同じ構造体型へのポインタの個数を判定し、前記同じ構造体型へのポインタの個数と前記実行形式プログラムの実行結果とに基づいて前記変数のリスト構造の形態を判定するデバッグ情報解析部と
を具備する
プログラムデバッグ装置。
【請求項２】
請求項１に記載のプログラムデバッグ装置であって、
前記デバッグ情報解析部の解析結果に基づいて、前記リスト構造の形態に応じた前記変数のプログラム実行結果を表示装置に表示する画面出力制御部
を更に具備する
プログラムデバッグ装置。
【請求項３】
請求項１又は２に記載のプログラムデバッグ装置であって、
前記デバッグ情報解析部は、前記同じ構造体型へのポインタの個数が１個だった場合、前記実行形式プログラムの実行結果から、前記変数のアドレスを抽出して処理対象アドレスに設定し、且つ、前記処理対象アドレスの値が終端の値か、あるいは既に前記記憶部に格納済みと判定されるまで、前記処理対象アドレスが前記記憶部に格納されていなければ格納し、前記処理対象アドレスが指す構造体変数のメンバの中から前記ポインタが指すアドレスを抽出して前記処理対象アドレスに設定し、且つ、前記処理対象アドレスの値が終端の値となった場合は、前記入力された変数は線形リストであると判定し、既に前記記憶部に格納済みであった場合は、前記入力された変数はリングバッファと判定する
プログラムデバッグ装置。
【請求項４】
請求項１又は２に記載のプログラムデバッグ装置であって、
前記デバッグ情報解析部は、前記同じ構造体型へのポインタが第１のポインタ、第２のポインタの２個だった場合、前記実行形式プログラムの実行結果から、前記変数のアドレスを抽出して第１の処理対象アドレスに設定し、且つ、前記第１の処理対象アドレスの値が終端の値か、あるいは既に前記記憶部に格納済みと判定されるまで、前記第１の処理対象アドレスが前記記憶部に格納されていなければ格納し、前記第１の処理対象アドレスが指す構造体変数のメンバの中から前記第１のポインタが指す第１のアドレスを抽出し、前記第１の処理対象アドレスを第２の処理対象アドレスに変更し、前記第１のアドレスを前記第１の処理対象アドレスに設定し、前記第１の処理対象アドレスが指す構造体変数のメンバの中から前記第２のポインタが指す第２のアドレスを抽出し、前記第２の処理対象アドレスと前記第２のアドレスとを比較し、且つ、前記第１の処理対象アドレスと前記変数のアドレスが同じかどうかを判定し、前記第１の処理対象アドレスと前記変数のアドレスが不一致であった場合は、前記変数は双方向リストではないと判定し、前記第１の処理対象アドレスと前記変数のアドレスが一致した場合は、前記入力された変数は双方向リストかつリングバッファと判定する
プログラムデバッグ装置。
【請求項５】
請求項４に記載のプログラムデバッグ装置であって、
前記デバッグ情報解析部は、前記第１の処理対象アドレスと前記変数のアドレスが不一致であった場合は、前記変数のアドレスが指す構造体変数のメンバの中から前記第２のポインタが指すアドレスを第３の処理対象アドレスに設定し、且つ、前記第３の処理対象アドレスの値が終端の値か、あるいは既に前記記憶部に格納済みと判定されるまで、前記第３の処理対象アドレスが前記記憶部に格納されていなければ格納し、前記第３の処理対象アドレスが指す構造体変数のメンバの中から前記第２のポインタが指す第３のアドレスを抽出し、前記第３の処理対象アドレスを第４の処理対象アドレスに変更し、前記第３のアドレスを前記第３の処理対象アドレスに設定し、且つ、前記第３の処理対象アドレスが指す構造体変数のメンバの中から前記第１のポインタが指す第４のアドレスを抽出し、前記第４の処理対象アドレスと前記第４のアドレスを比較し、前記第４の処理対象アドレスと前記第４のアドレスが不一致であった場合は、前記変数は双方向リストではないと判定し、前記第４の処理対象アドレスと前記第４のアドレスが不一致でなければ前記変数は双方向リストであると判定する
プログラムデバッグ装置。
【請求項６】
コンピュータを用いてプログラムをデバッグする方法であって、
（ａ１)構造体変数がリスト構造であるかどうかを判断するためのデバッグ情報と実行形式プログラムとを記憶部から読み出して、予め設定されたブレークポイント条件に基づいて前記実行形式プログラムを実行するステップと、
（ａ２）前記実行形式プログラムの実行結果と前記デバッグ情報とに基づいて、入力された変数が構造体型であるかどうかを判定するステップと、
（ａ３）前記変数が構造体型であった場合、構造体型のメンバを解析し、前記変数の構造体型と同じ構造体型へのポインタの個数を判定するステップと、
（ａ４）前記同じ構造体型へのポインタの個数と、前記実行形式プログラムの実行結果とに基づいて、前記変数のリスト構造の形態を判定するステップと、
（ａ５）前記リスト構造の形態に応じて、前記変数の構造体型のメンバを表示するステップと、
を具備する
プログラムデバッグ方法。
【請求項７】
請求項６に記載のプログラムデバッグ方法であって、
前記（ａ４）ステップは、
（ｂ１）前記同じ構造体型へのポインタの個数が１個だった場合、前記実行形式プログラムの実行結果から、前記変数のアドレスを抽出して処理対象アドレスに設定するステップと、
（ｂ２）前記処理対象アドレスが前記記憶部に格納されていなければ格納し、前記処理対象アドレスが指す構造体変数のメンバの中から前記ポインタが指すアドレスを抽出して前記処理対象アドレスに設定するステップと、
（ｂ３）前記処理対象アドレスの値が終端の値か、あるいは既に前記記憶部に格納済みと判定されるまで前記（ｂ２）ステップを繰り返し、前記処理対象アドレスの値が終端の値となった場合は、前記変数は線形リストであると判定し、既に前記記憶部に格納済みであった場合は、前記変数はリングバッファと判定するステップと
を具備する
プログラムデバッグ方法。
【請求項８】
請求項６に記載のプログラムデバッグ方法であって、
前記（ａ４）ステップは、
（ｃ１）前記同じ構造体型へのポインタが第１のポインタ、第２のポインタの２個だった場合、前記実行形式プログラムの実行結果から、前記変数のアドレスを抽出して第１の処理対象アドレスに設定するステップと、
（ｃ２）前記第１の処理対象アドレスが前記記憶部に格納されていなければ格納し、前記第１の処理対象アドレスが指す構造体変数のメンバの中から前記第１のポインタが指す第１のアドレスを抽出し、前記第１の処理対象アドレスを第２の処理対象アドレスに変更し、前記第１のアドレスを前記第１の処理対象アドレスに設定するステップと、
（ｃ３）前記第１の処理対象アドレスが指す構造体変数のメンバの中から前記第２のポインタが指す第２のアドレスを抽出し、前記第２の処理対象アドレスと前記第２のアドレスとを比較するステップと、
（ｃ４）前記第１の処理対象アドレスの値が終端の値か、あるいは既に前記記憶部に格納済みと判定されるまで前記（ｃ２）ステップ及び前記（ｃ３）ステップを繰り返し、前記（ｃ３）ステップの終了時、前記第１の処理対象アドレスと前記変数のアドレスが同じかどうかを判定するステップと、
（ｃ５）前記第１の処理対象アドレスと前記変数のアドレスが不一致であった場合は、前記変数は双方向リストではないと判定し、前記第１の処理対象アドレスと前記変数のアドレスが一致した場合は、前記変数は双方向リストかつリングバッファと判定するステップと
を具備する
プログラムデバッグ方法。
【請求項９】
請求項８に記載のプログラムデバッグ方法であって、
前記（ａ４）ステップは、
（ｃ５）前記第１の処理対象アドレスと前記変数のアドレスが不一致であった場合は、前記変数のアドレスが指す構造体変数のメンバの中から前記第２のポインタが指すアドレスを第３の処理対象アドレスに設定するステップと、
（ｃ６）前記第３の処理対象アドレスが前記記憶部に格納されていなければ格納し、前記第３の処理対象アドレスが指す構造体変数のメンバの中から前記第２のポインタが指す第３のアドレスを抽出し、前記第３の処理対象アドレスを第４の処理対象アドレスに変更し、前記第３のアドレスを前記第３の処理対象アドレスに設定するステップと、
（ｃ７）前記第３の処理対象アドレスが指す構造体変数のメンバの中から前記第１のポインタが指す第４のアドレスを抽出し、前記第４の処理対象アドレスと前記第４のアドレスを比較するステップと、
前記第３の処理対象アドレスの値が終端の値か、あるいは既に前記記憶部に格納済みと判定されるまで前記（ｃ６）ステップ及び前記（ｃ７）ステップを繰り返し、繰り返し中、前記第４の処理対象アドレスと前記第４のアドレスが不一致であった場合は、前記変数は双方向リストではないと判定し、前記第４の処理対象アドレスと前記第４のアドレスが不一致でなければ前記変数は双方向リストであると判定するステップと
を更に具備する
プログラムデバッグ方法。
【請求項１０】
（ｄ１）表示したい変数名を入力するステップと、
（ｄ２）ポインタ変数を用意し、入力された変数のアドレスを代入するステップと、
（ｄ３）整数型変数を用意し、０で初期化するステップと、
（ｄ４）既に解析したアドレスを保持する集合に前記ポインタ変数の値を代入し、前記整数型変数に１を加算するステップと、
（ｄ５）前記ポインタ変数が終端を表す値であるか、又は、前記ポインタ変数の値が前記集合に存在するかを確認するステップと、
（ｄ６）前記ポインタ変数が終端を表す値でなく、且つ、前記ポインタ変数の値が前記集合に存在しない場合、前記整数型変数に１を加算し、前記ポインタ変数の値を前記集合に追加し、前記ポインタ変数に前記ポインタ変数が指す構造体変数のメンバを代入するステップと、
（ｄ７）前記ポインタ変数が終端を表す値である場合、又は、前記ポインタ変数の値が前記集合に存在する場合、前記整数型変数の値が前記入力された変数のリストの項目数であると判断するステップと、
（ｄ８）前記ポインタ変数が前記入力された変数のアドレスと等しい場合、前記入力された変数は、リングバッファであると判断するステップと、
（ｄ９）前記ポインタ変数が終端を表す値の場合、前記入力された変数は線形リストであると判断するステップと
を具備する
プログラムデバッグ方法。
【請求項１１】
（ｅ１）表示したい変数名を入力するステップと、
（ｅ２）第１ポインタ変数と第２ポインタ変数とを用意し、それぞれに入力された変数のアドレスを代入するステップと、
（ｅ３）整数型変数を用意し、０で初期化するステップと、
（ｅ４）既に解析したアドレスを保持する集合に前記第１ポインタ変数の値を代入し、前記整数型変数に１を加算するステップと、
（ｅ５）前記第１ポインタ変数が終端を表す値であるか、又は、前記第１ポインタ変数の値が前記集合に存在するかを確認するステップと、
（ｅ６）前記第１ポインタ変数が終端を表す値でなく、且つ、前記第１ポインタ変数の値が前記集合に存在しない場合、前記整数型変数に１を加算し、前記第２ポインタ変数に前記第１ポインタ変数の値を代入し、前記第１ポインタ変数の値を前記集合に追加し、前記第１ポインタ変数に前記第１ポインタ変数が指す構造体変数のメンバを代入する。
（ｅ７）前記第１ポインタ変数が指す構造体変数のメンバが前記第２ポインタ変数の値と等しいか判定するステップと、
（ｅ８）前記第１ポインタ変数が指す構造体変数のメンバが前記第２ポインタ変数の値と等しくない場合、表示したい変数前記入力された変数は双方向リストではないと判断するステップと、
（ｅ９）前記第１ポインタ変数が終端を表す値である場合、又は、前記第１ポインタ変数の値が前記集合に存在する場合、前記第１ポインタ変数の値が変数前記入力された変数のアドレスと等しいか判定するステップと、
（ｅ１０）前記第１ポインタ変数が変数前記入力された変数のアドレスと等しい場合、表示したい変数前記入力された変数は、リングバッファであると判断し、前記整数型変数の値が前記入力された変数のリストの項目数であると判断するステップと、
（ｅ１１）前記第１ポインタ変数が変数前記入力された変数のアドレスと等しくない場合、前記第１ポインタ変数に変数前記入力された変数のメンバの値を代入し、前記第２ポインタ変数に変数前記入力された変数のアドレスを代入するステップと、
（ｅ１２）前記第１ポインタ変数が終端を表す値であるか、又は、前記第１ポインタ変数の値が前記集合に存在するかを確認するステップと、
（ｅ１３）前記第１ポインタ変数が終端を表す値でなく、且つ、前記第１ポインタ変数の値が前記集合に存在しない場合、前記整数型変数に１を加算し、前記第２ポインタ変数に前記第１ポインタ変数の値を代入し、前記第１ポインタ変数の値を前記集合に追加し、前記第１ポインタ変数に前記第１ポインタ変数が指す構造体変数のメンバを代入するステップと、
（ｅ１４）前記第１ポインタ変数が指す構造体変数のメンバが前記第２ポインタ変数の値と等しいか判定し、等しくない場合、表示したい変数前記入力された変数は双方向リストではないと判断するステップと、
（ｅ１５）前記第１ポインタ変数が終端を表す値である場合、又は、前記第１ポインタ変数の値が前記集合に存在する場合、前記入力された変数は双方向リストであり、前記整数型変数の値が前記入力された変数のリストの項目数であると判断するステップと
を具備する
プログラムデバッグ方法。
【請求項１２】
請求項６乃至１１のいずれか一項に記載のプログラムデバッグ方法を、コンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムデバッグ装置に関し、リスト構造を持つ構造体型変数のプログラムデバッグ装置に関わる。
【背景技術】
【０００２】
デバッグ装置は、プログラムを実行する機能、ある位置で実行を停止するブレーク機能、変数の値を表示する変数参照機能などの機能で構成される。高級言語レベルでデバッグを行うデバッグ装置では、構造体型を表示する方法は構造体型のメンバを図１のようなツリービューで表示するのが一般的である。しかしながら、この方法では階層が深くなるほど全体を把握することが難しくなる。特にリスト構造を持つ構造体の場合はリスト項目ごとに一つの階層を作成するので、全体を把握することが特に困難になる。
【０００３】
上記の問題点を解決する方法として、デバッグ装置の表示プラグインを作成する方法を提供する方式が、特開２００４−２８０４７６号公報（特許文献１）に記載されている。
この従来技術では、開発環境と動作環境が異なる機器組込みプログラムの開発において、デバッグ用のプログラムに、ターゲットを動作させるプログラムの他にデバッグ情報を含む実行形式プログラムと、デバッグデータをホスト上の画面に表示するための表示プラグインを備え、デバッグ情報に対応したデバッグデータを表示プラグインを起動することによりホスト上の画面に表示する。これにより、機器組込みプログラムの開発環境において、デバッグの際に、プログラム上に変数として定義されたデバッグデータをデバッガ（デバッグ装置）を搭載するホスト上の画面に表示する。
【０００４】
この方式では、プログラム上に変数として定義されたプログラム上のデータを、プログラム開発者にとって望む形式で表示させることが可能となる。
【０００５】
かかる方式は、図２で示す構成をとる。図２では、ソースプログラム２０１と、ターゲット用コンパイラ２０２と、実行形式プログラム２０３と、表示プラグインソースプログラム２０４と、ホスト用コンパイラ２０５と、表示プラグイン２０６と、デバッグ装置２０７が示されている。ターゲット用コンパイラ２０２は、与えられたソースプログラム２０１をコンパイルし、実行形式プログラム２０３を出力するのと同時に、表示プラグインソースプログラム２０４を出力する。ホスト用コンパイラ２０５は表示プラグインソースプログラム２０４をコンパイルし、表示プラグイン２０６を生成する。デバッグ装置２０７は、表示プラグイン２０６によって、変数参照機能を拡張し、実行形式プログラム２０３のデバッグを行う。
【０００６】
ソースプログラム２０１には、図３で示されている＃ｐｒａｇｍａコンパイラ指示子３０１と、図４で示されている表示メソッドの定義４０１が含まれる。ターゲット用コンパイラ２０２は、＃ｐｒａｇｍａコンパイラ指示子３０１と、＃ｐｒａｇｍａコンパイラ指示子３０１で指定された表示メソッドの定義４０１を分離し、デバッグ情報を含んだ実行形式プログラム２０３を作成する。分離された＃ｐｒａｇｍａコンパイラ指示子３０１と、＃ｐｒａｇｍａコンパイラ指示子３０１で指定された表示メソッドの定義４０１からターゲット用コンパイラ２０２は、表示プラグインソースプログラム２０４を生成する。その生成された表示プラグインソースプログラム２０４はホスト用コンパイラ２０５でコンパイルされ表示プラグイン２０６を生成する。
【０００７】
【特許文献１】特開２００４−２８０４７６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
前述の従来技術を用いると、リスト構造を持つ構造体を把握しやすいように表示させることが可能である。しかしながら、この方法ではプログラム開発者がソースプログラムの構造体宣言に図３の＃ｐｒａｇｍａコンパイラ指示子３０１と図４の表示メソッドの定義４０１を記述しなければならない。これはプログラム開発者にとって、余計な労力であり、図２のソースプログラム２０１のメンテナンスを行う場合に、＃ｐｒａｇｍａコンパイラ指示子３０１と表示メソッドの定義４０１のメンテナンス作業も必要になる。更に、ターゲットとホストが同一でない場合、図２のターゲット用コンパイラ２０２の他に、図２のホスト用コンパイラ２０５を用意しなければならない。
【課題を解決するための手段】
【０００９】
以下に、［発明を実施するための最良の形態］で使用される番号を括弧付きで用いて、課題を解決するための手段を説明する。これらの番号は、［特許請求の範囲］の記載と［発明を実施するための最良の形態］との対応関係を明らかにするために付加されたものである。但し、それらの番号を、［特許請求の範囲］に記載されている発明の技術的範囲の解釈に用いてはならない。
【００１０】
構造体変数がリスト構造であるかどうかを判断するためのデバッグ情報がコンパイラにより埋め込まれた実行形式プログラム（３０）を格納するための記憶部と、
前記実行形式プログラム（３０）の実行及び停止を制御するプログラム実行制御部（１０１）と、
前記実行形式プログラム（３０）の実行中、実行結果情報を表示させたい変数名の入力と、前記デバッグ情報とに基づいて前記変数名に対応する変数が構造体であるかどうかを判定し、構造体であった場合は、当該構造体型のメンバを解析し、前記変数の構造体型と同じ構造体型へのポインタの個数を判定し、前記同じ構造体型へのポインタの個数と前記実行形式プログラム（３０）の実行結果とに基づいて前記変数のリスト構造の形態を判定するデバッグ情報解析部（１０３）と
を具備する
プログラムデバッグ装置（１０）。
【００１１】
上記のプログラムデバッグ装置であって、
前記デバッグ情報解析部（１０３）の解析結果に基づいて、前記リスト構造の形態に応じた前記変数のプログラム実行結果を表示装置に表示する画面出力制御部（１０４）
を更に具備する
プログラムデバッグ装置（１０）。
【００１２】
なお、［特許請求の範囲］の記載において、処理対象アドレス＝ｐ、ポインタ＝ｎｅｘｔとすることができる。また、第１のポインタ＝ｎｅｘｔ、第２のポインタ＝ｐｒｅｖ、第１の処理対象アドレス＝ｐ、第２の処理対象アドレス＝ｑとすることができる。
【発明の効果】
【００１３】
リスト構造用の表示方法がデバッグ情報から判断できる。このため、プログラム開発者がリスト構造用の表示方法を定義する必要がなくなる。
【発明を実施するための最良の形態】
【００１４】
以下に本発明の第１実施形態について添付図面を参照して説明する。
図５は、本発明の構成図である。
本発明の構成は、デバッグ装置１０と、入力装置２０と、実行形式プログラム３０と、ターゲット４０と、表示装置５０を備えている。
【００１５】
デバッグ装置１０は、入力装置２０により操作され、構造体変数がリスト構造であるかどうかを判断するためのデバッグ情報がコンパイラにより埋め込まれた実行形式プログラム３０を、ターゲット４０（ターゲットとホストが同一の場合もある）にダウンロードし、プログラムの実行を制御して、現在のＣＰＵとメモリの状態を表示装置５０に表示させる。
【００１６】
図６は、本発明のデバッグ装置の構成図である。
本発明のデバッグ装置１０は、プログラム実行制御部１０１と、入力解析部１０２と、デバッグ情報解析部１０３と、画面出力制御部１０４を備えている。
【００１７】
プログラム実行制御部１０１は、実行形式プログラム３０の実行、停止、ＣＰＵの状態を取得する。入力解析部１０２は、入力装置２０からデバッグ装置１０への操作を解析する。デバッグ情報解析部１０３は、入力された実行形式プログラム３０のデバッグ情報を解析する。画面出力制御部１０４は、表示装置５０への出力を制御し、デバッグ情報に基づいて、リスト構造を持つ変数を表示装置５０に表示する。
【００１８】
デバッグ装置１０には、デバッグ情報を含んだ実行形式プログラム３０が入力として渡される。デバッグ装置１０のプログラム実行制御部１０１が、実行形式プログラム３０をターゲット４０にダウンロードし、プログラムを実行し、必要な位置でブレークする。
【００１９】
図７を例にとるとｍａｉｎ関数中の「ｒｅｔｕｒｎ」と書かれた行７０１にブレークポイントをはり、デバッガ（デバッグ装置）の変数参照機能を利用して、ポインタ変数「ｈｅａｄ」７０２が指している変数「＊ｈｅａｄ」の値を表示するように指定した時、デバッグ情報解析部１０３は、「＊ｈｅａｄ」が構造体型であるかどうかを判断する。構造体型であった場合、デバッグ情報解析部１０３は、更に構造体型のメンバを解析し、「＊ｈｅａｄ」の構造体型と等しい構造体型へのポインタが存在すれば、「＊ｈｅａｄ」の構造体型と等しい構造体型へのポインタの個数を調べる。その個数が１つであれば、画面出力制御部１０４は、画面上に図８のように変数「＊ｈｅａｄ」の構造体型のメンバを列挙した画面領域を一つの要素とし、それらを配列のように並べて表示するか、もしくは、図９のように変数「＊ｈｅａｄ」の構造体型のメンバを列挙した画面領域を一つの要素とし、それらを線でつないで表示する。
【００２０】
また、デバッガ（デバッグ装置）の変数参照機能において、図１０のように変数参照機能のための変数名入力領域にｈｅａｄ［３］と入力すると、図１１のように「ｈｅａｄ」のリスト構造を解析し、リストの４番目の項目（０から始まるインデックスのため４番目の項目になる）の値を表示する。
【００２１】
コンパイラによって作成されたデバッグ情報を含んだ実行形式プログラムには、図１２で示すような変数に関する情報が格納されている。図１２は、コンパイラにより出力されるデバッグ情報の例である。この例に示すように、デバッグ情報は、「ｓｔｒｕｃｔ  ｄａｔａの型情報」、「ｓｔｒｕｃｔ  ｄａｔａのメンバ情報」、及び「ローカル変数ｈｅａｄの型情報」を含む。「ｓｔｒｕｃｔ  ｄａｔａの型情報」には、「＊構造体型」が設定される。「ｓｔｒｕｃｔ  ｄａｔａのメンバ情報」は、「＊ｃｈａｒ型へのポインタ変数」、「＊ｉｎｔ型変数」、及び「＊ｓｔｒｕｃｔ  ｄａｔａ型へのポインタ変数」を有する。ここでは、「＊ｃｈａｒ型へのポインタ変数」は「ｓｔｒｉｎｇ」であり、「＊ｉｎｔ型変数」は「ｎｕｍｂｅｒ」であり、「＊ｓｔｒｕｃｔ  ｄａｔａ型へのポインタ変数」は「ｎｅｘｔ」である。「ローカル変数ｈｅａｄの型情報」には、「＊ｓｔｒｕｃｔ  ｄａｔａ型へのポインタ」が設定される。
【００２２】
図１２に示すように、リスト構造は通常、構造体型を利用し、各項目が保持すべきデータ１２０１，１２０２と、その構造体自身へのポインタ１２０３をメンバにする。そして、例えば、図７のｍａｉｎ関数で実行される処理により、この構造体型のデータをメモリ上に確保して、保持すべきデータを格納するメンバ「ｓｔｒｉｎｇ」と「ｎｕｍｂｅｒ」に値を代入し、新しく構造体のデータをメモリ上に確保した後、構造体自身と同じ型へのポインタ「ｎｅｘｔ」に新しくメモリ上に確保した構造体のデータのアドレスを代入する。これを繰り返すことによって、メモリ上でリスト構造を作成する。この時のメモリの状態を図１３に示す。
【００２３】
図１３の各行の最初の８桁の１６進数はメモリのアドレスを示し、最初の行の数字、０，４，８，ｃは、アドレスの下１桁を示す。データは４バイトずつの８桁の１６進数で表示している。構造体データ１３０１は、リストの１番目の項目の構造体データであり、構造体のメンバ「ｎｅｘｔ」に該当する領域には、２番目の項目の構造体データ１３０２の先頭アドレスが格納されている。構造体データ１３０１と同じように、構造体データ１３０２のメンバ「ｎｅｘｔ」に該当する領域には、３番目の項目の構造体データ１３０３の先頭アドレスが格納されており、構造体データ１３０３の構造体のメンバ「ｎｅｘｔ」に該当する領域には、構造体データ１３０４の先頭アドレスが格納されている。リストの最後の項目である構造体データ１３０４の構造体のメンバ「ｎｅｘｔ」に該当する領域には、終端を表す値０が格納されている。
【００２４】
デバッグ装置のブレーク機能を利用して、リスト構造が作成されている状態でプログラムを停止し、変数参照機能を用いて、リスト構造の先頭、もしくは途中の項目を指している変数の内容を表示する時に、デバッグ情報から構造体型であるか、その構造体変数のメンバに、その構造体型自身へのポインタがいくつ存在するかを解析する。
【００２５】
上記で解析したポインタの数が１つの場合、その作成された構造が、線形リストであるとみなすことができる。この時、表示する変数の内容をメモリから読み込み、表示すべきデータを格納しているメンバ「ｓｔｒｉｎｇ」と「ｎｕｍｂｅｒ」の値を取得する。次に、この構造体自身と同じ型へのポインタ「ｎｅｘｔ」の値を取得し、次の項目のデータが格納されているアドレスを解析する。次の項目についても同じように、表示すべきデータを取得し、その次の項目のデータが格納されているアドレスを解析する。これを繰り返すことにより、リスト構造として作成されたデータを一括して取得し、図８、図９、図１１のように表示することが可能となる。
【００２６】
また、解析したポインタの数が２つの場合、そのうちの１つのポインタが指している次の項目のもう片方のポインタが指しているアドレスが現在の項目を指しているかどうかを常に確認して図１４のように表示することが可能となる。そうでない場合は、リスト構造ではないと判断して、通常の構造体として表示する。
【００２７】
デバッグ装置１０は、入力装置２０からリストの情報を表示するように指定された場合、実行形式プログラム３０に含まれるデバッグ情報を参照し、その構造体型自身へのポインタが１つであるならば、図１５のフローチャートに従い、また、その構造体型自身へのポインタが２つであるならば、図１６Ａ、図１６Ｂのフローチャートに従い、リスト構造の項目数、リストの構成を表示装置５０に表示する。リストの構成は、線形リストであるか、リングバッファであるかを示している。
【００２８】
なお、線形リストは、図９のように、１つの構造体が次の構造体を示すポインタを持っている形態である。
【００２９】
リングバッファは、線形リスト、あるいは図１４のような双方向リストのどちらの場合にもありえる形態である。線形リストの場合は、図９を例に説明すると、「ｔｒｅｅ」と「１００３」が代入されている構造体が、更に「ｂｏｏｋ」と「１０００」が代入されている構造体を、次の構造体として示すポインタを持っている形態である。双方向リストの場合は、図１４を例に説明すると、「ｔｒｅｅ」と「１００３」が代入されている構造体が、更に「ｂｏｏｋ」と「１０００」が代入されている構造体を、次の構造体として示すポインタを持ち、且つ、「ｂｏｏｋ」と「１０００」が代入されている構造体が、「ｔｒｅｅ」と「１００３」が代入されている構造体を、前の構造体として示すポインタを持っている形態である。
【００３０】
図１５のフローチャートについて以下に説明する。
（１）ステップＳ１０１
表示したい変数名を入力装置２０から入力する。ここでは、入力された変数名を「ｌｉｓｔ」とする。ポインタ変数「ｐ」を用意し、入力された変数「ｌｉｓｔ」のアドレスを代入する。また、整数型変数「ｓｕｍ」を用意し、０で初期化する。既に解析したアドレスを保持する集合を「ｓｅｔ」とする。「ｓｅｔ」に「ｐ」の値を代入し、「ｓｕｍ」に１を加算（インクリメント）する。なお、ここでは「ｌｉｓｔ」が持つ自分自身と同じ型のポインタであるメンバの名前を「ｎｅｘｔ」とする。終端を表す値は通常０であるが、デバッグ装置１０への入力を通して指定することも可能である。
（２）ステップＳ１０２
ここで、「ｐ」が終端を表す値であるか、又は、「ｐ」の値が「ｓｅｔ」に存在するかを確認する。
（３）ステップＳ１０３
「ｐ」が終端を表す値でなく、且つ、「ｐ」の値が「ｓｅｔ」に存在しない場合、「ｓｕｍ」に１を加算（インクリメント）する。また、「ｐ」の値を「ｓｅｔ」に追加する。更に、「ｐ」に「ｐ」が指す構造体変数のメンバ「ｎｅｘｔ」を代入する。
（４）ステップＳ１０４
「ｐ」が終端を表す値である場合、又は、「ｐ」の値が「ｓｅｔ」に存在する場合、「ｓｕｍ」の値は、入力装置２０から入力された、表示装置５０へ表示したい変数「ｌｉｓｔ」のリストの項目数である。「ｐ」が変数「ｌｉｓｔ」のアドレスと等しい場合、表示したい変数「ｌｉｓｔ」は、リングバッファであるとみなすことができる。「ｐ」が終端を表す値の場合、表示したい変数「ｌｉｓｔ」は線形リストであるとみなすことができる。
【００３１】
図１６Ａ、図１６Ｂのフローチャートについて以下に説明する。
（１）ステップＳ２０１
表示したい変数名を入力装置２０から入力する。ここでは、入力された変数名を「ｌｉｓｔ」とする。ポインタ変数「ｐ」と「ｑ」を用意し、それぞれに入力された変数「ｌｉｓｔ」のアドレスを代入する。また、整数型変数「ｓｕｍ」を用意し、０で初期化する。既に解析したアドレスを保持する集合を「ｓｅｔ」とする。「ｓｅｔ」に「ｐ」の値を代入し、「ｓｕｍ」に１を加算（インクリメント）する。なお、ここでは「ｌｉｓｔ」が持つ自分自身と同じ型のポインタである２つのメンバのうち、どちらか一方を「ｎｅｘｔ」とし、もう一方を「ｐｒｅｖ」とする。例えば、ソースプログラム中、最初に定義されている方を「ｎｅｘｔ」、次に定義されている方を「ｐｒｅｖ」とすることが考えられる。終端を表す値は通常０であるが、デバッグ装置１０への入力を通して指定することも可能である。
（２）ステップＳ２０２
ここで、「ｐ」が終端を表す値であるか、又は、「ｐ」の値が「ｓｅｔ」に存在するかを確認する。
（３）ステップＳ２０３
「ｐ」が終端を表す値でなく、且つ、「ｐ」の値が「ｓｅｔ」に存在しない場合、「ｓｕｍ」に１を加算（インクリメント）する。「ｑ」に「ｐ」の値を代入する。また、「ｐ」の値を「ｓｅｔ」に追加する。更に、「ｐ」に「ｐ」が指す構造体変数のメンバ「ｎｅｘｔ」を代入する。
（４）ステップＳ２０４
「ｐ」が指す構造体変数のメンバ「ｐｒｅｖ」が「ｑ」の値と等しいか判定する。
（５）ステップＳ２０５
「ｐ」が指す構造体変数のメンバ「ｐｒｅｖ」が「ｑ」の値と等しくない場合、表示したい変数「ｌｉｓｔ」は双方向リストではない。
（６）ステップＳ２０６
「ｐ」が終端を表す値である場合、又は、「ｐ」の値が「ｓｅｔ」に存在する場合、「ｐ」の値が変数「ｌｉｓｔ」のアドレスと等しいか判定する。
（７）ステップＳ２０７
「ｐ」が変数「ｌｉｓｔ」のアドレスと等しい場合、表示したい変数「ｌｉｓｔ」は、リングバッファであるとみなすことができる。また、「ｓｕｍ」の値は、入力装置２０から入力された、表示装置５０へ表示したい変数「ｌｉｓｔ」のリストの項目数である。
（８）ステップＳ２０８
「ｐ」が変数「ｌｉｓｔ」のアドレスと等しくない場合、「ｐ」に変数「ｌｉｓｔ」のメンバ「ｐｒｅｖ」の値を代入する。また、「ｑ」に変数「ｌｉｓｔ」のアドレスを代入する。
（９）ステップＳ２０９
ここで、「ｐ」が終端を表す値であるか、又は、「ｐ」の値が「ｓｅｔ」に存在するかを確認する。
（１０）ステップＳ２１０
「ｐ」が終端を表す値でなく、且つ、「ｐ」の値が「ｓｅｔ」に存在しない場合、「ｓｕｍ」に１を加算（インクリメント）する。「ｑ」に「ｐ」の値を代入する。また、「ｐ」の値を「ｓｅｔ」に追加する。更に、「ｐ」に「ｐ」が指す構造体変数のメンバ「ｐｒｅｖ」を代入する。
（１１）ステップＳ２１１
「ｐ」が指す構造体変数のメンバ「ｎｅｘｔ」が「ｑ」の値と等しいか判定する。等しくない場合、表示したい変数「ｌｉｓｔ」は双方向リストではない。
（１２）ステップＳ２１２
「ｐ」が終端を表す値である場合、又は、「ｐ」の値が「ｓｅｔ」に存在する場合、表示したい変数「ｌｉｓｔ」は双方向リストであり、「ｓｕｍ」の値は、入力装置２０から入力された、表示装置５０へ表示したい変数「ｌｉｓｔ」のリストの項目数である。
【００３２】
以下に本発明の第２実施形態について説明する。
本発明の第１実施形態では、リスト構造のそれぞれの項目についての情報を表示する機能を提供しているが、本発明の第２実施形態では、リスト構造の構成と項目数について表示する機能を提供する。これにより、例えば、期待する項目数が分かっている場合に、作成されているリスト構造が正しいかどうかを、即座に確認する手段を提供する。
【００３３】
以上のように、本発明のデバッグ装置は、デバッグ情報を含む実行形式プログラムと、表示させたい変数名を入力とし、その２つの入力から自動でリスト構造であるかどうかを判定し、リスト構造を持った構造体について、通常の構造体とは異なる表示方法（図８，９，１１，１４のような表示方法）を特別に用意する。すなわち、デバッグ情報のパターンから、構造体変数がリスト構造であるかどうかを判断し、リスト構造であれば、リスト構造用の表示を行うようにした。なお、本発明のデバッグ装置は、一般的なコンピュータが、本発明のデバッグ装置と同じ動作をするためのプログラムを実行することで実現しても良い。
【００３４】
リスト構造であるかどうかを判定するために、構造体変数のメンバを調べた時、その構造体型と同じ型のメンバの数が１個又は２個の時の場合にリスト構造である可能性がある。０個又は３個以上の場合は、リスト構造でないとみなす。したがって、この発明の対象は、同じ型のメンバの数が１個、２個の構造体型変数の場合のみである。
【００３５】
本発明では、デバッグ情報はコンパイラが生成するものであり、リスト構造用の表示方法はデバッグ情報だけから判断できるようにしたため、プログラム開発者がリスト構造用の表示方法を定義する必要がなくなる。
【００３６】
また、本発明を適用することにより、リスト構造を持つデータの内容把握が容易になる。また、リスト構造を持つデータがプログラムにより正しく生成されているかどうかの確認が容易になる。また、リスト構造を持つデータに対して、リスト構造専用の表示、処理を行うデバッグ装置を開発できる。更に、リスト構造を持つデータの迅速な把握によりデバッグ作業が短縮される。
【図面の簡単な説明】
【００３７】
【図１】図１は、リスト構造を持つ変数の表示例を示す図である。
【図２】図２は、従来技術の構成図である。
【図３】図３は、従来技術による、変数表示方法の指定例を示す図である。
【図４】図４は、従来記述による、変数表示方法の記述例を示す図である。
【図５】図５は、本発明の構成図である。
【図６】図６は、本発明による、デバッグ装置の構成図である。
【図７】図７は、構造体型によるリスト構造定義ソースプログラムの例を示す図である。
【図８】図８は、本発明による、リスト構造を持つ変数の表示例を示す図である。
【図９】図９は、本発明による、リスト構造を持つ変数の表示例を示す図である。
【図１０】図１０は、本発明による、入力の例を示す図である。
【図１１】図１１は、本発明による、出力の例を示す図である。
【図１２】図１２は、コンパイラにより出力されるデバッグ情報の例を示す図である。
【図１３】図１３は、リスト構造作成時のメモリの状態例を示す図である。
【図１４】図１４は、本発明による、リスト構造（双方向リスト）を持つ変数の表示例を示す図である。
【図１５】図１５は、本発明による、線形リストに関するデータを解析するフローチャートである。
【図１６Ａ】図１６Ａは、本発明による、双方向リストに関するデータを解析するフローチャートである。
【図１６Ｂ】図１６Ｂは、本発明による、双方向リストに関するデータを解析するフローチャートである。
【符号の説明】
【００３８】
１０…  デバッグ装置
２０…  入力装置
３０…  実行形式プログラム
４０…  ターゲット
５０…  表示装置
１０１…  プログラム実行制御部
１０２…  入力解析部
１０３…  デバッグ情報解析部
１０４…  出力制御部
２０１…  ソースプログラム
２０２…  ターゲット用コンパイラ
２０３…  実行形式プログラム
２０４…  表示プラグインソースプログラム
２０５…  ホスト用コンパイラ
２０６…  表示プラグイン
２０７…  デバッグ装置
３０１…  ＃ｐｒａｇｍａコンパイラ指示子
４０１…  表示メソッドの定義
７０１…  「ｒｅｔｕｒｎ」と書かれた行
７０２…  ポインタ変数「ｈｅａｄ」（「＊ｈｅａｄ」）
１２０１…  各項目が保持すべきデータ（「ｓｔｒｉｎｇ」）
１２０２…  各項目が保持すべきデータ（「ｎｕｍｂｅｒ」）
１２０３…  構造体自身へのポインタ（「ｎｅｘｔ」）
１３０１…  リストの１番目の項目の構造体データ
１３０２…  リストの２番目の項目の構造体データ
１３０３…  リストの３番目の項目の構造体データ
１３０４…  リストの４番目（最後）の項目の構造体データ
【図１】
2008146310.tif 000003
【図２】
2008146310.tif 000004
【図３】
2008146310.tif 000005
【図４】
2008146310.tif 000006
【図５】
2008146310.tif 000007
【図６】
2008146310.tif 000008
【図７】
2008146310.tif 000009
【図８】
2008146310.tif 000010
【図９】
2008146310.tif 000011
【図１０】
2008146310.tif 000012
【図１１】
2008146310.tif 000013
【図１２】
2008146310.tif 000014
【図１３】
2008146310.tif 000015
【図１４】
2008146310.tif 000016
【図１５】
2008146310.tif 000017
【図１６Ａ】
2008146310.tif 000018
【図１６Ｂ】
2008146310.tif 000019