JPH11184727A - 情報処理装置及びその方法、コンピュータ可読メモリ - Google Patents

情報処理装置及びその方法、コンピュータ可読メモリ

Info

Publication number
JPH11184727A
JPH11184727A JP9355658A JP35565897A JPH11184727A JP H11184727 A JPH11184727 A JP H11184727A JP 9355658 A JP9355658 A JP 9355658A JP 35565897 A JP35565897 A JP 35565897A JP H11184727 A JPH11184727 A JP H11184727A
Authority
JP
Japan
Prior art keywords
instance
class
link
program
pointer
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.)
Withdrawn
Application number
JP9355658A
Other languages
English (en)
Inventor
Seiji Sasaki
誠司 佐々木
Hiroyasu Watanabe
浩康 渡辺
Masataka Bessho
正隆 別所
Atsushi Hirahara
厚志 平原
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.)
Canon Inc
Original Assignee
Canon Inc
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 Canon Inc filed Critical Canon Inc
Priority to JP9355658A priority Critical patent/JPH11184727A/ja
Publication of JPH11184727A publication Critical patent/JPH11184727A/ja
Withdrawn legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

(57)【要約】 【課題】 プログラムのデバッグを効率的に実行するこ
とができる情報処理装置及びその方法、コンピュータ可
読メモリを提供する。 【解決手段】 プログラムのソースコード中にデバッグ
用マクロを入力装置6より挿入する。次に、デバッグ用
マクロを有効にしたソースコードのコンパイルを任意の
コンパイラで実行し、コンパイルされた実行プログラム
を、デバッグ用マクロに基づいてデバッグする。そし
て、デバッグに関する情報を表示装置8に出力する。

Description

【発明の詳細な説明】
【0001】
【発明が属する技術分野】本発明は、プログラムをデバ
ッグする情報処理装置及びその方法、コンピュータ可読
メモリに関するものである
【従来の技術】一般にプログラムのデバッグには、シン
ボリックデバッガが使用される。シンボリックデバッガ
は、プログラム中に使用される変数、関数といったプロ
グラムを構成する基本部品に対して、プログラムソース
コードとプログラム実行中のメモリアドレスを対応づけ
るシンボルテーブルを用いて、ソースコード上でユーザ
が指示した変数、関数、関数内の特定の実行行に対し
て、ブレークポイントの設定、変数の内容表示等の機能
を備える。また、変数が構造体データであった場合、メ
ンバ毎に構造体の内容を表示する機能も通常備える。
【0002】オブジェクト指向プログラムでは、継承等
の手段により複雑に絡み合ったプログラム構成部品(ク
ラス)を作成することも可能である。しかしながら、通
常のシンボリックデバッガでは、ユーザが定義したクラ
ス及びそれらの関係に関する詳細な情報をシンボルテー
ブル内に保持しないため、クラスのインスタンス、クラ
ス間の関係に基づくインスタンスのグループといった単
位でのデバッグは困難であるという第1の問題点があ
る。
【0003】また、オブジェクト指向プログラムでは、
クラスのインスタンスを動的に生成、削除し、それらイ
ンスタンスをポインタでリンクして管理する場合が多
い。シンボルテーブルは、コンパイラがデバッグ対象プ
ログラムを静的に解析した結果を記録したものであり、
静的なオブジェクト(静的変数、関数定義)に関する情
報しか含まれていない。従って、動的に生成されたイン
スタンスをシンボリックデバッガ上で特定するのは困難
であるという第2の問題点がある。
【0004】特開平5−108403では、ユーザが作
成したクラスに、デバッグ機能を備えたデバッグメソッ
ドを挿入させ、デバッグメソッドを通じて、デバッガと
のインタフェース、インスタンスの詳細な状態表示、ク
ラス間の関係に基づくインスタンスのグループ表示等を
行わせることで第1の問題点を解決する。
【0005】特開平8−16428では、独自のコンパ
イラシステムを作成することにより、デバッグ対象のグ
ローバル関数、デバッグ対象クラスのメンバ関数に対
し、デバッグ操作を受け持つウインドウシステム上のウ
インドウを作成、削除するデバッグ用命令コードを埋め
込む。そして、デバッグ対象クラス型のポインタ変数の
値を変更する箇所に、インスタンス間のリンク関係を表
現する矢印等を描画するコードを埋め込むことで第2の
問題点を解決する。
【0006】また、特開平8−16428では、デバッ
グ対象プログラム内でインスタンスが動的に作成された
場合、ウインドウシステム上に対応するウインドウを作
成する。また、インスタンスが削除された場合、同ウイ
ンドウを削除することで、プログラム内のインスタンス
と、ウインドウシステム上のウインドウを一対一に対応
づける。そして、ウインドウ上で各種デバッグ操作を受
け付け、デバッグ操作毎に定義されたコールバック関数
を呼び出し、デバッグ機能を実現する。
【0007】
【発明が解決しようとする課題】しかしながら、特開平
5−108403では、ユーザが新規のクラスを設計す
るたびに、デバッグ機能を実現するデバッグメソッドを
実装しなければならない。また、デバッグ中にインスタ
ンスを特定するために、シンボリックデバッガの機能を
利用するため、動的に生成されたインスタンス対して利
用するのは困難である。
【0008】また、特開平8−16428では、上記デ
バッグ用命令コードを挿入する独自のコンパイラシステ
ムを作成する必要がある。従って、もし、ユーザが拡張
された言語機能を持つコンパイラを使用してプログラム
を開発している場合、または特開平8−16428が実
現するデバッグ機能を備えたコンパイラがサポートされ
ていないコンピュータシステム、オペレーティングシス
テム上でプログラムを開発している場合、更に、組み込
み機器上で動作するプログラムを開発している場合は、
特開平8−16428が実現するデバッグ機能の利用は
困難である。
【0009】また、市販のコンパイラは、ベンダが指定
した構成管理ツール、エディタ、デバッガ等のツール群
と統合化されて使用されることで、生産性の高い統合開
発環境を提供する場合がある。そして、このような統合
開発環境と、特開平8−16428が実現するデバッグ
機能は、上記の理由から共存させることは困難である。
【0010】本発明は上記の問題点に鑑みてなされたも
のであり、プログラムのデバッグを効率的に実行するこ
とができる情報処理装置及びその方法、コンピュータ可
読メモリを提供することを目的とする。
【0011】
【課題を解決するための手段】上記の目的を達成するた
めの本発明による情報処理装置は以下の構成を備える。
即ち、プログラムをデバッグする情報処理装置であっ
て、前記プログラムのソースコード中にデバッグ用マク
ロを挿入する挿入手段と、前記デバッグ用マクロを有効
にした前記ソースコードのコンパイルを任意のコンパイ
ラで実行する実行手段と、前記実行手段でコンパイルさ
れた実行プログラムを、前記デバッグ用マクロに基づい
てデバッグするデバッグ手段と、前記デバッグ手段によ
るデバッグに関する情報を出力する出力手段とを備え
る。
【0012】また、好ましくは、前記実行手段は、前記
実行プログラムが生成するインスタンス間のリンクの変
化を引き起こすソースコード個所を前記コンパイラによ
って検出させ、前記ソースコード箇所に前記デバッグ用
マクロに基づいてデバッグ用命令コードを該コンパイラ
に挿入させる。
【0013】また、好ましくは、前記挿入手段は、デバ
ッグ対象のプログラムのクラス定義内、クラスの実装フ
ァイル内、クラスのコンストラクタ内、デストラクタ
内、クラスを指すポインタ変数の宣言部分に、前記デバ
ッグ用マクロを挿入する。
【0014】また、好ましくは、前記デバッグ手段は、
前記デバッグ用マクロに基づいて、前記実行プログラム
によるインスタンスの生成/削除の通知、リンクポイン
タの生成/削除/変更通知から、該プログラム内のイン
スタンスの生存状態、クラスの継承関係、インスタンス
間のリンク関係を再現する。
【0015】また、好ましくは、前記デバッグ手段によ
って、前記実行プログラムによるインスタンスの生成と
削除、インスタンス間のリンク関係の変化を検出し、状
態変化が発生した場合は、該プログラムを一時停止させ
る。
【0016】また、好ましくは、外部装置と通信する通
信手段を更に備え、前記通信手段を介して、前記デバッ
グ手段は、前記外部装置上のデバッグ対象の実行プログ
ラムをデバッグする。
【0017】上記の目的を達成するための本発明による
情報処理方法は以下の構成を備える。即ち、プログラム
をデバッグする情報処理方法であって、前記プログラム
のソースコード中にデバッグ用マクロを挿入する挿入工
程と、前記デバッグ用マクロを有効にした前記ソースコ
ードのコンパイルを任意のコンパイラで実行する実行工
程と、前記実行工程でコンパイルされた実行プログラム
を、前記デバッグ用マクロに基づいてデバッグするデバ
ッグ工程と、前記デバッグ工程によるデバッグに関する
情報を出力する出力工程とを備える。
【0018】上記の目的を達成するための本発明による
コンピュータ可読メモリは以下の構成を備える。即ち、
プログラムをデバッグする情報処理のプログラムコード
が格納されたコンピュータ可読メモリであって、前記プ
ログラムのソースコード中にデバッグ用マクロを挿入す
る挿入工程のプログラムコードと、前記デバッグ用マク
ロを有効にした前記ソースコードのコンパイルを任意の
コンパイラで実行する実行工程のプログラムコードと、
前記実行工程でコンパイルされた実行プログラムを、前
記デバッグ用マクロに基づいてデバッグするデバッグ工
程のプログラムコードと、前記デバッグ工程によるデバ
ッグに関する情報を出力する出力工程のプログラムコー
ドとを備える。
【0019】
【発明の実施の形態】本発明の概要について、以下に説
明する。
【0020】例えば、プログラミング言語C++等の高
級プログラミング言語では、インスタンスの生成時に
は、自動的にコンストラクタ(インスタンスの初期化関
数)が呼び出される。また、インスタンスの削除時に
は、自動的にデストラクタ(インスタンスの後始末関
数)が呼び出される。本発明は、この点に注目し、本発
明では、デバッグ対象クラスのコンストラクタとデスト
ラクタのコード内に、デバッグマクロをユーザに挿入さ
せる。
【0021】そして、このデバッグマクロは、デバッグ
モードでコンパイルすれば、インスタンスの生成と削除
をデバッガに通知する関数の呼出し命令に展開される。
また、非デバッグモードでコンパイルすれば、空文字列
に展開される。特に、デバッグマクロが挿入されたプロ
グラムを、非デバッグモードでコンパイルすれば、同デ
バッグマクロ挿入前のプログラムと同一の実行形式ファ
イルが生成される。
【0022】また、プログラミング言語C++では、
=、*、==、−>等の演算子の意味を多重定義するこ
とができる(つまり、プログラミング言語C++は言語
の拡張機能を持つ)ことに注目し、デバッグ対象クラス
ヘのポインタ型を同クラス型を引数とするデバッグマク
ロにユーザに置換させる。
【0023】そして、このデバッグマクロは、デバッグ
モードでコンパイルすれば、ポインタの設定及び変更を
デバッガに通知する機能を備えたテンプレートクラス型
に展開される。また、非デバッグモードでコンパイルす
れば、マクロ引数型へのポインタ型に展開される(つま
り、元に戻る)。
【0024】そして、テンプレートクラスは、プログラ
ミング言語C++で定義されているポインタ演算一式を
多重定義する。そのため、プログラミング言語C++の
言語仕様により、テンプレートクラスの変数(元々は、
デバッグ対象クラスを指すポインタ変数であったもの)
に対する代入等の演算子の適用は、テンプレートクラス
が多重定義した演算子関数の呼び出し命令に置き換えら
れる。
【0025】つまり、テンプレートクラスの多重定義演
算子関数は、ポインタ変数に対する元々の意味を変更す
ることなく、ポインタ変数値の変更(リンク変更)をデ
バッガに通知する機能を備える。
【0026】このようなポインタ変数の意味の変更は、
プログラミング言語C++の言語仕様の範囲内で行って
いるので、コンパイラ自身を別途独自に作成する必要は
ない。つまり、、非デバッグモードで上述のデバッグマ
クロが挿入されたプログラムをどのようなC++コンパ
イラを使用してコンパイルしても、オリジナルのプログ
ラムをコンパイルしたのと同一の実行形式プログラムが
作成される。また、デバッグモードでコンパイルすれ
ば、インスタンスの生成と削除、インスタンス間のリン
ク関係の変化をデバッガに通知する機能を有する実行形
式プログラムが作成される。
【0027】本発明のデバッガは、実行中のプログラム
が生成したインスタンス、インスタンス間のリンク関係
を再現したデータ構造(以下、オブジェクト管理情報と
称する)を管理し、表示装置にその内容をグラフィカル
に描画する機能を備える。また、実行中のプログラムか
らインスタンスの生成、インスタンスの削除、インスタ
ンス間のリンクの変化をイベントとして受け取る度に、
オブジェクト管理情報にその内容を反映し表示装置に最
新情報を描画する。
【0028】また、本発明のデバッガは、デバッグ対象
クラスが継承関係にある場合、プログラミング言語C+
+では、派生クラスのインスタンスのアドレスと派生ク
ラスのインスタンスが内包する基底クラスのインスタン
スのアドレスが同一であることにまず注目する。また、
派生クラスのインスタンスが生成されるときには、基底
クラスのコンストラクタ、派生クラスのコンストラクタ
がこの順に呼び出されることに注目する。そして、イン
スタンスの生成がデバッガに通知された際、生成された
インスタンスのアドレスを調べる。このアドレスが既に
生成通知済みであるインスタンスのアドレスに一致する
ならば、同インスタンスは、派生クラスのインスタンス
生成過程において、派生クラスのコンストラクタが実行
中であることが判明する。デバッガは、この時点で、継
承関係をオブジェクト管理情報内に確立する。
【0029】また、本発明のデバッガは、デバッグ対象
プログラムの実行時に、動的にクラスの継承関係を認識
するため、デバッグ対象プログラムを予め静的に解析す
る必要はない。
【0030】また、本発明のデバッガは、マウスなどの
ポインティングデバイスを通じて、実行中のプログラム
が使用するクラス毎に、またはインスタンス毎にブレー
クポイントの設定をオン・オフする機能を有する。ま
た、ブレークポイントが設定されたインスタンスに対す
る削除通知イベント、リンク変更通知イベント、または
ブレークポイントが設定されたクラスに属するインスタ
ンスに対する生成通知イベント、削除通知イベント、リ
ンク変更通知イベントを受け取ると、プログラムの実行
をブロック(一時中断)する。
【0031】また、本発明のデバッグシステムは、ソー
スレベルでデバッグマクロを挿入するという原始的な方
法を採用する。そのため、既存のどのようなC++コン
パイラを使用しても、デバッグ機能を備えた実行形式プ
ログラムを作成することができる。同様に、既存の構成
管理ツール、デバッガ、プロファイラ、GUIビルダ等
と共用することが容易である。
【0032】また、本発明のデバッグシステムは、デバ
ッグ対象プログラムから通信回線を通じてデバッガにイ
ンスタンスの生成と削除、リンク変更のイベントを送る
構成をとることも可能である。そのため、デバッグ対象
プログラムが、デバッガが実行されているコンピュータ
システムと異なるコンピュータシステム、あるいは、組
み込み機器に搭載されていても、通信回線を介したデバ
ッグを実現することができる。この場合も、本デバッグ
システムは、既存のICE等のデバッグ装置と共用する
ことが容易である以下、図面を参照して本発明の好適な
実施形態を詳細に説明する。
【0033】図1は本発明の実施形態の情報処理装置の
構成を示す図である。
【0034】図1において、1はCPUであり、以下に
説明する2〜10の情報処理装置の各構成要素を、バス
2を介してアクセスし制御を行う。3はバス2を介して
CPU1からアクセス可能な読み出し専用メモリ(RO
M)であり、本実施形態では、その動作を詳細に説明す
る処理プログラム3a及び処理プログラム3aにより使
用されるパラメータ3bが格納されている。4は読み書
き可能なメモリ(RAM)であり、RAM4上には、上
記処理プログラム3aにより作成/変更がなされるオブ
ジェクト管理情報4aを格納するための領域が確保され
ている。
【0035】5は入力インタフェースであり、キーボー
ド、マウス、タブレット等の入力装置6を介してなされ
る入力を受け取る。7は出力インタフェースであり、C
RT、LCD等の表示装置8a、更には、プリンタ、プ
ロット等の記録装置8bを有する出力装置8に対し、デ
ータの出力を行う。9は外部記憶装置インタフェースで
あり、HD、FD、CD−ROM、MOD等の外部記憶
装置10に対するデータの入出力を行うものである。
【0036】本実施形態では、動作の詳細な説明を行う
処理プログラム3aやパラメータ3bがROM3上にあ
るものとして、オブジェクト管理情報4aを含む処理対
象となる各データの格納領域をRAM4上にあるものと
して説明を行うが、これらは全て、外部記憶装置10上
に配置することも可能である。また、必要に応じて、外
部記憶装置10からRAM4上にロードし、使用するこ
ともできる。更に、CPU1に内蔵されるキャッシュメ
モリ上に配置することも可能である。
【0037】次に、本発明の概要について図2を用いて
説明する。
【0038】図2は本発明の概要を説明するための図で
ある。
【0039】図2において、101はプログラミング言
語C++で記述されたデバッグ対象プログラムのソース
コードである。102はソースコード101から通常の
コンパイル及びリンク操作により作成した実行形式ファ
イルである。103はデバッグ対象プログラムのソース
コード101にデバッグ機能に必要なマクロ(以下、デ
バッグマクロと称する)がユーザにより挿入されたソー
スコードである。
【0040】104は埋め込みソースコード103を非
デバッグモードでコンパイル及びリンクした実行形式フ
ァイルであり、オリジナルのソースコード101に対す
る実行形式ファイル102と同一内容を持つ。106は
埋め込みソースコード103をデバッグモードでコンパ
イル及びリンクしたデバッグ可能実行形式ファイルであ
る。このデバッグ可能実行形式ファイル106を、オペ
レーティングシステム上で実行することで、デバッグ対
象プログラムの実行経路におけるインスタンスの生成と
削除、インスタンス間のリンクの設定と変更をデバッガ
スレッド207に通知する機能を有する。
【0041】105は埋め込みソースコード103に取
り込まれ、デバッグマクロからデバッグ機能に必要とさ
れるソースコードを生成するためのヘッダファイル(以
降、デバッグヘッダと称する)である。デバッグヘッダ
105は、非デバッグモードでコンパイルされる時、デ
バッグマクロをオリジナルのソースコード101の該当
するコード片と同一内容に変換する。また、デバッグモ
ードでコンパイルされる時、デバッグマクロをデバッグ
機能を実現するためのコード片に変換する。
【0042】205はデバッガスレッド207のデバッ
ガスレッド初期化関数であり、デバッグ対象プログラム
のエントリ関数から呼び出される。このデバッガスレッ
ド初期化関数205は、デバッグ機能のグラフィカルユ
ーザインタフェースを受け持つデパッガスレッド207
を生成する。107はデバッグ対象プログラムの実行経
路において、デバッグ対象のクラスに属するインスタン
スの生成と削除の履歴、現在時点における生存中インス
タンスの状態とインスタンス間のリンク関係を再現した
オブジェクト管理情報である。
【0043】208はデバッグ対象プログラムの実行経
路において、インスタンスの生成と削除、インスタンス
間のリンク設定又はリンク変更が発生した場合に呼び出
されるデバッグライブラリ関数群である。これのらのデ
バッグライブラリ関数群208は、デバッグ対象プログ
ラムの内部状態をオブジェクト管理情報107に再現
し、デバッガスレッド207にオブジェクト管理情報1
07の描画要求をポストする。
【0044】207はオブジェクト管理情報107をオ
ブジェクトウインドウ301内へ描画し、更に、オブジ
ェクト管理情報107に対するブレークポイントの設定
等のグラフィカルユーザインタフェース機能を受け持つ
デバッガスレッドである。
【0045】次に、デバッグ対象プログラムの一例とし
て、順序木データ構造(以下、順序木クラスと称する)
と順序木の生成過程について、図3〜図13を用いて説
明する。
【0046】図3は本発明の実施形態の順序木クラスを
示す図である。
【0047】図3において、列111はソースコード中
に現れるデータメンバ名を示す。列112は該当するデ
ータメンバの意味を示す。行211は順序木が保持する
整数要素数を管理する整数データメンバcountを示
し、行212は順序木のルートノードを指すポインタメ
ンバrootを示す。
【0048】尚、本実施形態では、順序木クラスのイン
スタンスの生成と削除及び順序木クラスのrootポイ
ンタメンバはデバッグ対象に含めるものとする。
【0049】図4は本発明の実施形態の順序木のノード
データ構造(以下、ノードクラスと称する)を示す図で
ある。
【0050】図4において、列111と列112は、図
3と同様であるので、その説明は省略する。行221は
ノードが保持する整数値を格納するデータメンバval
ueである。行222は該ノードのvalueデータメ
ンバが保持する整数値の反復数、つまり、順序木がva
lueデータメンバが示す整数値をいくつ保持するかを
示す整数データメンバcountである。行213は順
序木において、該ノードが保持する整数値valueよ
りも小さな整数の集合を保持する部分順序木のルートノ
ードを指すポインタメンバleftである。行224は
該ノードが保持する整数値valueよりも大きな整数
の集合を保持する部分順序木のルートノードを指すポイ
ンタメンバrightである。
【0051】尚、本実施形態では、ノードクラスのイン
スタンスの生成と削除及びノードクラスのleft、r
ightポインタメンバはデバッグ対象に含めるものと
する。
【0052】図5は本発明の実施形態の順序木クラスと
ノードクラスの各インスタンスがどのように結合して、
1つの順序木を構成するかを例示する図である。
【0053】図5において、131は順序木クラスのイ
ンスタンス(以降、単に順序木と称する)であり、13
2、133、134、135、136はノードクラスの
インスタンス(以降、単にノードと称する)である。
【0054】301aは順序木131のcountデー
タメンバに7が格納されていること、つまり、同順序木
は、7個の整数値を保持していることを示す。302a
はノード132が整数値3を保持することを示す。30
3はノード132が保持する整数値3の反復数は2であ
ることを示す。304はノード133が整数値2を保持
することを示す。305はノード133が保持する整数
値2の反復数は1であることを示す。
【0055】306はノード134が整数値5を保持す
ることを示す。307はノード134が保持する整数値
5の反復数は2であることを示す。308はノード13
5が整数値4を保持することを示し、309はノード1
35が保持する整数値4の反復数は1であることを示
す。310はノード136が整数値6を保持することを
示し、311はノード136が保持する整数値6の反復
数は1であることを示す。
【0056】231は順序木131のrootポインタ
メンバに、ノード132を指すポインタが格納されてい
ること、つまり、順序木131のルートノードはノード
132であることを示す。
【0057】232はノード132のleftポインタ
メンバに、ノード133を指すポインタが格納されてい
ること、つまり、ノード132をルートとする順序木が
保持する整数の集合において、ノード132が保持する
整数値3よりも小さい値がノード133をルートとする
部分順序木に存在することを示す(以降、leftポイ
ンタメンバがノードを指すとき、左部分木が存在すると
称する)。
【0058】233はノード132のrightポイン
タメンバに、ノード134を指すポインタが格納されて
いること、つまり、ノード132をルートとする順序木
が保持する整数の集合において、ノード132が保持す
る整数値3より大きい値がノード134をルートとする
部分順序木に存在することを示す(以降、rightポ
インタメンバがノードを指すとき、右部分木が存在する
と称す)。
【0059】234はノード133のleftポインタ
メンバがヌルポインタであること、つまり、ノード13
3をルートとする順序木が保持する整数の集合には、ノ
ード133が保持する整数値2よりも小さい値は存在し
ないことを示す(以降、leftポインタメンバがヌル
ポインタであるとき、左部分木が存在しないと称す
る)。
【0060】235はノード133のrightポイン
タメンバがヌルポインタであること、つまり、ノード1
33をルートとする順序木が保持する整数の集合にはノ
ード133が保持する整数値2よりも大きい値は存在し
ないことを示す(以降、rightポインタメンバがヌ
ルポインタであるとき、右部分木が存在しないと称す
る)。
【0061】236はノード134には左部分木が存在
することを示す。237はノード134には右部分木が
存在することを示す。また、238はノード135には
左部分木が存在しないことを示す。239はノード13
5には右部分木が存在しないことを示す。また、230
はノード136には左部分木が存在しないことを示す。
231aはノード136には右部分木が存在しないこと
を示す。
【0062】以上説明した図5において、ノードを左か
ら右に読めば、順序木131は整列された整数の集合
2、3、3、4、5、5、6を保持することが分かる。
【0063】次に、空の順序木の状態から図5に示す順
序木の状態に至る過程の一例について、図6〜図13を
用いて説明する。尚、図6〜図13の順序木は、それぞ
れ0個、1個、2個、3個、4個、5個、6個、7個の
整数値を保持するものとする。
【0064】図6は本発明の実施形態の空の順序木を示
す図である。
【0065】図6において、131は順序木を示す。2
41は順序木131が0個の整数値を保持することを示
す。242は、順序木131のrootポインタメンバ
がヌルポインタであること、つまり、順序木131は空
であることを示す。
【0066】図7は本発明の実施形態の図6の順序木に
整数値3を追加した後の順序木の状態を示す図である。
【0067】図7において、132は順序木131に追
加されたノードを示す。251は順序木131が1つの
整数値を保持するように変化したことを示す。252は
順序木131のルートノードがノード132に変化した
ことを示す。253はノード132が整数値3を保持す
ることを示す。254はノード132が保持する整数値
3の反復数が1であることを示す。255、256はノ
ード132には左右の部分木が共に存在しないことを示
す。
【0068】尚、図6の順序木に整数値3を追加する処
理は以下の手順で実行される。
【0069】まず、最初に順序木131のcountデ
ータメンバをインクリメントする(count値は1と
なる)。次に、順序木131のrootポインタメンバ
を調べ、それがヌルポインタであるので、そこに新規の
ノード132をぶら下げる。そして、ノード132のv
alueデータメンバ253に整数値3、countデ
ータメンバ254に整数値1、leftポインタメンバ
255及びrightポインタメンバ256にヌルポイ
ンタを格納する。
【0070】図8は本発明の実施形態の図7の順序木に
整数値5を追加した後の順序木の状態を示す図である。
【0071】図8において、133はノード132に追
加されたノードである。267はノード133が整数値
5を保持することを示す。268はノード133が保持
する整数値6の反復数が1であることを示す。269、
260はノード133の左右の部分木が存在しないこと
を示す。266は、ノード132がノード133をルー
トとする右部分木を持つように変更されたことを示す。
261は順序木131が2つの整数値を保持するように
変化したことを示す。
【0072】尚、図7の順序木に整数値5を追加する処
理は以下の手順で実行される。
【0073】まず、最初に順序木131のcountデ
ータメンバをインクリメントする(countデータメ
ンバの値は2となる)。次に、rootポインタメンバ
を調べ、それがヌルポインタでないので、rootポイ
ンタメンバが指すノード132のvalueデータメン
バ253の値と追加する整数値5を比較する。比較の結
果、整数値5がvalueデータメンバ253より大な
ので、整数値5はノード132の右部分木に含まれる必
要があることが判明する。
【0074】次に、ノード132のrightポインタ
メンバを調べ、それがヌルポインタなので、整数値5を
保持した新規のノード133を作成し、ノード132の
rightポインタメンバにノード133を指させる。
そして、ノード133のvalueデータメンバ267
に整数値5、countデータメンバ268に整数値
1、leftポインタメンバ269及びrightポイ
ンタメンバ260にはヌルポインタを格納する。
【0075】図9は本発明の実施形態の図8の順序木に
整数値4を追加した後の順序木の状態を示す図である。
【0076】図9において、134は順序木133に追
加されたノードである。271は順序木131が3つの
整数値を保持するように変化したことを示す。279は
ノード133がノード134をルートとする左部分木を
持つように変化したことを示す。271aは、ノード1
34が整数値4を保持することを示す。272はノード
134が保持する整数値4の反復数が1であることを示
す。273、274はノード134の左右の部分木が存
在しないことを示す。
【0077】図10は本発明の実施形態の図9の順序木
に整数値3を追加した後の順序木の状態を示す図であ
る。
【0078】図10において、281は順序木131が
4つの整数値を保持するように変化したことを示す。2
84はノード132が保持する整数値3の反復数が2に
変化したことを示す。
【0079】尚、図9の順序木に整数値3を追加する処
理は以下の手順で実行される。
【0080】まず、最初に順序木131のcountデ
ータメンバ281をインクリメントする(4になる)。
次に、rootポインタメンバ252がヌルポインタで
はないので、それが指すノード132のvalueデー
タメンバ253の値と追加する整数値3を比較する。比
較の結果、両者が等しいので、ノード132のcoun
tデータメンバ284をインクリメントする(2とな
る)。
【0081】図11は本発明の実施形態の図10の順序
木に整数値2を追加した後の順序木の状態を示す図であ
る。
【0082】図12は本発明の実施形態の図11の順序
木に整数値5を追加した後の順序木の状態を示す図であ
る。
【0083】図13は本発明の実施形態の図12の順序
木に整数値6を追加した後の順序木の状態を示す図であ
る。また、図13は、図6〜図12の過程を経て得られ
る図5の順序木を示したものである。
【0084】尚、図11〜図13の説明については、図
6〜図10に説明した手順と同様の手順で説明されるの
で、ここでは省略する。
【0085】次に、図5の順序木が、図6〜図13で示
した過程に従って成長した場合のオブジェクトウインド
ウ(図2の301)の遷移について、図14〜図27を
用いて説明する。
【0086】図14は本発明の実施形態のオブジェクト
ウインドウの初期状態を示す図である。
【0087】図14において、1101はオブジェクト
ウインドウであり、デバッガスレッド(図2の207)
が表示する。
【0088】図15は本発明の実施形態の順序木が図6
の状態にあるときのオブジェクトウインドウの表示状態
を示す図である。
【0089】図15において、3102は、デバッグ対
象プログラムの内部状態が変化した旨をユーザに伝える
ための確認ダイアログボックスである。3103、31
04は、確認ダイアログボックス3102をクローズす
るためのボタンである。3201は、順序木のインスタ
ンス(図6の131)を表現するインスタンスボックス
である。
【0090】確認ダイアログボックス3102は、デバ
ッグライブラリ関数群(図2の208)内のコードによ
り表示さるモーダルスタイルのダイアログである。ま
た、デバッグライブラリ関数群は、デバッグ対象プログ
ラムと、同一スレッドに属する。そのため、確認ダイア
ログボックス3102がオープンしている間、デバッグ
対象プログラムはブロックされた状態(一時停止状態)
にある。これにより、デバッグ対象プログラムの実行
と、グラフィカルユーザインタフェースを司るデバッガ
スレッド(図2の207)の同期を図ることができる。
【0091】確認ダイアログボックス3102上のYE
Sボタン3103を選択すれば、確認ダイアログボック
ス3102はクローズし、デバッグ対象プログラムは実
行を再開する。これに対し、NOボタン3104を選択
した時は、デバッグ対象プログラムは強制終了させられ
る。
【0092】インスタンスボックス3201に付加され
たラベル(Tree#0)は、インスタンスが属するク
ラス名とインスタンスが生成された順番によって合成さ
れる。この場合、クラス名はTreeであり、インスタ
ンスの生成番号は(0から数えて)0である。また、オ
ブジェクトウインドウ1101に最初に現れるインスタ
ンスボックス3201は、オブジェクトウインドウ11
01のクライアント領域の左上コーナーから、一定のマ
ージンをとった位置に表示される。
【0093】図16は本発明の実施形態の図7のNod
e#0が作成済みで、Tree#0のrootポインタ
メンバがヌルポインタの状態にあるときのオブジェクト
ウインドウを示す図である。
【0094】図16において、3202は新規作成され
たインスタンスNode#0(図7の132)を表現す
るインスタンスボックスである。特定のクラスに属する
インスタンスは、デフォルトでは、クラスに属する最初
のインスタンスが生成されたクラス順に、縦方向に一定
の間隔で表示される。この場合、順序木クラス(Tre
e)のインスタンスが最初に作成されたため、順序木ク
ラスのインスタンスは全て1行目に表示され、ノードク
ラス(Node)のインスタンスが2行目に表示され
る。
【0095】図17は本発明の実施形態の図7のTre
e#0のrootポインタメンバにインスタンスNod
e#0のアドレスが設定された直後の状態にあるときの
オブジェクトウインドウを示す図である。
【0096】図17において、3301はTree#0
のrootポインタメンバ(図7の252)がNode
#0(図7の132)を指すことを表現するリンクであ
る。リンクに付加されるラベルは、ポインタメンバ名で
あり、この場合rootとなる。
【0097】図18は本発明の実施形態の図8のNod
e#1が作成済みで、Node#0のrightポイン
タメンバがヌルポインタの状態であるときのオブジェク
トウインドウ示す図である。
【0098】図18において、3203はインスタンス
Node#1(図8の133)を表現するインスタンス
ボックスである。インスタンスボックス3203のデフ
ォルトの表示位置は、そのインスタンスがどのクラスに
属するかによって縦位置が決定される。また、そのイン
スタンスが、そのクラスの何番目に作成されたインスタ
ンスであるかによって横位置が決定される。この場合、
インスタンスボックス3203はノードクラス(Nod
e)の2番目に作成されたインスタンスを表現するた
め、2行2列の位置に表示される。
【0099】図19は本発明の実施形態の図8のNod
e#0のrightポインタメンバにNode#1のア
ドレスが設定された直後の状態であるときのオブジェク
トウインドウを示す図である。
【0100】図19において、3302はNode#0
のrightポインタメンバ(図8の266)がNod
e#1が指すことを表現するリンクであり、ラベルはポ
インタメンバ名のrightである。
【0101】図20は本発明の実施形態の図9のNod
e#2が作成済みで、Node#1のleftポインタ
メンバがヌルポインタである状態のときのオブジェクト
ウインドウを示す図である。
【0102】図20において、3204はインスタンス
Node#2(図9の134)を表現するインスタンス
ボックスである。
【0103】図21は本発明の実施形態の図9のNod
e#1のleftポインタメンバにNode#2のアド
レスが設定された直後の状態であるときのオブジェクト
ウインドウを示す図である。
【0104】図21において、3303はNode#1
のleftポインタメンバ(図9の279)がNode
#2を指すことを表現するリンクであり、ラベルはポイ
ンタメンバ名のleftである。
【0105】図22は本発明の実施形態の図11のNo
de#3が作成済みで、Node#0のleftポイン
タメンバがヌルポインタの状態であるときのオブジェク
トウインドウを示す図である。
【0106】図22において、3205はインスタンス
Node#3(図11の135)を表現するインスタン
スボックスである。尚、オブジェクトウインドウ110
1は、インスタンスとインスタンス間のリンク関係を表
現するためのものである。そのため、インスタンスの生
成と削除、及びリンクの設定と変更時にウインドウの表
示内容が変更される。従って、順序木が図9から図10
の状態へ推移してもオブジェクトウインドウ1101の
表示内容は変化せず、また、確認ダイアログボックスも
表示されない。
【0107】図23は本発明の実施形態の図11がNo
de#0のleftポインタメンバにNode#3のア
ドレスが設定された直後の状態であるときのオブジェク
トウインドウを示す図である。
【0108】図23において、3304はNode#0
のleftポインタメンバ(図11の295)がNod
e#3を指すことを表現するリンクであり、ラベルはポ
インタメンバ名のleftである。
【0109】図24は本発明の実施形態の図23の確認
ダイアログボックスをクローズする前に(つまり、デバ
ッグ対象プログラムの実行をブロックした状態で)マウ
スドラッグによりインスタンスボックスを移動した状態
を示す図である。
【0110】図24に示すように、インスタンスボック
スを移動した場合、次に作成される同クラスのインスタ
ンスは、移動したインスタンスボックスの移動前の位置
に表示される。
【0111】尚、オブジェクト管理情報(図2の10
7)は、クラス毎に次に生成されるインスタンス(以
降、次生成インスタンスと称する)の表示位置を管理し
ており、インスタンスが生成されるたびに次生成インス
タンスの表示位置を一定量右方向に移動させる。また、
ユーザがオブジェクトウインドウ1101上で、インス
タンスボックスを移動すると、移動前のインスタンスボ
ックスの位置を、次生成インスタンスの表示位置に設定
する。
【0112】図25は本発明の実施形態の図13のNo
de#4が作成済みで、Node#1のrightポイ
ンタメンバがヌルポインタの状態であるときのオブジェ
クトウインドウを示す図である。
【0113】図25において、3206はインスタンス
Node#4(図13の136)を表現するインスタン
スボックスである。尚、インスタンスボックス3206
の表示位置は、上述した次生成インスタンスの表示位置
を管理する管理アルゴリズムによって、インスタンスボ
ックス3205(図23)が移動前に存在した場所とな
る。
【0114】図26は本発明の実施形態の図13のNo
de#1のrightポインタメンバにNode#4の
アドレスが設定された直後の状態であるときのオブジェ
クトウインドウを示す図である。
【0115】図26において、3305はNode#1
のrightポインタメンバ(図13の1210)がN
ode#4を指すことを表現するリンクであり、ラベル
はポインタメンバ名のrightである。
【0116】図27は本発明の実施形態の図26の確認
ダイアログボックスをクローズする前に、マウスドラッ
グによりインスタンスボックスを適当な位置に移動した
状態を示す図である。
【0117】次に、プログラミング言語C++で記述さ
れたプログラムの内部状態をオブジェクト管理情報(図
2の107)上に再現し、オブジェクトウインドウ(図
2の301)に描画するメカニズムについて、図28〜
図39を用いて説明する。
【0118】図28は本発明の実施形態のデバッグ対象
プログラムの実行経路において、デバッグ対象クラスの
インスタンス生成をオブジェクト管理情報に反映してオ
ブジェクトウインドウ上に表示させる処理を示すフロー
チャートである。
【0119】図28において、左のフローチャートは、
プログラミング言語C++で記述されたプログラムのイ
ンスタンス生成処理を示す。真ん中のフローチャート
は、インスタンスを初期化するためのコンストラクタが
実行する処理を示す。右端のフローチャートは、デバッ
グ対象クラスのインスタンスが生成されるたびに呼び出
されるインスタンス生成通知関数が実行する処理を示
す。
【0120】尚、4114は、インスタンス生成通知関
数を関数引数としてクラス名、インスタンスサイズ、イ
ンスタンスアドレスを受け取ることを示す。また、イン
スタンス生成通知関数は、デバッグライブラリ関数群
(図2の208)に含まれるライブラリ関数である。
【0121】左端のフローチャートにおいて、まず、最
初に新規インスタンスのためのメモリ割り当てを実行す
る(ステップS102)。次に、割り当てられたメモリ
ブロックを初期化するためにコンストラクタを呼び出す
(ステップS103)。尚、クラスがデバッグ対象であ
れば、コンストラクタは、インスタンスの生成をデバッ
ガに通知するためにユーザによって挿入されたデバッグ
マクロを含む。このデバッグマクロはデバッグモードで
コンパイルされた場合、インスタンス生成通知関数の呼
び出し命令に展開される。
【0122】真ん中のフローチャートに進み、デバッグ
対象クラスのコンストラクタは、インスタンス生成通知
関数をコールする(ステップS106)。次に、インス
タンスの初期化に必要なユーザオリジナルなコード群を
実行する(ステップS107)。
【0123】右端のフローチャートに進み、インスタン
ス生成通知関数は、関数パラメータとして受け取った情
報(クラス名、インスタンスサイズ、インスタンスアド
レス)を元に、オブジェクト管理情報(図2の107)
を更新する(ステップS110)。次に、デバッガスレ
ッド(図2の207)にオブジェクト管理情報の描画要
求メッセージをポストする(ステップS111)。次
に、ユーザにインスタンスの生成を知らせるために確認
ダイアログボックスを表示する(ステップS112)。
【0124】尚、確認ダイアログボックスが表示されて
いる間は、インスタンス生成通知関数に制御が戻らない
ため、デバッグ対象プログラムの実行はブロックする。
一方、描画要求メッセージを受け取ったデバッガスレッ
ドは、オブジェクト管理情報の内容をオブジェクトウイ
ンドウ(図2の301)内に描画する。
【0125】図29は本発明の実施形態のインスタンス
生成通知関数が受け取るパラメータの意味内容を示す図
である。
【0126】図29において、4102は生成されたイ
ンスタンスである。4101はインスタンス4102の
アドレスを示すインスタンスアドレスパラメータであ
る。4103はインスタンス4102のメモリサイズを
示すインスタンスサイズパラメータである図30は本発
明の実施形態のデバッグ対象プログラムの実行経路にお
いて、デバッグ対象クラスのインスタンスの削除をオブ
ジェクト管理情報に反映してオブジェクトウインドウ上
に表示させる処理を示すフローチャートである。
【0127】図30において、左端のフローチャートは
プログラミング言語C++で記述されたプログラムのイ
ンスタンス削除処理を示す。真ん中のフローチャート
は、インスタンスの後始末を行うデストラクタが実行す
る処理を示す。右端のフローチャートはデバッグ対象の
インスタンスが削除されるたびに呼び出されるインスタ
ンス削除通知関数が実行する処理を示す。
【0128】尚、5114は、インスタンス削除通知関
数が唯一の関数パラメータとしてインスタンスアドレス
を受け取ることを示す。また、インスタンス削除通知関
数は、デバッグライブラリ関数群(図2の208)に含
まれるライブラリ関数である。
【0129】左端のフローチャートにおいて、デストラ
クタを呼び出す。(ステップS122)。次に、インス
タンスが占有していたメモリブロックを開放する(ステ
ップS123)。尚、デバッグ対象クラスのデストラク
タは、インスタンスの削除をデバッガに通知するために
ユーザによって挿入されたデバッグマクロを含む。そし
て、デバッグマクロはデバッグモードでコンパイルされ
た場合、インスタンス削除通知関数の呼出し命令に展開
される。
【0130】真ん中のフローチャートに進み、デストラ
クタはユーザオリジナルな後始末処理コード群を実行す
る。(ステップS126)。次に、インスタンス削除通
知関数を呼び出す(ステップS127)。
【0131】右端のフローチャートに進み、インスタン
ス削除通知関数は、引数で渡された情報(インスタンス
アドレス)を用いて、オブジェクト管理情報(図2の1
07)を更新する(ステップS120)。次に、デバッ
ガスレッド(図2の207)にオブジェクト管理情報の
描画要求メッセージをポストする(ステップS12
1)。次に、ユーザにインスタンスの削除を知らせるた
めに確認ダイアログボックスを表示する(ステップS1
22a)。
【0132】尚、確認ダイアログボックスが表示されて
いる間は、インスタンス削除通知関数に制御が戻らない
ため、デバッグ対象プログラムの実行はブロックする。
一方、描画要求メッセージを受け取ったデバッガスレッ
ドは、オブジェクト管理情報の内容をオブジェクトウイ
ンドウ(図2の301)内に描画する。
【0133】以下説明する図31、図32は、オブジェ
クト指向プログラムでは必須の要件とされる継承関係を
プログラミング言語C++が実現する方法を示す。
【0134】特に、プログラミング言語C++では、継
承関係の継承元クラスを基底クラスと呼び、継承先クラ
スを派生クラスと呼ぶ。
【0135】図31は本発明の実施形態のプログラミン
グ言語C++における派生クラスのインスタンスのメモ
リ構造を示す図である。
【0136】図31において、5102は派生クラスの
インスタンスを示す。5103は派生クラスのインスタ
ンス5102が内包している基底クラスのデータメンバ
領域を示す。5104は派生クラスのインスタンス51
02が追加したデータメンバを示す。5101は派生ク
ラスのインスタンス5102のアドレスを示す。また、
基底クラスのデータメンバ領域5102の開始位置は、
派生クラスのインスタンスのアドレスに等しいため、派
生クラスのインスタンスアドレス5101は、その内部
に含まれる基底クラスのインスタンスのアドレスに一致
する。
【0137】図32は本発明の実施形態のプログラミン
グ言語C++において、派生クラスのインスタンスが生
成、削除される処理を示すフローチャートである。
【0138】図32(a)は、派生クラスのインスタン
ス生成処理を示し、図32(b)は派生クラスのインス
タンスの削除処理を示す。
【0139】図32(a)に示す派生クラスのインスタ
ンス生成処理は、まず、最初に派生クラスのインスタン
スを格納できるだけのメモリを割り当てる(ステップS
132)。次に、基底クラスのコンストラクタを呼び出
す(ステップS133)。最後に、派生クラスのコンス
トラクタを呼び出す(ステップS134)。
【0140】尚、基底クラス、派生クラス共にデバッグ
対象であったならば、派生クラスのインスタンス生成に
あたって、インスタンス生成通知関数は2回呼び出され
る。図31では、この2回のインスタンス生成通知関数
の呼び出しが、同一のインスタンスアドレスパラメータ
を持つことを示している。1回目のインスタンス生成通
知関数の呼び出しは、派生クラスが含む基底クラスのイ
ンスタンス(図31の5103)に対応する。また、2
回目の呼び出しは、派生クラスのインスタンス(図31
の5102)に対応する。
【0141】また、基底クラスのインスタンスは、派生
クラスの一部としてではなく、単独で生成される可能性
もある。基底クラスのインスタンスが単独で生成された
のか、派生クラスの一部として生成されたのかは、同一
のインスタンスアドレスを持つ派生クラスのインスタン
スに対するインスタンス生成通知関数が呼び出された時
点で、初めて知ることができる(それまでは、両者は区
別できない)。
【0142】図32(b)に示す派生クラスのインスタ
ンス削除処理は、まず、最初に派生クラスのデストラク
タを呼び出す(ステップS202)。次に、基底クラス
のデストラクタを呼び出す(ステップS203)。最後
に、派生クラスのインスタンスが占有していたメモリブ
ロックを開放する(ステップS204)。
【0143】尚、基底クラス、派生クラス共にデバッグ
対象であったならば、派生クラスのインスタンスが削除
される際、インスタンス削除通知関数は2回呼び出され
る。図31では、2回のインスタンス削除通知関数の呼
び出しが、同一のインスタンスアドレスパラメータをも
つことを示している。1回目のインスタンス削除通知関
数の呼び出しは、派生クラスのインスタンス(図31の
5102)に対応する。また、2回目の呼び出しは、派
生クラスが含む基底クラスのインスタンス(図31の5
103)に対応する。
【0144】また、派生クラスのデストラクタは、派生
クラスが付け加えたデータメンバ(図31の5104)
を後始末する関数である。従って、派生クラスのデスト
ラクタが実行されたが、未だ基底クラスのデストラクタ
が実行されていないとき、つまり、1回目のインスタン
ス削除通知関数は呼び出されたが、2回目のインスタン
ス削除通知関数が呼び出されていない状態は、派生クラ
スが追加したデータメンバ(図31の5104)は破壊
されたが、派生クラスが含む基底クラスインスタンス
(図31の5103)は、生存していると考えるべきで
ある。
【0145】図33は本発明の実施形態のインスタンス
間のリンク関係を実現する最も一般的な方法を示す図で
ある。
【0146】図33において、6101は他のインスタ
ンス(または自分自身)へのリンク関係を保持するリン
ク元インスタンスを示す。6102はリンク元インスタ
ンス6101によってリンク関係が設定されているリン
ク先インスタンスを示す。リンク元インスタンス610
1は、リンク先インスタンス6102のアドレスをポイ
ンタメンバ6103に保持する。
【0147】図34は本発明の実施形態のデバッガがイ
ンスタンス間のリンク関係の変化を検出するためにリン
ク元インスタンスとポインタメンバの間にリンクポイン
タクラスのインスタンスを挟み込んだ状態を示す図であ
る。
【0148】リンクポインタ7000を所謂「スマート
ポインタ」とすることで、リンク元インスタンス610
1からは、リンクポインタ7000、図33におけるポ
インタメンバ6103を同一に見せることができる。つ
まり、リンクポインタ7000を挿入したことによっ
て、デバッグ対象プログラムの実行の意味が影響を受け
ることはない。
【0149】また、リンクポインタ7000は、初期設
定された場合、あるいはリンク変更を要求された(別の
インスタンスを指すように要求された)場合、リンクポ
インタ7000内部に保持するポインタメンバ6103
にその要求を反映させると同時に、新しいリンク先イン
スタンスのアドレスをデバッグライブラリ関数群(図2
の208)を通じて、オブジェクト管理情報(図2の1
07)に反映させる。
【0150】図35は本発明の実施形態のプログラミン
グ言語C++で記述されたプログラムにおけるリンクポ
インタを含んだリンク元インスタンスの生成処理を示す
フローチャートである。
【0151】図35において、左端のフローチャートは
リンクポインタを含むリンク元インスタンスを生成する
処理を示す。真ん中のフローチャートは、リンクポイン
タのコンストラクタが実行する処理を示す。右端のフロ
ーチャートはリンクポインタのコンストラクタから呼び
出されるリンク生成通知関数が実行する処理を示す。
尚、7113は、リンク生成通知関数が関数パラメータ
として、リンク名、リンクポインタアドレスを受け取る
ことを示す。また、リンク生成通知関数は、デバッグラ
イブラリ関数群(図2の208)に含まれるライブラリ
関数である。
【0152】左端のフローチャートにおいて、まず、最
初にリンク元インスタンスが使用するメモリ領域を割り
当てる(ステップS142)。次に、リンクポインタを
データメンバとして含むため、同リンクポインタのコン
ストラクタを呼び出す(ステップS143)。最後に、
リンク元インスタンス自身のコンストラクタを呼び出す
(ステップS144)。
【0153】真ん中のフローチャートに進み、リンクポ
インタが内包するポインタメンバ(図34の6103)
にヌルポインタを初期設定する(ステップS147)。
次に、リンク生成通知関数を呼び出す(ステップS14
8)。
【0154】右端のフローチャートに進み、リンク生成
通知関数は、引数で渡された情報(リンク名、リンクポ
インタアドレス)を元に、リンクポインタの生成をオブ
ジェクト管理情報(図2の107)に反映させる。
【0155】また、リンク元インスタンスが属するクラ
スがデバッグ対象であるならば、ステップS144のリ
ンク元インスタンスのコンストラクタ呼び出しは、デバ
ッグ対象クラスのコンストラクタ(図28)に従うた
め、インスタンス生成通知関数(図28)を呼び出す。
【0156】更に、リンク元インスタンスに対するイン
スタンス生成通知関数は、リンク元インスタンスの生成
をオブジェクト管理情報(図2の107)に反映させ、
デバッガスレッド(図2の207)に描画要求をポスト
する。一方、描画要求を受け取ったデバッガスレッド
は、最新のオブジェクト管理情報の内容をオブジェクト
ウインドウ(図2の301)に描画する。
【0157】図36は本発明の実施形態の図35におけ
るリンク生成通知関数のパラメータの意味を示す図であ
る。
【0158】図36において、7101はリンク生成通
知関数のパラメータの1つ、リンクポインタアドレスを
示す。7103はリンクポインタアドレス7101によ
って指されるリンクポインタを示す。7102は図34
におけるリンクポインタ7000を含むリンク元インス
タンスを示す。
【0159】リンク生成通知関数(図35)が実行され
る時には、未だ、リンク元インスタンスのコンストラク
タが呼び出されていないため(図35のステップS14
4)、リンク元インスタンス7102はデバッガには認
識されていない。リンク元インスタンス7102に対す
るインスタンス生成通知関数(図28)が実行された時
点で始めて、リンク元インスタンス7102がリンクポ
インタ7103をデータメンバとして含むことがデバッ
ガによって認識される。
【0160】図37は本発明の実施形態のリンクポイン
タを変更する操作の代表例として、リンクポインタに新
たに指すべきリンク先インスタンスのアドレスを代入す
る処理を示すフローチャートである。
【0161】図37(a)において、左側のフローチャ
ートはリンクポインタの代入演算子関数の呼び出し処理
を示す。右側のフローチャートは、リンクポインタクラ
スが多重定義する代入演算子関数が実行する処理を示
す。図37(b)のフローチャートはリンクポインタが
指すリンク先インスタンスが変更されるたびに呼び出さ
れるリンク変更通知関数が実行する処理を示す。尚、8
114は、リンク変更通知関数が関数パラメータとし
て、リンクポインタアドレス、リンク先インスタンスア
ドレスを受け取ることを示す。また、リンク変更通知関
数は、デバッグライブラリ関数群(図2の208)に含
まれるライブラリ関数である。
【0162】図37(a)の左側のフローチャートにお
いて、デバッグヘッダ(図2の105)で定義されたリ
ンクポインタクラスは代入演算子を多重定義する。その
ため、デバッグ対象プログラム内でリンクポインタヘの
代入操作が実行される場合は、必ず、リンクポインタク
ラスの代入演算子関数が呼び出される(ステップS15
2)。
【0163】図37(a)の右側のフローチャートに進
み、多重定義された代入演算子関数は、リンクポインタ
が内部的に保持するポインタメンバ(図34の610
3)の値と代入演算子関数に渡された新しいポインタ値
(リンク先インスタンスアドレスパラメータ)を比較す
る(ステップS155)。両者が異なる場合(ステップ
S155でYES)、内部のポインタメンバに引数で渡
されたポインタ値を設定する(ステップS156)。そ
して、リンク変更通知関数を呼び出す(ステップS15
7)。一方、両者が異ならない場合(ステップS155
でNO)、ステップS152に戻る。
【0164】図37(b)のフローチャートに進み、リ
ンク変更通知関数は、パラメータとして渡された情報
(リンクポインタアドレス、リンク先インスタンスアド
レス)を元に、オブジェクト管理情報(図2の107)
を更新する(ステップS150)。次に、デバッガスレ
ッド(図2の207)に描画要求メッセージをポストす
る(ステップS151)。次に、確認ダイアログボック
スを表示してユーザに確認を促す(ステップS152
a)。一方、描画要求を受け取ったデバッガスレッド
は、最新のオブジェクト管理情報をオブジェクトウイン
ドウ(図2の301)に描画する。
【0165】図38は本発明の実施形態のリンク変更通
知関数に渡されるパラメータの意味を示す図である。
【0166】図38において、8101はリンクポイン
タアドレスを示す。8102はリンク先インスタンスア
ドレスパラメータを示す。また、リンクポインタアドレ
ス8101は、リンク元インスタンス8103にデータ
メンバとして含まれるリンクポインタ8104を指すポ
インタである。リンク先インスタンスアドレス8102
は、リンクポインタ8104が新たに指すべきリンク先
インスタンス8016のアドレス値である。リンクポイ
ンタ8104は、それが更にデータメンバとして含むポ
インタメンバ8105に新しいリンク先インスタンス8
106のアドレスを代入する。
【0167】図39は本発明の実施形態のプログラミン
グ言語C++で記述されたプログラムにおけるリンクポ
インタを含んだリンク元インスタンスの削除処理を示す
フローチャートである。
【0168】図39において、左端のフローチャートは
リンクポインタを含むリンク元インスタンスを削除する
処理を示す。真ん中のフローチャートは、リンクポイン
タのデストラクタが実行する処理を示す。右端のフロー
チャートはリンクポインタのデストラクタから呼び出さ
れるリンク削除通知関数が実行する処理を示す。
【0169】尚、9112は、リンク削除通知関数が唯
一の関数パラメータとして、リンクポインタアドレスを
受け取ることを示す。また、リンク削除通知関数は、デ
バッグライブラリ関数群(図2の208)に含まれるラ
イブラリ関数である。
【0170】左端のフローチャートにおいて、まず、最
初にリンク元インスタンスのデストラクタを呼び出す
(ステップS162)。次に、リンク元インスタンスが
リンクポインタをデータメンバとして含むため、同リン
クポインタのデストラクタを呼び出す(ステップS16
3)。最後に、リンク元インスタンスが占有していたメ
モリ領域を開放する(ステップS164)。
【0171】尚、リンク元インスタンスが属するクラス
がデバッグ対象であるならば、デストラクタの処理は、
デバッグ対象クラスのデストラクタ(図30)に従うた
めインスタンス削除通知関数を呼び出す(図30)。
【0172】インスタンス削除通知関数は、リンク元イ
ンスタンスの削除をオブジェクト管理情報(図2の10
7)に反映させ(図30のステップS120)、デバッ
ガスレッド(図2の207)に描画要求をポストする
(図30のステップS121)。一方、描画要求メッセ
ージを受け取ったデバッガスレッドは、最新のオブジェ
クト管理情報の内容をオブジェクトウインドウ(図2の
301)に描画する。
【0173】そして、真ん中のフローチャートに進み、
デバッグヘッダ(図2の105)で定義されたリンクポ
インタのデストラクタは、リンク削除通知関数109を
呼び出す(ステップS167)。
【0174】右端のフローチャートに進み、リンク削除
通知関数は、引数で渡された情報(リンクポインタアド
レス)を元に、リンクポインタの削除をオブジェクト管
理情報(図2の107)に反映させる(ステップS16
0)。
【0175】次に、図3、図4で示した順序木をプログ
ラミング言語C++で記述したプログラムのソースコー
ド(図2の101)の一例について、図40、図41
A、図41Bを用いて説明する。
【0176】図40は本発明の実施形態の図3、図4で
示した順序木クラス、ノードクラスを定義するヘッダフ
ァイルを示す図である。
【0177】図40において、第6行から第20行まで
がノードクラスNodeを定義し、第22行から第41
行までが順序木クラスTreeを定義する。
【0178】第16行から第19行までは、ノードクラ
スNodeのインスタンスが保持するデータメンバの宣
言であり、ノードが保持する整数値を保持するデータメ
ンバvalue、ノードが保持する整数値の反復数を保
持するデータメンバcount、左部分木を指すポイン
タメンバleft、右部分木を指すポインタメンバri
ghtから構成される。特に、leftポインタメン
バ、rightポインタメンバは、ノードクラスのイン
スタンス間のリンク関係を維持するためのデータメンバ
である。
【0179】第10行から第14行までは、ノードクラ
スのメンバ関数の宣言であり、それぞれコンストラクタ
Node、仮想デストラクタ〜Node、該ノードをル
ートとする順序木の適切な位置に整数値を挿入するメン
バ関数add、該ノードをルートとする順序木が指定さ
れた整数値を何回含むかを返すメンバ関数searc
h、該ノードをルートとする順序木が含む整数の集合を
昇順にストリームに出力するメンバ関数printから
構成される。
【0180】第39行から第40行までは、順序木クラ
スTreeのデータメンバの宣言であり、順序木が保持
する整数の個数を保持するデータメンバcount、順
序木のルートノードを指すポインタメンバrootから
構成される。特に、rootポインタメンバは、順序木
クラスのインスタンスからノードクラスのインスタンス
ヘのリンク関係を維持するためのデータメンバである。
【0181】第25行から第37行までは、順序木クラ
スTreeのメンバ関数の宣言及び定義であり、コンス
トラクタTree、仮想デストラクタ〜Tree、順序
木が保持する整数の集合を空にするメンバ関数clea
r、順序木に整数値を追加するメンバ関数add、順序
木が指定された整数値を何個含むかを返すメンバ関数s
earch、順序木が保持する整数の集合を昇順にスト
リームに出力するメンバ関数printから構成され
る。
【0182】第1行、第2行、第43行は、同ヘッダフ
ァイルが同一実装ファイル上で2回以上コンパイルされ
ることを防ぐマクロガードである。
【0183】図41A、図41Bは本発明の実施形態の
図3、図4で示した順序木クラス、ノードクラスを実装
する実装ファイルを示す図である。
【0184】図41A、図41Bにおいて、第3行から
第67行までがノードクラスNodeのメンバ関数を定
義し、第69行から第99行までが順序木クラスTre
eのメンバ関数を定義する。
【0185】第3行から第8行までは、ノードクラスの
コンストラクタの定義であり、ノードインスタンスをコ
ンストラクタ引数で指定された整数値を保持するように
初期化する。
【0186】第10行から第16行までは、ノードクラ
スのデストラクタの定義であり、該ノードをルートする
順序木全体を破壊する。
【0187】第18行から第36行までは、ノードクラ
スのaddメンバ関数の定義であり、該ノードをルート
する順序木の適切な位置に、引数で指定された整数値を
挿入する。
【0188】第38行から第56行までは、ノードクラ
スのsearchメンバ関数の定義であり、該ノードを
ルートする順序木が保持する整数の集合が、引数で指定
された整数値を何個含むかを返す(特に、順序木が指定
された整数値を含まないときは、0を返す)。
【0189】第58行から第67行まではノードクラス
のprintメンバ関数の定義であり、該ノードをルー
トする順序木が保持する整数の集合を昇順に引数で指定
されたストリームに出力する。
【0190】第69行から第76行までは、順序木クラ
スのclearメンバ関数の定義であり、該順序木が保
持する整数の集合を空にする。
【0191】第79行目から第85行までは、順序木ク
ラスのaddメンバ関数の定義であり、引数で指定され
た整数値を該順序木が保持する整数の集合に加える。
【0192】第87行から第93行までは、順序木クラ
スのsearchメンバ関数の定義であり、該順序木が
引数で指定された整数値を何個含むかを調べる(特に、
順序木が指定された整数値を含まないときは、0を返
す)。
【0193】第95行から第99行までは、順序木クラ
スのprintメンバ関数の定義であり、該順序木が保
持する整数の集合を昇順に指定されたストリームに出力
する。
【0194】次に、図40、図41A、図41Bで示し
たプログラムに、デバッグマクロを挿入した後のソース
コード(図2の103の一例)について、図42、図4
3A〜図43Cを用いて説明する。
【0195】図42は本発明の実施形態の図40で示し
たヘッダファイルにデバッグマクロを埋め込んだ状態を
示す図である。
【0196】尚、図42において、デバッグ機能のため
に挿入または変更された個所はイタリックボールド体で
示す。
【0197】第5行は、デバッグヘッダ(図2の10
5)の取り込み指示である。
【0198】第9行、第26行は、デバッグ対象クラス
の定義内に含めなければならないDECLARE_DE
BUGマクロである。このマクロの挿入により、ノード
クラスNode及び順序木クラスTreeはデバッグ対
象となる。
【0199】第20行、第21行、第46行は、デバッ
グモードでコンパイルされた場合に、リンクポインタク
ラスに展開されるLINKPTRマクロであり、インス
タンス間のリンク関係を維持するポインタ変数の型に適
用する必要がある。また、LINKPTRマクロは、ポ
インタ変数の型指定子がT*であったならば、型Tを引
数にとる。従って、第20行の例では、図40の第18
行のポインタメンバの宣言は、「Node*left」
であるため、「LINKPTR(Node)left」
に変更する。
【0200】第29行は、デバッグモードでコンパイル
された場合、リンクポインタを初期化するためコードに
展開されるINITLINKマクロであり、リンクポイ
ンタを保持するクラスのコンストラクタ定義の関数ヘッ
ダと関数本体の間に挿入する。INITLINKマクロ
の引数はリンクポインタの変数名である。尚、INIT
LINKマクロは省略可能である。また、INITLI
NKマクロを指定個所に挿入した場合は、オブジェクト
ウインドウ(図2の301)に表示されるリンクには、
リンク名としてリンクポインタの変数名が表示される
(例えば、図17の3301)。INITLINKマク
ロを省略した場合は、単にリンク名が表示されないだけ
である。
【0201】第31行は、デバッグモードでコンパイル
された場合に、インスタンス生成通知関数の呼出し命令
に展開されるON_CONSTRUCTマクロであり、
デバッグ対象クラスのコンストラクタ定義の最初の実行
行として挿入する必要がある。
【0202】第38行は、デバッグモードでコンパイル
された場合に、インスタンス削除通知関数の呼出し命令
に展開されるON_DESTRUCTマクロであり、デ
バッグ対象クラスのデストラクタ定義の最後の実行行と
して挿入する必要がある。
【0203】図43A〜図43Cは本発明の実施形態の
図41A、図41Bで示した実装ファイルにデバッグマ
クロを埋め込んだ状態を示す図である。
【0204】図43A〜図43Cにおいて、第3行、第
74行は、デバッグ対象クラスのクラス定義内に埋め込
んだDECLARE_DEBUGマクロ(図42の第9
行、第26行)に一対一で対応するIMPLEMENT
_DEBUGマクロであり、デバッグ対象クラスに対し
て、クラス名を引数として、実装ファイル中に各クラス
につき一度づつ挿入しなければならない。
【0205】第6行は、デバッグモードでコンパイルさ
れた場合、リンクポインタを初期化するためのコードに
展開されるINITLINK、_INITLINKマク
ロであり、リンクポインタを保持するクラスのコンスト
ラクタ定義の関数ヘッダと関数本体の間に挿入する。
尚、同一のコンストラクタにINITLINK、_IN
ITLINKマクロを複数挿入する場合(つまり、クラ
スが複数のリンクポインタを含む場合)、最初に挿入し
たマクロはINITLINKでなければならず、2番目
以降に挿入されるマクロは_INITLINKでなけれ
ばならない。
【0206】第8行は、デバッグモードでコンパイルさ
れた場合に、インスタンス生成通知関数の呼出し命令に
展開されるON_CONSTRUCTマクロであり、デ
バッグ対象クラスのコンストラクタ定義の最初の実行行
として挿入する必要がある。第20行は、デバッグモー
ドでコンパイルされた場合に、インスタンス削除通知関
数の呼出し命令に展開されるON_DESTRUCTマ
クロであり、デバッグ対象クラスのデストラクタ定義の
最後の実行行として挿入する必要がある。
【0207】尚、INITLINK、_INITLIN
K、ON_CONSTRUCT、ON_DESTRUC
Tマクロは、常にメンバ関数の定義内に挿入する。
【0208】次に、デバッグマクロ一式とリンクポイン
タテンプレートクラスを定義するデバッグヘッダ(図2
の105)について、図44A〜図44Cを用いて説明
する。
【0209】図44A〜図44Cは本発明の実施形態の
デバッグマクロ一式とリンクポインタテンプレートクラ
スを定義するデバッグヘッダを示す図である。
【0210】図44A〜図44Cにおいて、第1行、第
2行、第132行は、同デバッグヘッダファイルが同一
実装ファイル上で2度以上コンパイルされることを防止
するマクロガードである。
【0211】第4行、第15行、第130行は、デバッ
グモードでコンパイルされる場合と、非デバッグモード
でコンパイルされる場合を切り分ける条件コンパイル指
示である。そして、非デバッグモードの場合(記号常数
_DEBUGが定義されていない場合)、第5行から第
14行までがコンパイルされる。一方、デバッグモード
の場合(記号常数_DEBUGが定義されている場
合)、第16行から第129行までがコンパイルされ
る。
【0212】非デバッグモードの場合、マクロINIT
DEBUGGER、DECLARE_DEBUG、IM
PLEMENT_DEBUG、ON_CONSTRUC
T、ON_DESTRUCT、INITLINK、_I
NITLINKは全て空文字列に置換される。また、マ
クロLINKPTR(T)はただのポインタT*に置換
される。そのため、デバッグマクロが埋め込まれた順序
木ヘッダファイル(図42)、同実装ファイル(図43
A〜図43C)の展開結果は、それぞれオリジナルの順
序木ヘッダファイル(図40)、同実装ファイル(図4
1A、図41B)に一致する。
【0213】従って、オリジナルのソースコード(図2
の101)のコンパイル結果(図2の102)と、デバ
ッグマクロが埋め込まれたソースコード(図2の10
3)を非デバッグモードでコンパイルした結果(図2の
104)は一致する。
【0214】第17行から第35行までは、デバッグモ
ードでコンパイルした場合の、デバッグマクロの定義を
示す。また、第17行は、INITDEBUGGERマ
クロが、デバッガスレッドの初期化関数_InitDe
bugger(図2の205)の呼び出しに置換される
ことを示す。
【0215】第27行、第28行は、ON_CONST
RUCTマクロが、インスタンス生成通知関数_OnC
onstructInstance(図28)の呼び出
し命令に置換されることを示す。
【0216】第30行は、ON_DESTRUCTマク
ロが、インスタンス削除通知関数_OnDestruc
tInstance(図30)の呼出し命令に置換され
ることを示す。
【0217】第19行から第21行は、DECLARE
_DEBUGマクロが、「static const
char*_class_name;static c
onst int_instance_size;」に
置換されることを示す。従って、同マクロをクラス定義
内部で使用した場合(図42の第9行、第26行)、ク
ラスの静的データメンバ_class_name、_i
nstance_sizeの宣言となる。
【0218】第23行から第25行は、IMPLEME
NT_DEBUG(name)マクロが、「const
char* name::_class_name=
“#name”;const int name::_
instance_size=“sizeof(nam
e)”;」に置換されることを示す(但し、仮引数na
meは更に、実引数に置換される)。従って、実装ファ
イルのファイルスコープで、同マクロを使用した場合
(図43Aの第3行、図43Bの第74行)、実引数で
指定したクラスの静的メンバ_class_name、
_insutance_sizeの初期化を実行する。
【0219】第32行は、LINKPTR(name)
マクロが、「_LinkPtr<type>」に置換さ
れることを示す(但し、仮引数typeは実引数に置換
される)。ここで、_LinkPtrは、リンクポイン
タを実現するテンプレートクラスであり、同ヘッダファ
イルの第46行から第128行までで定義される。
【0220】第34行は、INITLINK(nam
e)マクロが、「:name(“#name”)」に置
換されることを示すが、同マクロがコンストラクタの関
数ヘッダと関数本体の間に挿入された場合(図42の第
29行、図43Aの第6行)、実引数で指定されたデー
タメンバに対するメンバイニシャライザとなる(初期値
はリンク名を表現するASCII文字列)。
【0221】第35行は、_INITLINK(nam
e)マクロが、「,name(“#name”)」に置
換されることを示すが、同マクロが、INITLINK
マクロまたは、_INITLINKマクロの直後に使用
された場合(図43Aの第6行)、直前のメンバイニシ
ャライザに継続するメンバイニシャライザとなる。
【0222】第38行から第43行までは、デバッグラ
イブラリ関数群(図2の208)が公開するライブラリ
関数のプロトタイプ宣言である。
【0223】第46行から第128行までは、リンクポ
インタテンプレートクラスを定義する。
【0224】第124行は、リンクポインタ(図34の
7000)が指すインスタンスのアドレスを保持するポ
インタメンバlink(図34の6103)の宣言であ
る。第127行は、リンクポインタのASCII表示名
を保持するデータメンバnameの宣言であり、INI
TLINK、_INITLINKマクロの展開結果であ
るメンバイニシャライザにより初期化される。
【0225】第55行から第60行、第63行から第6
8行、第71行から第76行目までは、リンクポインタ
のコンストラクタ(図35)の定義である。これは、リ
ンクポインタのデータメンバを適切に初期化し、リンク
生成通知関数_OnConstructPointer
(図35)を呼び出す。
【0226】第79行は、リンクポインタの仮想デスト
ラクタ(図39)の定義であり、リンク削除通知関数_
OnDestructPointer(図39)を呼び
出す。
【0227】第82行から第88行までは、リンクポイ
ンタの代入演算子(=)の多重定義関数である。これ
は、デバッグ対象の埋め込みソースコード(図2の10
3)内で、リンクポインタを両辺とする演算子=の使用
時に起動される。そして、右辺のリンクポインタの内容
を左辺のリンクポインタにコピーした後、左辺のリンク
ポインタに対するリンク変更通知関数_OnModif
yPointer(図37)を呼び出す。
【0228】第91行は、リンクポインタ型から、リン
クポインタが指すインスタンスヘの通常のポインタ型へ
の型変換を定義する演算子関数である。これは、デバッ
グ対象の埋め込みソースコード(図2の103)内で、
通常のポインタ型が必要とされる個所にリンクポインタ
のインスタンスが出現した場合に起動される。そして、
リンクポインタが保持するポインタメンバlinkの値
(つまり、リンク先インスタンスアドレス、図34の6
103)を返す。
【0229】第97行から第120行までは、リンクポ
インタをデバッグ対象プログラムからは通常のポインタ
と同一に見せる(つまり、スマートポインタを実現す
る)ための演算子の多重定義関数一式を示す。
【0230】第97行は、メンバ選択演算子(−>)の
多重定義関数である。これは、デバッグ対象の埋め込み
ソースコード(図2の103)内で、リンクポインタの
インスタンスを左辺とする演算子−>の適用時に起動さ
れる。そして、リンクポインタが保持するポインタメン
バlink(図34の6103)を返す。
【0231】第100行は、間接参照演算子(*)の多
重定義関数である。これは、デバッグ対象の埋め込みソ
ースコード(図2の103)内で、リンクポインタのイ
ンスタンスが後置された演算子*の適用時に起動され
る。そして、リンクポインタが保持するポインタメンバ
linkが指す内容(つまり、リンク先インスタンス、
図34の6102)への参照を返す。
【0232】第103行は、論理否定演算子(!)の多
重定義関数である。これは、デバッグ対象の埋め込みソ
ースコード(図2の103)内で、リンクポインタのイ
ンスタンスを後置した演算子!の使用時に起動される。
そして、リンクポインタが保持するポインタメンバli
nkの論理否定を返す(つまり、linkがヌルポイン
タのとき真を返す)。 第106行は、等価演算子(=
=)の多重定義関数である。これは、デバッグ対象プロ
グラムソース内で、リンクポインタのインスタンスを両
辺とする演算子==の使用時に起動される。そして、2
つのリンクポインタが保持するポインタメンバlink
の等価判定を行う(つまり2つのlinkが同一のもの
を指せば真を返す)。
【0233】第109行は、非等価演算子(!=)の多
重定義関数である。これは、デバッグ対象の埋め込みソ
ースコード(図2の103)内で、リンクポインタのイ
ンスタンスを両辺とする演算子!=の使用時に起動され
る。そして、2つのリンクポイタが保持するポインタメ
ンバlinkの非等価判定を行う(つまり、2つのli
nkが異なるものを指せば、真を返す)。
【0234】第112行から第120行までは、代入演
算子(=)の多重定義である。これは、デバッグ対象の
埋め込みソースコード(図2の103)内で、リンクポ
インタのインスタンスを左辺、リンクポインタが指すべ
きインスタンス型へのポインタを右辺とする演算子=の
使用時(図37の104)に適用される。そして、リン
クポインタの現在のlinkポインタ値と代入演算の右
辺のポインタ値が異なれば、linkに新しい値を設定
し、リンク変更通知関数_OnModifyPoint
er(図37(b))を呼び出す。
【0235】次に、図42で示したデバッグマクロが埋
め込まれたヘッダファイルをデバッグモードでコンパイ
ルした際のマクロ展開結果について、図45を用いて説
明する。
【0236】図45は本発明の実施形態の図42で示し
たデバッグマクロが埋め込まれたヘッダファイルをデバ
ッグモードでコンパイルした際のマクロ展開結果を示す
図である。
【0237】図45において、第9行、第10行は、ノ
ードクラスに対するDECLARE_DEBUGマクロ
(図42の第9行)の展開結果であり、ノードクラスに
静的データメンバ_class_name、_inst
ance_sizeを追加する。同様に、第27行、第
28行は、順序木クラスに対するDECLARE_DE
BUGマクロ(図41Aの第26行)の展開結果であ
り、順序木クラスに静的データメンバ_class_n
ame、_istance_sizeを追加する。尚、
_class_nameデータメンバは、デバッグ対象
クラスのASCII表示名を保持し、_instanc
e_sizeデータメンバは、クラスのインスタンスが
占有するメモリの大きさを保持する。また、_clas
s_nameデータメンバ、_istance_siz
eデータメンバは静的データであるから、そのクラスに
属する全インスタンスによって共有される(実際に、同
メンバは、クラスに属する全インスタンスに共通な性質
を表現している)。
【0238】第21行、第22行は、LINKPTRマ
クロ(図42の第20行、第21行)の展開結果であ
り、ノードクラスNodeのデータメンバleft、r
ightをNode*から、Nodeに関するリンクポ
インタテンプレートクラス型(_LinkPtr<No
de>)に変える。同様に、第48行は、LINKPT
Rマクロ(図42の第46行)の展開結果であり、順序
木クラスTreeのrootポインタメンバをNode
*から、Nodeに関するリンクポインタテンプレート
クラス型(_LINKPTR<Node>)に変える。
【0239】第31行は、INITLINKマクロ(図
42の第29行)の展開結果であり、順序木クラスTr
eeのインスタンスが保持するrootリンクポインタ
のASCII表示名を“root”に初期化する。
【0240】第33行は、ON_CONSTRUCTマ
クロ(図42の第31行)の展開結果であり、クラスの
ASCII表示名、インスタンスサイズ、生成インスタ
ンスのアドレスを引数として、インスタンス生成通知関
数_OnConstructInstanceを呼び出
す。
【0241】第40行は、ON_DESTRUCTマク
ロ(図42の第38行)の展開結果であり、削除される
インスタンスのアドレスを引数として、インスタンス削
除通知関数_OnDestructInstanceを
呼び出す。
【0242】第35行において、式「root=0」の
内、左辺rootはリンクポインタクラス_LinkP
tr<Node>型であり、右辺0はNode*と解釈
可能である。そのため、リンクポインタクラスが多重定
義した演算子関数operator=(Node*)
(図44Cの第112行から第120行まで)が起動さ
れる。
【0243】この場合は、第31行のメンバイニシャラ
イザが、リンクポインタが保持するポインタ値を0に初
期化済みであり、代入の右辺も0である。そのため、多
重定義された演算子関数operator=(Node
*)は何もしないで単に0を返す。
【0244】次に、図43A〜図43Cで示したデバッ
グマクロが埋め込まれた実装ファイルをデバッグモード
でコンパイルした場合のマクロ展開結果について、図4
6を用いて説明する。
【0245】図46A〜図46Cは本発明の実施形態の
図43A〜図43Cで示したデバッグマクロが埋め込ま
れた実装ファイルをデバッグモードでコンパイルした場
合のマクロ展開結果を示す図である。
【0246】図46A〜図46Cにおいて、第3行、第
4行は、クラス名Nodeを引数としたIMPLEME
NT_DEBUGマクロ(図43Aの第3行)の展開結
果である。これは、ノードクラスNodeの静的データ
メンバ、_class_name、_instace_
sizeをそれぞれ、文字列“Node”、整数値si
zeof(Node)に初期化する。ここで、size
of(Node)は、Nodeクラスのインスタンスが
占有するメモリサイズである(コンパイラが計算す
る)。同様に、第75行、第76行は、クラス名Tre
eを引数としたIMPLEMENT_DEBUGマクロ
(図43Bの第74行)の展開結果である。これは、順
序木クラスTreeの静的データメンバ、_class
_name、_istance_sizeを、それぞ
れ、文字列“Tree”、整数値sizeof(Tre
e)に初期化する。
【0247】第7行は、INITLINK、_INIT
LINKマクロ(図43Aの第6行)の展開結果であ
る。これは、ノードクラスNodeのインスタンスが保
持するリンクポインタleft、リンクポインタrig
htのASCII表示名をそれぞれ、“left”、
“right”に初期化する。
【0248】第9行は、ON_CONSTRUCTマク
ロ(図43Aの第8行)の展開結果である。これは、ク
ラスのASCII表示名、インスタンスサイズ、生成さ
れたインスタンのアドレスを引数として、インスタンス
生成通知関数_OnConstructInstanc
e関数を呼び出す。
【0249】第21行は、ON_DESTRUCTマク
ロ(図43Aの第20行)の展開結果である。これは、
削除されるインスタンスのアドレスを引数として、イン
スタンス削除通知関数_OnDestructInst
ance関数を呼び出す。
【0250】第12行において、式「left=rig
ht=0」は、代入演算子が右結合であるため、「le
ft=(right=0)」と解釈される。また、部分
式「right=0」は、左辺がリンクポインタクラス
_LinkPtr<Node>のインスタンスであり、
右辺の0がNode*と解釈可能であるため、リンクポ
インタクラスが多重定義した代入演算子関数opera
tor=(Node*)が起動される(図44Cの第1
12行から第120行)。
【0251】この場合、第7行のメンバイニシャライザ
が、リンクポインタrightが保持するポインタ値を
0(ヌルポインタ)に初期化済みであり、代入の右辺も
0(ヌルポインタ)である。そのため、多重定義された
代入演算子関数は何もしないで0(ヌルポインタ)を返
す。
【0252】式「left=(right=0)」は、
部分式「right=0」の計算結果0(ヌルポイン
タ)を左辺のleftに代入する意味である。そして、
左辺はリンクポインタクラス_LinkPtr<Nod
e>のインスタンスであり、右辺0はNode*と解釈
可能である。そのため、再度、リンクポインタクラスが
多重定義した代入演算子operator=(Node
*)が起動される。
【0253】この場合も、第7行のメンバイニシャライ
ザが、リンクポインタleftが保持するポインタ値を
0(ヌルポインタ)に初期化済みであり、代入の右辺も
0(ヌルポインタ)である。そのため、多重定義された
代入演算子関数は何もしないで0(ヌルポインタ)を返
す。
【0254】第18行において、式「delete l
eft」のオペランドleftは、リンクポインタクラ
ス_LinkPtr<Node>のインスタンスであ
る。しかし、delete演算子はポインタ型の変数を
必要とするため、演算対象のleftは、Node*に
変換された後、delete演算子が適用される。つま
り、リンクポインタクラスが定義した型変換演算子関数
operator Node*()が自動的に起動され
(図44Bの第91行)、リンクポインタleftのポ
インタメンバlinkに対して、delete演算子が
適用される。
【0255】第20行は、leftとrightの違い
を除けば、第18行と同様に解釈、実行されるので、そ
の詳細については省略する。
【0256】第28行において、if条件の中のリンク
ポインタクラスのインスタンスleftはリンクポイン
タクラスが多重定義したoperator Node*
()により、Node*型に自動的に変換される。従っ
て、leftが保持するポインタメンバlinkがヌル
ポインタでなければ、if条件は真となり、第29行が
実行される。
【0257】第29行の式「left−>add
(v)」において、演算子−>の左辺がリンクポインタ
クラスのインスタンスである。そのため、リンクポイン
タクラスが多重定義したメンバ選択演算子関数oper
atro−>()が自動的に起動される(図44Bの第
97行)。尚、多重定義されたメンバ選択演算子関数
は、リンクポインタが保持するNodeへのポインタ
(linkの値)をリターンする。そして、この時のリ
ターン値が再帰的に演算子−>に適用され(つまり、
(left.link)−>add(v)の意味)、結
局、ポインタメンバlinkが指すNodeクラスのイ
ンスタンスに対して、addメンバ関数が起動される。
【0258】第38行、第48行、第65行、第66
行、第71行、第80行、第82行、第90行、第98
行、第106行において、リンクポインタクラスが定義
した型変換演算子関数operator Node
*()(図44Bの第91行)が自動的に起動される。
【0259】第31行、第38行、第82行、第93行
において、リンクポインタクラスが多重定義した代入演
算子関数operator=(Node*)(図44C
の第112行から第120行まで)が自動的に起動され
る。
【0260】第36行、第48行、第56行、第67
行、第72行、第91行、第99行、第107行におい
て、リンクポインタクラスが多重定義したメンバ選択演
算子関数operator−>()(図44Bの第97
行)が自動的に起動される。
【0261】このように、デバッグマクロの挿入操作以
外に、デバッグ対象プログラムのソースコードを変更す
ることなく、インスタンス間のリンク関係の初期設定と
変更をデバッガに通知する機能を有するリンクポインタ
のインスタンスを容易に挟み込むことができる(図3
4)。
【0262】特に、インスタンス間のリンク関係を維持
するポインタ変数の型をリンクポインタクラスに変更す
るだけで、デバッグ対象プログラムソースコード内から
インスタンス間のリンク関係の変更操作を抽出するの
は、コンパイラの役割となり、それ以上のユーザの関与
は必要とされない。
【0263】また、リンクポインタに対する操作は、デ
バッグ対象プログラムソース上では、同リンクポインタ
への演算子の適用及び型変換を通じて行われる。そのた
め、これら演算子と型変換を、通常のポインタ操作の意
味を保存する様に多重定義することにより、デバッグ対
象プログラムの動作は、デバッグマクロを挿入する前と
デバッグ機能を除いては同一なものとなる。
【0264】次に、オブジェクト管理情報(図2の10
7)が使用するデータ構造体について、図47〜図49
を用いて説明する。
【0265】図47は本発明の実施形態のデバッグ対象
プログラムにおいて、インスタンスが生成された履歴が
あるクラスに関する情報を管理するクラス情報構造体を
示す図である。
【0266】図47において、10101はクラスのA
SCII表示名を格納するクラス名フィールドである。
10102はクラスの最初のインスタンスが作成された
クラス順を示すクラスNoフィールドである。1010
4はクラスのインスタンスのデータサイズを表現するイ
ンスタンスサイズフィールドである。
【0267】10103はクラスの基底クラスの名前を
格納する基底クラス名フィールドあり、該クラスが基底
クラスを持つならば、基底クラスのASCII表示名が
格納される。
【0268】10105は該クラスのインスタンスの生
成数を保持する生成インスタンス数フィールドである。
10106は該クラスの現在生存中のインスタンス数を
保持する生存インスタンス数フィールドである。
【0269】10107は該クラスのインスタンスの生
成と破壊及びリンクの変更時に、確認ダイアログボック
スを表示してユーザの確認を求めるか否かを決定するブ
レークフラグフィールドである。
【0270】10108は次に生成される該クラスに属
するインスタンスをオブジェクトウインドウ(図2の3
01)内で表示する位置を定める次インスタンス表示位
置フィールドである。
【0271】図48は本発明の実施形態のデバッグ対象
プログラムの実行経路において、現時点で生存している
インスタンスを表現するインスタンス情報構造体を示す
図である。
【0272】図48において、11101はインスタン
スのアドレスを格納するインスタンスアドレスフィール
ドである。11102はインスタンスが属するクラスの
ASCII表示名を格納するクラス名フィールドであ
る。11103は該インスタンスのメモリサイズを格納
するインスタンスサイズフィールドである。
【0273】11104は該インスタンスが、同クラス
内で何番目に生成されたかを保持する生成Noフィール
ドである。
【0274】11105は該インスタンスがオブジェク
トウインドウ(図2の301)内で表示される位置を保
持する表示位置フィールドである。
【0275】図49は本発明の実施形態のデバッグ対象
プログラムの実行経路において、現時点で生存中である
リンクポインタを表現するリンク情報構造体を示す図で
ある。
【0276】図49において、12101はリンクポイ
ンタのアドレス(図38の8101)を保持するリンク
ポインタアドレスフィールドである。12102はリン
クポインタのASCII表示名を保持するリンク名フィ
ールドである。
【0277】12103はリンク元インスタンス(図3
8の8103)、つまり、同リンクポインタをデータメ
ンバとして含むインスタンスのアドレス値を保持するリ
ンク元インスタンスアドレスフィールドである。但し、
リンクポインタをデータメンバとして含むインスタンス
が存在しない、または、未検出である場合は、0(ヌル
ポインタ)が格納される。
【0278】12104はリンク先インスタンスのアド
レス(図38の8102)を保持するリンク先インスタ
ンスアドレスフィールドである。特に、0(ヌルポイン
タ)が格納されている場合は、同リンクポインタが現在
何も指していないことを示す。
【0279】次に、オブジェクト管理情報(図2の10
7)の詳細について、図50〜図52を用いて説明す
る。
【0280】図50は本発明の実施形態のクラス情報構
造体の集合を管理するクラス情報テーブルを示す図であ
る。
【0281】図50において、13101はクラス情報
構造体のクラス名フィールド(図47の10101)が
テーブルの検索キーとして使用されることを示す。13
102はクラス情報構造体のその他のフィールドがキー
に対する値項目として使用されることを示す。尚、クラ
ス情報テーブルは、クラス名フィールドをキーとしたハ
ッシュテーブルとして実現するため、キーに対する一致
検索を高速に実行することができる。
【0282】図51は本発明の実施形態のインスタンス
情報構造体の集合を管理するインスタンス情報テーブル
を示す図である。
【0283】図51において、14101はインスタン
ス情報構造体のインスタンスアドレスフィールド(図4
8の11101)がテーブルのキーとして使用されるこ
とを示す。14102はインスタンス情報構造体のその
他のフィールドが、キーに対する値項目として使用され
ることを示す。尚、インスタンス情報テーブルは、イン
スタンスアドレスをキーとしたハッシュテーブルとして
実現する。
【0284】図52は本発明の実施形態のリンク情報構
造体の集合を管理するリンク情報テーブルを示す図であ
る。
【0285】図52において、15101はリンク情報
構造体のリンクポインタアドレスフィールド(図49の
12101)がテーブルの整列キーとして使用されるこ
とを示す。15102はリンク情報構造体のその他のフ
ィールドが、キーに対する値項目として使用されること
を示す。尚、リンク情報テーブルは、リンクポインタア
ドレスをキーとした順序木として実装するため、キーに
対する効率的な一致検索及び範囲検索が可能である。
【0286】次に、クラス情報構造体(図47)、イン
スタンス情報構造体(図48)、リンク情報構造体(図
49)のフィールド間の関係について、図53を用いて
説明する。
【0287】図53は本発明の実施形態のクラス情報構
造体、インスタンス情報構造体、リンク情報構造体のフ
ィールド間の関係を示す図である。
【0288】図53において、16101はクラス情報
構造体を示す。16102はインスタンス情報構造体を
示す。16103はリンク情報構造体を示す。
【0289】16201はクラス情報エントリの基底ク
ラスフィールドが他のクラス情報エントリのクラス名キ
ーを参照すること、つまり、基底クラス名フィールドが
空文字列でないならば、該基底クラス名をクラス名フィ
ールドの値とするクラス情報エントリが存在しなければ
ならないことを示す。
【0290】16202はインスタンス情報エントリの
クラス名フィールドがクラス情報テーブル中のいずれか
のクラス情報エントリのクラス名キーを参照することを
示す。
【0291】16203はリンク情報エントリのリンク
元インスタンスアドレスフィールドが0でないならば、
インスタンス情報テーブル中のいずれかのインスタンス
情報エントリのインスタンスアドレスキーを参照するこ
とを示す。
【0292】16204はリンク情報エントリのリンク
先インスタンスアドレスフィールドが0でないならば、
インスタンス情報テーブル内のいずれかのインスタンス
情報エントリのインスタンスアドレスキーを参照するこ
とを示す。
【0293】次に、クラス情報テーブル(図50)、イ
ンスタンス情報テーブル(図51)、リンク情報テーブ
ル(図52)の内部状態の推移例として、図3、図4で
例示した順序木クラスが図6、図7の状態を経た場合に
ついて、図54〜図58を用いて説明する。
【0294】図54は本発明の実施形態の図6の順序木
クラスTreeのインスタンスTree#0を生成する
過程において、リンクポインタrootのコンストラク
タの呼び出しが完了し、リンクポインタを含むインスタ
ンスのコンストラクタの呼び出しが実行されていない時
点の状態を示す図である。
【0295】図54において、17101はリンク情報
テーブルに新規登録されたリンク情報エントリを示す。
【0296】17201はリンク情報エントリ1710
1のリンクポインタアドレスが1004Hであることを
示す。17202はリンク名がrootであることを示
す。17203はリンク元インスタンスアドレスが未設
定であることを表現するヌルポインタであることを示
す。17204はリンク先インスタンスアドレスがヌル
ポインタであること、つまり、同リンクは現在何も指し
ていないことを示す。
【0297】尚、リンクポインタrootに対するコン
ストラクタの呼び出し(図35のステップS143)終
了時点では、リンクポインタrootに対するリンク生
成通知関数(図35)は実行済みである。しかし、リン
クポインタrootを含むリンク元インスタンスTre
e#0に対するコンストラクタは未実行であるため、T
ree#0に対するインスタンス生成通知関数(図2
8)は未だ呼び出されていない。 従って、リンクポイ
ンタrootがインスタンスTree#0にデータメン
バとして含まれることは、現時点では認識されていな
い。また、このことは、リンク情報エントリ17101
のリンク元インスタンスアドレスフィールド17203
にヌルポインタが設定されていることによって示されて
いる。
【0298】図55は本発明の実施形態の図6において
順序木クラスのインスタンスTree#0の生成が完了
した時点におけるクラス情報テーブル、インスタンス情
報テーブル、リンク情報テーブルの内部状態を示す図で
ある。
【0299】図55において、17102はクラス情報
テーブルに新規登録されたクラス情報エントリを示す。
17103はインスタンス情報テーブルに新規登録され
たインスタンス情報エントリを示す。
【0300】17205はクラス情報エントリ1710
2のクラス名フィールドの値がTreeであるとこと、
つまり、新規クラスの名前がTreeであることを示
す。
【0301】17206はクラス情報エントリ1710
2のクラスNoフィールドの値が0であること、つま
り、新規クラス情報はクラス情報テーブルの最初に登録
されたエントリであることを示す。
【0302】17207はクラス情報エントリ1710
2の生成インスタンス数フィールドの値が1であるこ
と、つまり、クラスTreeのインスタンスが1つ生成
された履歴があることを示す。
【0303】17208はクラス情報エントリ1710
2の生存インスタンス数フィールドの値が1であるこ
と、つまり、クラスTreeのインスタンスが現在1つ
生存していることを示す。
【0304】17209はインスタンス情報エントリ1
7103のインスタンスアドレスフィールドの値が10
00Hであること、つまり、新規作成されたインスタン
スはデバッグ対象プログラムのメモリアドレス1000
Hの位置に存在することを示す。
【0305】17210はインスタンス情報エントリ1
7103のクラス名フィールドの値がTreeであるこ
と、つまり、作成されたインスタンスはクラスTree
に属することを示す。
【0306】17211はインスタンス情報エントリ1
7103のインスタンスサイズフィールドの値が8であ
ること、つまり、新規作成されたインスタンスは8バイ
トのメモリ領域を占有することを示す。
【0307】17212はインスタンス情報エントリ1
7103のインスタンスNoフィールドの値が0、つま
り、このインスタンスがクラスTreeの最初に生成さ
れたインスタンスであることを示す。従って、このイン
スタンスは、Tree#0と略記することができる(ク
ラスTreeの0番目に生成されたインスタンス)。1
7213はリンク情報エントリ17101のリンク元イ
ンスタンスアドレスフィールドに1000Hが設定され
たこと、つまり、リンク情報エントリ17101が表現
するリンクポインタは、1000H番地に存在するデバ
ッグ対象クラスのインスタンスTree#0にデータメ
ンバとして含まれることが判明したことを示す。
【0308】以上のことから、リンク情報17101エ
ントリは、Tree#0.rootと略記することがで
きる(クラスTreeの最初のインスタンスが含むリン
クポインタroot)。
【0309】順序木クラスTreeのインスタンス(図
6の131)を作成する処理は、インスタンス生成処理
(図28の左端のフローチャート)に従って実行され
る。また、同処理から呼び出されるインスタンス生成通
知関数(図28)は、図54で示したクラス情報テーブ
ル(空のテーブル)、インスタンス情報テーブル(空の
テーブル)、リンク情報テーブルの状態を、図55で示
した状態に以下の手順により遷移させる。
【0310】まず、最初に、インスタンス生成通知関数
(図28)は、引数で受け取ったクラス名をキーとして
クラス情報テーブルを検索する。しかし、エントリが見
つからないため、新規のクラス情報エントリ17102
を作成し、クラス情報テーブルに追加する。
【0311】次に、インスタンス生成通知関数は、引数
で受け取ったクラス名、インスタンスサイズ、インスタ
ンスアドレスを適切にフィールドに詰めたインスタンス
情報17103を作成し、インスタンス情報テーブルに
追加する。
【0312】最後に、インスタンス生成通知関数は、生
成されたインスタンスがデータメンバとして含むリンク
ポインタを表現するリンク情報エントリ17101のリ
ンク元インスタンスアドレスフィールド17213を新
規生成インスタンスのアドレス値に設定する。
【0313】尚、リンクポインタが特定のインスタンス
に含まれるかどうかは、リンクポインタアドレスがイン
スタンスアドレス以上且つインスタンスアドレス+イン
スタンスサイズ未満であることで判定する。
【0314】図56は本発明の実施形態の図7のノード
クラスのインスタンスNode#0を生成する過程にお
いて、リンクポインタleft、リンクポインタrig
htのコンストラクタの呼び出し処理が完了し、リンク
ポインタを含むインスタンスNode#0のコンストラ
クタの呼び出し処理が未実行である状態を示す図であ
る。
【0315】図56において、17104、17105
はリンク情報テーブルに新規登録されたリンク情報エン
トリを示す。
【0316】17213aはリンク情報エントリ171
04のリンクポインタアドレスが2008Hであること
を示す。17214はリンク情報エントリ17104の
リンク名がleftであることを示す。
【0317】17215はリンク情報エントリ1710
4のリンク元インスタンスアドレスがヌルポインタ、つ
まり、該リンクポインタはデバッグ対象クラスのどのイ
ンスタンスにも現時点では含まれていないことを示す。
【0318】17216はリンク情報エントリ1710
4のリンク先インスタンスアドレスがヌルポインタ、つ
まり、リンクポインタは現在何も指していないことを示
す。17217はリンク情報エントリ17105のリン
クポインタアドレスが200CHであることを示す。1
7218はリンク情報エントリ17105のリンク名が
rightであることを示す。
【0319】17219はリンク情報エントリ1710
5のリンク元インスタンスアドレスがヌルポインタ、つ
まり、該リンクポインタはデバッグ対象クラスのどのイ
ンスタンスにも現時点では含まれていないことを示す。
【0320】17220はリンク情報エントリ1710
5のリンク先インスタンスアドレスがヌルポインタ、つ
まり、リンクポインタは現在何も指さないことを示す。
【0321】図57は本発明の実施形態の図7のノード
クラスのインスタンスNode#0の生成直後の(Tr
ee#0のrootポインタには未だNode#0のア
ドレスが設定されていない)クラス情報テーブル、イン
スタンス情報テーブル、リンク情報テーブルの内部状態
を示す図である。
【0322】図57において、17106はクラス情報
テーブルに新規登録されたクラス情報エントリを示す。
17107はインスタンス情報テーブルに新規登録され
たインスタンス情報エントリを示す。
【0323】17221はクラス情報エントリ1710
6のクラス名フィールドの値がNodeであるとこと、
つまり、新規クラスの名前がNodeであることを示
す。
【0324】17222はクラス情報エントリ1710
6のクラスNoフィールドの値が1であること、つま
り、新規クラスNodeはクラス情報テーブルに(0か
ら数えて)1番目に登録されたエントリであることを示
す。
【0325】17223はクラス情報エントリ1710
6の生成インスタンス数フィールドの値が1であるこ
と、つまり、クラスNodeのインスタンスが1つ生成
された履歴が存在することを示す。
【0326】17224はクラス情報エントリ1710
6の生存インスタンス数フィールドの値が1であるこ
と、つまり、クラスNodeのインスタンスが現在1つ
生存していることを示す。
【0327】17225はインスタンス情報エントリ1
7107のインスタンスアドレスフィールドの値が20
00Hであること、つまり、新規作成されたインスタン
スのアドレスが2000Hであることを示す。
【0328】17226はインスタンス情報エントリ1
7107のクラス名フィールドの値がNodeであるこ
と、つまり、新規作成されたインスタンスはクラスNo
deに属することを示す。
【0329】17227はインスタンス情報エントリ1
7107のインスタンスサイズフィールドの値が16で
あること、つまり、新規作成されたインスタンスは16
バイトのメモリを占有することを示す。
【0330】17228はインスタンス情報エントリ1
7107のインスタンスNoフィールドの値が0、つま
り、このインスタンスがクラスNodeの最初に生成さ
れたインスタンスであることを示す。従って、このイン
スタンスは、Node#0と略記することができる(ク
ラスNodeの0番目に生成されたインスタンス)。1
7215a、17219aはそれぞれ、リンク情報エン
トリ17104、17105のリンク元インスタンスア
ドレスフィールドに2000Hが設定されたこと、つま
り、リンク情報エントリ17104、17105が表現
するリンクポインタは、インスタンスNode#0に含
まれることが判明したことを示す。従って、リンク情報
エントリ17104、17105はそれぞれ、Node
#0.left、Node#0.rightと略記する
ことができる(クラスNodeの0番目に生成されたイ
ンスタンスが含む、leftリンクポインタと、rig
htリンクポインタ)。
【0331】図58は本発明の実施形態の図7の順序木
において、Node#0のアドレスをTree#0のr
ootポインタに設定した後のクラス情報テーブル、イ
ンスタンス情報テーブル、リンク情報テーブルの内部状
態を示す図である。
【0332】図58において、17204aはリンク情
報エントリ17101のリンク先インスタンスフィール
ドに2000Hが設定されたこと、つまり、リンクポイ
ンタTree#0.rootにインスタンスNode#
0のアドレスが設定されたことを示す。
【0333】リンクポインタTree#0.rootに
インスタンスのアドレスを設定する処理は、リンクポイ
ンタヘの代入処理(図37(a))によって実行されリ
ンク変更通知関数(図37(b))を呼び出す。
【0334】リンク変更通知関数は、引数で渡されたT
ree#0.rootのリンクポインタアドレス(10
04H)をキーとしてリンク情報テーブルを検索する。
そして、検索されたリンク情報エントリ17101のリ
ンク先インスタンスアドレスフィールドに、同関数に引
数で渡されたリンク先インスタンスアドレス値(200
0H、つまり、Node#0のアドレス)を設定する。
【0335】次に、基底クラスBaseと派生クラスD
erivedの生成と削除に対するクラス情報テーブ
ル、インスタンス情報テーブルの変化の過程について、
図59〜図64を用いて説明する。
【0336】図59は本発明の実施形態のデバッグ対象
クラスBaseの最初のインスタンスが生成された直後
におけるクラス情報テーブルとインスタンス情報テーブ
ルの状態を示す図である。
【0337】図59において、18101は新規登録さ
れたクラス情報エントリを示す。18102は新規登録
されたインスタンス情報エントリを示す。
【0338】18201はクラス情報エントリ1810
1のクラス名がBaseであることを示す。18202
はクラス情報エントリ18101のクラスNoフィール
ドの値が0であること、つまり、クラス情報エントリ1
8101はクラス情報テーブルに最初に登録されたエン
トリであることを示す。
【0339】18203はクラス情報エントリ1810
1の基底クラス名フィールドの値が空文字列であるこ
と、つまり、クラスBaseは基底クラスを持たないこ
とを示す。 18204はクラス情報エントリ1810
1の生成インスタンス数フィールドの値が1、つまり、
クラスBaseのインスタンスが1つ作成された履歴が
あることを示す。
【0340】18205はクラス情報エントリ1810
1の生存インスタンス数フィールドの値が1、つまり、
現在クラスBaseのインスタンスが1つ存在すること
を示す。
【0341】18206はインスタンス情報エントリ1
8102のインスタンスアドレスフィールドが1000
Hであること、つまり、該インスタンスのメモリアドレ
スが1000Hであることを示す。
【0342】18207はインスタンス情報エントリ1
8102のクラス名フィールドの値がBaseであるこ
と、つまり、該インスタンスはクラスBaseに属する
ことを示す。
【0343】18208はインスタンス情報エントリ1
8102のインスタンスサイズフィールドの値が10で
あること、つまり、該インスタンスが10バイトのメモ
リ領域を占有することを示す。
【0344】18209はインスタンス情報エントリ1
8102の生成Noフィールドの値が0、つまり、該イ
ンスタンスがクラスBaseの最初に生成されたインス
タンスであることを示す。
【0345】図60は本発明の実施形態の図59で示し
た状態から基底クラスBaseから派生したクラスDe
rivedのインスタンス生成処理において基底クラス
Baseのコンストラクタ呼び出しが完了した直後の状
態を示す図である。
【0346】図60において、18103はインスタン
ス情報テーブルに新規登録されれたインスタンス情報エ
ントリを示す。
【0347】18210はインスタンス情報エントリ1
8103のインスタンスアドレスが2000H、つま
り、該インスタンスのメモリアドレスが2000Hであ
ることを示す。
【0348】18211はインスタンス情報エントリ1
8103のクラス名フィールドの値がBaseであるこ
と、つまり、該インスタンスはクラスBaseに属する
と認識されていることを示す。
【0349】18212はインスタンス情報エントリ1
8103のインスタンスサイズフィールドの値が10、
つまり、該インスタンスは10バイトのメモリ領域を占
有すると現時点では考えられていることを示す。
【0350】18213はインスタンス情報エントリ1
8103の生成Noフィールドの値が1、つまり、該イ
ンスタンスがBaseクラスの(0から数えて)1番目
のインスタンスであることを示す。
【0351】この段階では、派生クラスのインスタンス
の中の基底クラス部分(図31の5103)だけがイン
スタンス情報テーブルに管理されている。
【0352】図61は本発明の実施形態の図60の状態
から派生クラスDerivedのインスタンス生成処理
において派生クラスのコンストラクタの呼び出しが完了
した時点のクラス情報テーブル、インスタンス情報テー
ブルの状態を示す図である。図61において、1810
4はクラス情報テーブルに新規登録されたクラス情報エ
ントリを示す。18214はクラス情報エントリ181
04のクラス名がDerivedであることを示す。1
8215はクラス情報エントリ18104のクラスNo
が1であること、つまり、クラスDerivedは、
(0から数えて)1番目に認識されたクラスであること
を示す。
【0353】18216はクラス情報エントリ1810
4の基底クラス名の値がBaseであること、つまり、
クラスDerivedは基底クラスBaseを持つこと
を示す。 18217はクラス情報エントリ18104
の生成インスタンス数が1、つまり、クラスDeriv
edのインスタンスが1つ生成された履歴が存在するこ
とを示す。
【0354】18218はクラス情報エントリ1810
4の生存インスタンス数が1、つまり、現時点におい
て、クラスDerivedのインスタンスが1つ存在す
ることを示す。
【0355】18211aはインスタンス情報エントリ
18103のクラス名フィールドの値がBaseからD
erivedに変更されたこと、つまり、アドレス20
00H番地に存在するメモリ実体が派生クラスDeri
vedのインスタンスであることが、この時点で初めて
認識されたことを示す。
【0356】18212aは、インスタンス情報エント
リ18103のインスタンスサイズが、10から20に
変更されたこと、つまり、アドレス2000H番地に存
在するメモリ実体は20バイトのメモリ領域を占有する
ことが、この時点において認識されたことを示す。
【0357】18205aはクラスBaseの生存イン
スタンス数に変化がないこと(2のままである)を示
す。しかし、派生クラスDerivedのインスタンス
内部には基底クラスのインスタンスが含まれるため、イ
ンスタンスBase#0とインスタンスDerived
#0の基底クラス部分(図31の5103)の計2つの
Baseクラスのインスタンスが存在することを反映す
る。
【0358】デバッグ対象クラスのコンストラクタから
呼び出されるインスタンス生成通知関数は、以下の手順
により、生成されたインスタンスが派生クラスの場合を
処理する。
【0359】まず、最初に、インスタンス生成通知関数
は、インスタンスアドレスパラメータに対応するインス
タンス情報エントリが既にテーブルに存在するかどうか
を調べる。
【0360】もし、該当するインスタンス情報エントリ
が存在するならば、本インスタンス生成通知関数は、派
生クラスのコンストラクタ内部から呼び出されているこ
とが判明する。この場合、同一インスタンスアドレスを
持つ既存のインスタンス情報エントリのクラス名(図6
0の18211)は、基底クラスの名前を格納してい
る。
【0361】次に、派生クラスに対するクラス情報エン
トリの基底クラス名フィールド(図61の18216)
に前記基底クラス名を設定することで、クラス情報テー
ブル内で、基底クラスと派生クラスの間の継承関係を確
立する。
【0362】最後に、既存のインスタンス情報エントリ
の、クラス名、インスタンスサイズ、生成Noフィール
ドを派生クラスのインスタンスを表現するように変更す
る図62は本発明の実施形態の図61の状態から派生ク
ラスDerivedのインスタンスDerived#0
が削除される処理において派生クラスのデストラクタの
呼び出しが完了した時点での状態を示す図である。
【0363】図62において、18218は派生クラス
Derivedの生存インスタンス数が0に変化したこ
とを示す。
【0364】18211aはアドレス2000H番地に
存在するメモリ実体がもはやDerivedでなく、B
aseであるという認識に代わったことを示す。この認
識の変化は、派生クラスDerivedが追加したデー
タメンバ(図31の5104)が派生クラスのデストラ
クタによって、既に片づけられていることを表現する
(一方、基底クラスのデータメンバは基底クラスのデス
トラクタが呼び出されていないため、生存中であると考
える)。
【0365】18212aはアドレス2000H番地に
存在するメモリ実体が20バイトのままであることを示
すが、これは、派生クラスのインスタンス生成処理(図
32(a))が実行したメモリ割り当て処理(図32
(a))は派生クラスのインスタンスを格納するための
メモリ領域を割り当てたが、このメモリ自体は今でも存
在することを表現する。
【0366】18213aは、インスタンス情報エント
リ18103がクラスBaseの(0から数えて)0番
目に作成されたインスタンスであることを示す。しか
し、インスタンス情報エントリ18102の生成Noフ
ィールド18209も同一の生成Noを持つため、Ba
seクラスのインスタンス生成Noは矛盾が生じてい
る。この矛盾は、派生クラスDerivedのデストラ
クト処理が完了した時に解消される。
【0367】デバッグ対象クラスのデストラクタから呼
び出されるインスタンス削除通知関数は、以下の手順に
よって、削除されるインスタンスが派生クラスの場合を
扱う。
【0368】インスタンス削除通知関数は、まず、最初
に、削除すべきインスタンスを表現するインスタンス情
報エントリのクラス名フィールドをキーとしてクラス情
報テーブルを検索する。そして、検索されたクラス情報
エントリの基底クラス名が空文字列でないならば、本イ
ンスタンス削除通知関数は、派生クラスのデストラクタ
内部から呼び出されていることが判明する。
【0369】この場合には、インスタンス情報エントリ
をテーブルから削除してしまう代わりに、同インスタン
ス情報エントリが派生クラスが含む基底クラスインスタ
ンスを表現するようにフィールドを適切に調整する。
【0370】図63は本発明の実施形態の図62の状態
から派生クラスDerivedのインスタンスDeri
ved#0が削除される処理が完了した時点でのクラス
情報テーブルとインスタンス情報テーブルの状態を示す
図である。
【0371】図63において、インスタンスアドレス2
000Hに対応するインスタンス情報エントリ(図62
の18103)は、インスタンス情報テーブルから削除
されている。また、18205bは、Baseクラスの
生存インスタンス数が2から1に変化したことを示す。
【0372】図64は本発明の実施形態の図63の状態
から唯一のインスタンスBase#0が削除された後の
状態を示す図である。
【0373】図64において、インスタンスアドレス1
000Hに対応するインスタンス情報エントリ(図62
の18102)がインスタンス情報テーブルから削除さ
れている。さらに18205cは、Baseクラスの生
存インスタンス数が1から0に変化したことを示す。
【0374】尚、クラスに属するインスタンスがすべて
削除された後でも、対応するクラス情報エントリは、ク
ラス情報テーブルから削除されることはない(生成イン
スタンス数の情報はインスタンスが存在しなくなっても
必要である)。
【0375】次に、オブジェクト管理情報(図2の10
7)に含まれるその他の管理情報について、図65を用
いて説明する。
【0376】図65は本発明の実施形態のオブジェクト
管理情報に含まれるその他の管理情報を示す図である。
【0377】図65において、19101はクラス情報
テーブルに含まれるエントリ数を保持するクラス数変数
である。19102、19103はオブジェクトウイン
ドウに表示されるインスタンスボックスの表示間隔であ
る。19104は第1行に表示されるインスタンスボッ
クスとオブジェクトウインドウの上辺間のマージン値を
保持し、19105は同左マージン値を保持する。
【0378】次に、クラス情報テーブル、インスタンス
情報テーブル、リンク情報テーブルに新規登録されるエ
ントリの初期値について、図66〜図68を用いて説明
する。
【0379】図66は本発明の実施形態のインスタンス
生成通知関数が新規のクラス情報エントリをクラス情報
テーブルに追加する際の初期値を示す図である。
【0380】図66において、20101はクラス名フ
ィールドがインスタンス生成通知関数のクラス名引数の
値に初期化されることを示す。20102はクラスNo
フィールドがクラス数変数(図65の19101)の現
在値、つまり、クラス情報テーブルのエントリ数に初期
化されることを示す。
【0381】20103は基底クラス名フィールドが空
文字列に初期化されることを示す。20104はインス
タンスサイズフィールドがインスタンス生成関数の同引
数の値に初期化されることを示す。
【0382】20105、20106は生成/生存イン
スタンス数フィールドが0に初期化されることを示す。
20107はブレークフラグフィールドがオン状態に初
期化されることを示す。
【0383】20108は次生成インスタンスの表示位
置フィールドが、行位置はクラス数変数(図65の19
101)の値に、列位置が0に初期化されることを示
す。
【0384】図67は本発明の実施形態のインスタンス
生成通知関数が新規のインスタンス情報エントリをイン
スタンス情報テーブルに追加する際の初期値を示す図で
ある。
【0385】図67において、21101、2110
2、21103はインスタンスアドレス、クラス名、イ
ンスタンスサイズフィールドがインスタンス生成通知関
数の対応する引数の値に初期化されることを示す。
【0386】21104、21105は生成Noフィー
ルド、表示位置フィールドが、インスタンス生成通知関
数のクラス名引数の値にマッチするクラス情報エントリ
の生成インスタンスNo、次生成インスタンスの表示位
置フィールドの値に初期化されることを示す。
【0387】図68は本発明の実施形態のリンク生成通
知関数がリンク情報テーブルに追加するリンク情報エン
トリの初期値を示す図である。
【0388】図68において、22101、2210
2、22104はリンクポインタアドレス、リンク名、
リンク先インスタンスアドレスフィールドが、リンク生
成通知関数の対応する引数の値に初期化されることを示
す。
【0389】22103はリンク元インスタンスアドレ
スフィールドがヌルポインタに初期化されることを示
す。
【0390】次に、インスタンス生成通知関数が実行す
る処理の詳細について、図69を用いて説明する。
【0391】図69は本発明の実施形態のインスタンス
生成通知関数が実行する処理の詳細を示すフローチャー
トである。
【0392】図69において、インスタンス生成通知関
数は、まず、最初に、ステップS1102で、デバッガ
スレッドとの競合を避けるため、オブジェクト管理情報
への排他アクセスのためのセマフォを獲得する。
【0393】次に、ステップS1103で、関数引数と
して渡されたクラス名をキーとしてクラス情報テーブル
を検索する。ステップS1104で、クラス名がクラス
情報テーブルに存在するか否かを判定する。クラス名が
クラス情報テーブルに存在する場合(ステップS110
4でYES)、ステップS1106に進む。一方、クラ
ス名がクラス情報テーブルに存在しない場合(ステップ
S1104でNO)、ステップS1105に進む。
【0394】ステップS1105で、図66で示した初
期値を持つ新規のクラス情報エントリをクラス情報テー
ブルに追加する(以降、新規のクラス情報エントリ若し
くは、キー検索の結果得られたクラス情報エントリを、
以下の説明では単にクラス情報エントリと称する)。
【0395】次に、ステップS1106で、関数引数と
して渡されたインスタンスアドレスをキーとしてインス
タンス情報テーブルを検索する。ステップS1107
で、インスタンスアドレスがインスタンス情報テーブル
に存在するか否かを判定する。インスタンスアドレスが
インスタンス情報テーブルに存在する場合(ステップS
1107でYES)、ステップS1109に進む。尚、
本実施形態のインスタンス生成通知関数は、基底クラス
部分が既にインスタンス情報テーブルに登録済みである
ような派生クラスのコンストラクタ内部から呼び出され
たことが判明する。
【0396】ステップS1109で、ステップS110
6で検索されたインスタンス情報エントリのクラス名
を、クラス情報エントリの基底クラス名に設定する。次
に、ステップS1110で、インスタンス情報エントリ
のクラス名、インスタンスサイズフィールドを関数引数
で指定された対応する値に変更する。次に、ステップS
1111で、インスタンス情報エントリの生成No、表
示位置フィールドをクラス情報エントリの生成インスタ
ンス数、次インスタンスの表示位置フィールドからそれ
ぞれコピーする。これにより、同インスタンス情報エン
トリは、派生クラスのインスタンスを表現するように変
更される。
【0397】一方、ステップS1107において、イン
スタンスアドレスがインスタンス情報テーブルに存在し
ない場合(ステップS1107でNO)、ステップS1
108に進む。尚、この場合の生成されたインスタンス
は基底クラスを持たないクラスのインスタンスである。
【0398】そして、ステップS1108で、図67で
示した初期値を持った新規のインスタンス情報エントリ
をインスタンス情報テーブルに追加する。
【0399】次に、ステップS1112で、クラス情報
エントリの生成インスタンス数フィールド、生存インス
タンスフィールド、次インスタンスの表示位置の列位置
をそれぞれインクリメントする。次に、ステップS11
13で、生成されたインスタンスがデータメンバとして
含むリンクポインタを表現するリンク情報エントリのリ
ンク元インスタンスアドレスに関数引数で渡されたイン
スタンスアドレス値を設定する。この処理は、リンクポ
インタアドレスフィールドが、生成インスタンスのイン
スタンスアドレス値以上、且つインスタンスアドレス値
+インスタンスサイズ値未満であるようなリンク情報を
リンク情報テーブルから範囲検索する。そして、該当す
るリンク情報エントリのリンク元インスタンスアドレス
フィールドを設定することで実現する。
【0400】次に、ステップS1114で、クラス情報
エントリのブレークフラグの値を獲得する。
【0401】以上の処理によって、オブジェクト管理情
報へのアクセスが終了する。そして、ステップS111
5で、ステップS1102で獲得したセマフォを開放す
る。最後に、ステップS1116で、デバッガスレッド
にオブジェクト管理情報の描画要求メッセージをポスト
する。そして、ステップS1117で、ステップS11
14が取得したブレークフラグがONの時、確認ダイア
ログボックスを表示する。また、もしユーザがNOボタ
ンを選択したならば、アプリケーションを強制終了す
る。
【0402】次に、インスタンス削除通知関数が実行す
る処理の詳細について、図70を用いて説明する。
【0403】図70は本発明の実施形態のインスタンス
削除通知関数が実行する処理の詳細を示すフローチャー
トである。
【0404】図70において、インスタンス削除通知関
数は、まず、最初に、ステップS2102で、オブジェ
クト管理情報への排他アクセス権を得るためのセマフォ
を獲得する。
【0405】次に、ステップS2103で、関数引数で
渡されたインスタンスアドレスをキーとしてインスタン
ス情報テーブルを検索する。ステップS2104で、イ
ンスタンスアドレスがインスタンス情報テーブルに存在
するか否かを判定する。インスタンスアドレスがインス
タンス情報テーブルに存在しない場合(ステップS21
04でNO)、ステップS2115に進む。この場合、
オブジェクト管理情報に不整合が存在するため、ステッ
プS2115で、ステップS2102で獲得したセマフ
ォを開放する。次に、ステップS2118で、適切なエ
ラーダイアログを表示し、関数からリターンする。
【0406】一方、インスタンスアドレスがインスタン
ス情報テーブルに存在する場合(ステップS2104で
YES)、ステップS2105に進む。ステップS21
05で、ステップS2103で検索したインスタンス情
報エントリのクラス名をキーとしてクラス情報テーブル
を検索する。ステップS2106で、クラス名がクラス
情報テーブルに存在するか否かを判定する。クラス名が
クラス情報テーブルに存在しない場合(ステップS21
06でNO)、ステップS2115に進む。この場合、
オブジェクト管理情報に不整合が存在するため、ステッ
プS2115で、ステップS2102で獲得したセマフ
ォを開放する。次に、ステップS2118で、適切なエ
ラーダイアログを表示し、関数からリターンする。
【0407】一方、クラス名がクラス情報テーブルに存
在する場合(ステップS2106でYES)、ステップ
S2107に進む。ステップS2107で、ステップS
2105で検索したクラス情報エントリの生存インスタ
ンス数をデクリメントする。次に、ステップS2108
で、クラス情報エントリの基底クラス名、ブレークフラ
グを獲得する。
【0408】次に、獲得した基底クラス名が空文字列で
あるか否かを判定する。空文字列でない場合、ステップ
S2110に進む。この場合、インスタンス削除通知関
数は、派生クラスのデストラクタ内部から呼び出された
ことが判明する。そして、ステップS2110で、イン
スタンス情報エントリのクラス名フィールドにクラス情
報の基底クラス名を設定する。次に、ステップS211
4で、ステップS2102で獲得したセマフォを開放
し、関数からリターンする。
【0409】一方、空文字列である場合、ステップS2
111に進む。この場合、インスタンス削除通知関数
は、基底クラスを持たないクラスのデストラクタ内部か
ら呼び出されたことが判明する。そして、ステップS2
111で、削除されるインスタンスがデータメンバとし
て保持するリンクポインタを表現したリンク情報エント
リのリンク元インスタンスアドレスフィールドの値を0
(ヌルポインタ)に設定する。この処理は、削除される
インスタンスのインスタンスアドレス以上、且つインス
タンスアドレス+インスタンスサイズ未満のリンクポイ
ンタアドレスフィールド値を持つリンク情報を範囲検索
することで達成される。
【0410】次に、ステップS2112で、ステップS
2103で獲得したインスタンス情報エントリをインス
タンス情報テーブルから削除する。
【0411】以上の処理によって、オブジェクト管理情
報へのアクセスが終了したので、ステップS2113
で、ステップS2102で獲得したセマフォを開放す
る。次に、ステップS2116で、デバッガスレッドに
オブジェクト管理情報の描画要求メッセージをポストす
る。
【0412】最後に、ステップS2117で、ステップ
S2108で獲得したブレークフラグがONであれば確
認ダイアログボックスを表示する。一方、ユーザがNO
ボタンを選択したならばアプリケーションを強制終了さ
せ、YESボタンを選択したならば、関数からリターン
する。
【0413】次に、リンク生成通知関数が実行する処理
の詳細について、図71を用いて説明する。
【0414】図71は本発明の実施形態のリンク生成通
知関数が実行する処理の詳細を示すフローチャートであ
る。
【0415】図71において、リンク生成通知関数は、
まず、最初に、ステップS3102で、オブジェクト管
理情報への排他アクセスセマフォを獲得する。
【0416】次に、ステップS3103で、図68で示
した初期値を持つ新規のリンク情報エントリをリンク情
報テーブルに追加する。
【0417】最後に、ステップS3104で、ステップ
S3102で獲得したセマフォを開放し、リターンす
る。
【0418】次に、リンク生成通知関数が実行する処理
の詳細について、図72を用いて説明する。
【0419】図72は本発明の実施形態のリンク削除通
知関数が実行する処理の詳細を示すフローチャートであ
る。
【0420】図72において、リンク削除通知関数は、
まず、最初に、ステップS4102で、オブジェクト管
理情報への排他アクセスセマフォを獲得する。
【0421】次に、ステップS4103で、関数引数で
指定されたリンクポインタアドレスをキーとしてリンク
情報テーブルを検索し、一致したエントリをテーブルか
ら削除する。
【0422】最後に、ステップS4104で、ステップ
S4102で獲得したセマフォを開放し、リターンす
る。
【0423】次に、リンク変更通知関数が実行する処理
の詳細について、図73を用いて説明する。
【0424】図73は本発明の実施形態のリンク変更通
知関数が実行する処理の詳細を示すフローチャートであ
る。
【0425】図73において、リンク変更通知関数は、
まず、最初に、ステップS5102で、デバッガスレッ
ドとの競合を避けるため、オブジェクト管理情報への排
他アクセスセマフォを獲得する。
【0426】次に、ステップS5103で、関数引数で
渡されたリンクポインタアドレスをキーとしてリンク情
報テーブルを検索する。そして、ステップS5104
で、リンクポインタアドレスがリンク情報テーブルに存
在するか否かを判定する。リンクポインタアドレスがリ
ンク情報テーブルに存在しない場合(ステップS510
4でNO)、ステップS5114に進む。この場合、オ
ブジェクト管理情報に不整合が存在するため、ステップ
S5114で、ステップS5102で獲得したセマフォ
を開放する。次に、ステップS5117で、適切なエラ
ーダイアログを表示し、関数からリターンする。
【0427】一方、リンクポインタアドレスがリンク情
報テーブルに存在する場合(ステップS5104でYE
S)、ステップS5105に進む。そして、ステップS
5115で、ステップS5103で検索されたリンク情
報エントリのリンク先インスタンスアドレスフィールド
を関数引数で指定された該当する値に変更する。
【0428】次に、ステップS5106で、リンク情報
エントリのリンク元インスタンスアドレスフィールドを
調べる。リンク元インスタンスアドレスフィールドに設
定されている値が0(ヌルポインタ値)である場合、ス
テップS5112に進む。この場合、リンク情報エント
リは、デバッグ対象クラスのインスタンスのデータメン
バとしては含まれていないため、ステップS5112
で、ステップS5102で獲得したセマフォを開放し、
関数からリターンする。
【0429】一方、リンク元インスタンスフィールドに
設定されている値が非0である場合、ステップS510
7に進む。この場合、リンクポインタを含むインスタン
スに関する情報を得るため、ステップS5107で、リ
ンク元インスタンスアドレスをキーとしてインスタンス
情報テーブルを検索する。そして、ステップS5108
で、リンク元インスタンスアドレスがインスタンス情報
テーブルに存在するか否かを判定する。リンク元インス
タンスアドレスがインスタンス情報テーブルに存在しな
い場合(ステップS5108でNO)、ステップS51
14に進む。この場合、オブジェクト管理情報にデータ
の不整合が存在するため、ステップS5114で、ステ
ップS5102で獲得したセマフォを開放する。次に、
ステップS5117で、適切なエラーダイアログを表示
し、関数から直ちにリターンする。
【0430】一方、リンク元インスタンスアドレスがイ
ンスタンス情報テーブルに存在する場合(ステップS5
108でYES)、ステップS5109に進む。そし
て、ステップS5109で、インスタンス情報エントリ
のクラス名をキーとしてクラス情報テーブルを検索す
る。そして、ステップS5110で、クラス名がクラス
情報テーブルに存在するか否かを判定する。クラス名が
クラス情報テーブルに存在しない場合(ステップS51
10でNO)、ステップS5114に進む。この場合、
オブジェクト管理情報にデータの不整合が存在するた
め、ステップS5114で、ステップS5102で獲得
したセマフォを開放する。次に、ステップS5117
で、適切なエラーダイアログを表示し、関数からリター
ンする。
【0431】一方、クラス名がクラス情報テーブルに存
在する場合(ステップS5110でYES)、ステップ
S5111に進む。そして、ステップS5111で、ク
ラス情報エントリのブレークフラグを獲得する。
【0432】以上の処理によって、オブジェクト管理情
報へのアクセスが終了したので、ステップS5113
で、ステップS5102で獲得したセマフォを開放す
る。その後、最新のオブジェクト管理情報の内容をオブ
ジェクトウインドウ内に描画させるために、ステップS
5115で、デバッガスレッドに描画要求メッセージを
ポストする。
【0433】最後に、ステップS5116で、ステップ
S5111で獲得したブレークフラグがONであれば、
ユーザに確認を求めるため、確認ダイアログボックスを
表示する。一方、ユーザがNOボタンを選択すれば、ア
プリケーションを強制終了させる。そうでなければ、関
数からリターンする。
【0434】次に、デバッガスレッドが実行する処理の
詳細について、図74を用いて説明する。
【0435】図74は本発明の実施形態のデバッガスレ
ッドが実行する処理の詳細を示すフローチャートであ
る。
【0436】図74において、デバッガスレッドは起動
後、まず、最初に、ステップS6102で、オブジェク
トウインドウを作成し、メッセージループ処理に入る。
【0437】メッセージループでは、ステップS610
3で、メッセージが到着すればそのメッセージを獲得す
る。次に、ステップS6104で、獲得したメッセージ
が終了メッセージであるか否かを判定する。獲得したメ
ッセージが終了メッセージである場合(ステップS61
04でYES)、スレッドを終了する。一方、獲得した
メッセージが終了メッセージでない場合(ステップS6
103でNO)、ステップS6106に進む。
【0438】次に、ステップS6106で、獲得したメ
ッセージが示すメッセージコードによる分岐を行う。獲
得したメッセージが描画要求メッセージである場合、ス
テップS6107に進む。まず、ステップS6107
で、オブジェクト管理情報への排他アクセスセマフォを
獲得する。次に、ステップS6110で、インスタンス
情報テーブル内の全エントリを、クラス名、生成No、
表示位置フィールドの内容に従ってオブジェクトウイン
ドウ内にインスタンスボックスとして描画する。
【0439】次に、ステップS6112で、リンク情報
テーブル内の全エントリを、リンク元インスタンスアド
レス、リンク先インスタンスアドレスフィールドの値か
らインスタンス情報テーブルを検索することで、リンク
元及びリンク先インスタンスの表示位置を獲得する。更
に、リンク情報エントリのリンク名フィールドの値を用
いてリンク(矢印線)を描画する。但し、この描画処理
は、リンク元インスタンスフィールド及び、リンク先イ
ンスタンスフィールドの値がともに有効なポインタ値
(ヌルポインタ以外)を持つリンク情報についてのみ行
う。
【0440】以上の処理によって、オブジェクト管理情
報へのアクセスが終了するので、ステップS6114
で、ステップS6107で獲得したセマフォを開放し、
メッセージループに戻る(ステップS6103に戻
る)。
【0441】一方、ステップS6106において、獲得
したメッセージがマウスボタンの押下メッセージである
場合、ステップS6108に進む。まず、ステップS6
108で、オブジェクト管理情報への排他アクセスセマ
フォを獲得する。次に、ステップS6111で、インス
タンス情報を全検索する。そして、ステップS6113
で、マウス位置がインスタンスの表示額域と重なるイン
スタンスが存在するか否かを判定する。マウス位置がイ
ンスタンスの表示額域と重なるインスタンスが存在しな
い場合(ステップS6113でNO)、ステップS61
21に進む。そして、ステップS6121で、ステップ
S6108で獲得したセマフォを開放し、メッセージル
ープに戻る(ステップS6103に戻る)。
【0442】一方、マウス位置に表示額域を持つインス
タンスの領域と重なるインスタンスが存在する場合(ス
テップS6113でYES)、ステップS6115に進
む。そして、ステップS6115で、インスタンス情報
エントリのクラス名をキーとしてクラス情報テーブルを
検索する。そして、ステップS6116で、クラス名が
クラス情報テーブルに存在する否かを判定する。クラス
名がクラス情報テーブルに存在しない場合(ステップS
6116でNO)、ステップS6121に進む。そし
て、ステップS6121で、ステップS6108で獲得
したセマフォを開放し、メッセージループに戻る(ステ
ップS6103に戻る)。
【0443】一方、クラス名がクラス情報テーブルに存
在する場合(ステップS6116でYES)、ステップ
S6117に進む。そして、ステップS6117で、マ
ウスボタンが開放されるまでマウスの移動をトラッキン
グする。尚、マウス移動のトラッキング中に、デバッグ
対象アプリケーションが、オブジェクト管理情報を変更
するような処理を行った(例えば、デバッグ対象クラス
のインスタンスの生成または削除)場合でも、ステップ
S6108でオブジェクト管理情報の排他アクセスセマ
フォを獲得しているため、デバッガ対象プログラムはブ
ロックし、オブジェクト管理情報が変更されることはな
い。
【0444】次に、マウスボタンが開放されたならば、
ステップS6118で、ステップS6115で検索され
たクラス情報エントリの次インスタンスの表示位置をマ
ウスボタンの押下位置に変更する。次に、ステップS6
119で、ステップS6111で検索されしたインスタ
ンス情報エントリの表示位置をマウスボタンの開放位置
に変更する。次に、ステップS6120で、描画要求メ
ッセージを自分自身に発行する。
【0445】以上の処理によって、オブジェクト管理情
報へのアクセスが終了するので、ステップS6121
で、ステップ6108で獲得したセマフォを開放し、メ
ッセージループヘ戻る(ステップS6103に戻る)。
但し、ステップS6120で自分自身に描画要求を発行
しているため、ステップS6103は後程、描画要求メ
ッセージを受け取ることになる。
【0446】一方、ステップS6106において、獲得
したメッセージが描画要求メッセージでもマウスボタン
の押下メッセージでもない場合は、ステップS6109
に進む。そして、ステップS6109で、ウインドウシ
ステムによって定められたデフォルト処理を実行し、メ
ッセージループに戻る(ステップS6103に戻る)。
【0447】以上説明したように、本実施形態によれ
ば、プログラムにわずかなデバッグ用マクロを挿入する
だけで、インスタンスの生成、削除、インスタンス間の
リンク関係に関するデバッグが可能なプログラムに換
え、且つ、任意のC++コンパイラによって実行形式フ
ァイルを生成させることが可能である。
【0448】特に、インスタンス間のリンク関係を維持
するポインタの型を、デバッグ機能を実現するためのユ
ーザ定義型に変更するだけで、同ポインタヘの初期設定
及び値変更を行うコード部分を検出するのは、コンパイ
ラの役割となるため、特別なプログラム解析ツールを用
意する必要はない。
【0449】また、既存のデバッガと共用することに対
する制約事項は存在せず、インスタンスの生成、削除、
インスタンス間のリンク関係以外に関するデバッグ機能
は、既存のデバッガの機能を使うことが可能である。 [他の実施形態]図75は本発明の他の実施形態の構成
を示す図である。
【0450】図75において、30101はデバッグ対
象のプログラムである。30102はデバッグ対象プロ
グラム30101が、デバッグ対象クラスのインスタン
スを生成、削除した場合、またはインスタンス間のリン
クを変更した場合に呼び出されるスタブ関数群である。
そして、このスタブ関数群30102は、デバッグ対象
プログラム30101のインスタンスの生成、削除、イ
ンスタンス間のリンクの変更を通信回線30201を介
してデバッグライブラリ30103に通知する。
【0451】スタブ関数群30102は、通知イベント
をデバッグライブラリ30103に送出した後、同デバ
ッグライブラリから肯定応答を受け取るまでブロックす
る。30103はスタブ関数群30102から、インス
タンスの生成と削除、リンク変更情報を通知イベントと
して受け取り、同イベント内容をオブジェクト管理情報
30301に反映させ、GUI部30104に描画要求
を発行するデバッグライブラリ関数群である。
【0452】デバッグライブラリ関数群30103は、
図2のデバッグライブラリ関数群208と同一の機能を
有する。尚、デバッグライブラリは、イベントのパラメ
ータとして受け取ったインスタンスアドレスを調べ、該
インスタンスのブレークフラグがオンの場合は、確認ダ
イアログボックスを表示し、ユーザ確認を求める。
【0453】デバッグライブラリ関数群30103は、
その後、スタブ関数群30102に肯定応答を返し、デ
バッグ対象プログラム30101の実行を再開させる
(従って、確認ダイアログボックスをオープンしている
間は、デバッグ対象プログラム30101はブロックす
る)。
【0454】30301はデバッグ対象プログラム30
101の内部状態を再現したオブジェクト管理情報であ
る。30104はオブジェクト管理情報30301をオ
ブジェクトウインドウ30203にグラフィカルに表示
する。そして、ポインティングデバイス30202か
ら、ブレークポイントの設定、解除、インスタンス表示
位置の変更などのコマンドを受け取るGUI機能を受け
持つ。
【0455】以上説明したように、他の実施形態によれ
ば、デバッガへのインスタンスの生成と削除、インスタ
ンス間のリンクの変更通知を通信回線を介して発送する
構成にすることで、デバッガが動作する環境と、デバッ
グ対象プログラムの動作する環境を別々にすることが可
能であり、特に、組み込み用途のプログラムのデバッグ
にも使用可能である。
【0456】尚、本発明は、複数の機器(例えばホスト
コンピュータ、インタフェース機器、リーダ、プリンタ
など)から構成されるシステムに適用しても、一つの機
器からなる装置(例えば、複写機、ファクシミリ装置な
ど)に適用してもよい。
【0457】また、本発明の目的は、前述した実施形態
の機能を実現するソフトウェアのプログラムコードを記
録した記憶媒体を、システムあるいは装置に供給し、そ
のシステムあるいは装置のコンピュータ(またはCPU
やMPU)が記憶媒体に格納されたプログラムコードを
読出し実行することによっても、達成されることは言う
までもない。
【0458】この場合、記憶媒体から読出されたプログ
ラムコード自体が前述した実施形態の機能を実現するこ
とになり、そのプログラムコードを記憶した記憶媒体は
本発明を構成することになる。
【0459】プログラムコードを供給するための記憶媒
体としては、例えば、フロッピディスク、ハードディス
ク、光ディスク、光磁気ディスク、CD−ROM、CD
−R、磁気テープ、不揮発性のメモリカード、ROMな
どを用いることができる。
【0460】また、コンピュータが読出したプログラム
コードを実行することにより、前述した実施形態の機能
が実現されるだけでなく、そのプログラムコードの指示
に基づき、コンピュータ上で稼働しているOS(オペレ
ーティングシステム)などが実際の処理の一部または全
部を行い、その処理によって前述した実施形態の機能が
実現される場合も含まれることは言うまでもない。
【0461】更に、記憶媒体から読出されたプログラム
コードが、コンピュータに挿入された機能拡張ボードや
コンピュータに接続された機能拡張ユニットに備わるメ
モリに書込まれた後、そのプログラムコードの指示に基
づき、その機能拡張ボードや機能拡張ユニットに備わる
CPUなどが実際の処理の一部または全部を行い、その
処理によって前述した実施形態の機能が実現される場合
も含まれることは言うまでもない。
【0462】
【発明の効果】以上説明したように、本発明によれば、
プログラムのデバッグを効率的に実行することができる
情報処理装置及びその方法、コンピュータ可読メモリを
提供できる。
【0463】
【図面の簡単な説明】
【図1】本発明の実施形態の情報処理装置の構成を示す
図である。
【図2】本発明の概要を説明するための図である。
【図3】本発明の実施形態の順序木クラスを示す図であ
る。
【図4】本発明の実施形態の順序木のノードデータ構造
を示す図である。
【図5】本発明の実施形態の順序木クラスとノードクラ
スの各インスタンスがどのように結合して、1つの順序
木を構成するかを例示する図である。
【図6】本発明の実施形態の空の順序木を示す図であ
る。
【図7】本発明の実施形態の図6の順序木に整数値3を
追加した後の順序木の状態を示す図である。
【図8】本発明の実施形態の図7の順序木に整数値5を
追加した後の順序木の状態を示す図である。
【図9】本発明の実施形態の図8の順序木に整数値4を
追加した後の順序木の状態を示す図である。
【図10】本発明の実施形態の図9の順序木に整数値3
を追加した後の順序木の状態を示す図である。
【図11】本発明の実施形態の図10の順序木に整数値
2を追加した後の順序木の状態を示す図である。
【図12】本発明の実施形態の図11の順序木に整数値
5を追加した後の順序木の状態を示す図である。
【図13】本発明の実施形態の図12の順序木に整数値
6を追加した後の順序木の状態を示す図である。
【図14】本発明の実施形態のオブジェクトウインドウ
の初期状態を示す図である。
【図15】本発明の実施形態の順序木が図6の状態にあ
るときのオブジェクトウインドウの表示状態を示す図で
ある。
【図16】本発明の実施形態の図7のNode#0が作
成済みで、Tree#0のrootポインタメンバがヌ
ルポインタの状態にあるときのオブジェクトウインドウ
を示す図である。
【図17】本発明の実施形態の図7のTree#0のr
ootポインタメンバにインスタンスNode#0のア
ドレスが設定された直後の状態にあるときのオブジェク
トウインドウを示す図である。
【図18】本発明の実施形態の図8のNode#1が作
成済みで、Node#0のrightポインタメンバが
ヌルポインタの状態であるときのオブジェクトウインド
ウ示す図である。
【図19】本発明の実施形態の図8のNode#0のr
ightポインタメンバにNode#1のアドレスが設
定された直後の状態であるときのオブジェクトウインド
ウを示す図である。
【図20】本発明の実施形態の図9のNode#2が作
成済みで、Node#1のleftポインタメンバがヌ
ルポインタである状態のときのオブジェクトウインドウ
を示す図である。
【図21】本発明の実施形態の図9のNode#1のl
eftポインタメンバにNode#2のアドレスが設定
された直後の状態であるときのオブジェクトウインドウ
を示す図である。
【図22】本発明の実施形態の図11のNode#3が
作成済みで、Node#0のleftポインタメンバが
ヌルポインタの状態であるときのオブジェクトウインド
ウを示す図である。
【図23】本発明の実施形態の図11がNode#0の
leftポインタメンバにNode#3のアドレスが設
定された直後の状態であるときのオブジェクトウインド
ウを示す図である。
【図24】本発明の実施形態の図23の確認ダイアログ
ボックスをクローズする前にマウスドラッグによりイン
スタンスボックスを移動した状態を示す図である。
【図25】本発明の実施形態の図13のNode#4が
作成済みで、Node#1のrightポインタメンバ
がヌルポインタの状態であるときのオブジェクトウイン
ドウを示す図である。
【図26】本発明の実施形態の図13のNode#1の
rightポインタメンバにNode#4のアドレスが
設定された直後の状態であるときのオブジェクトウイン
ドウを示す図である。
【図27】本発明の実施形態の図26の確認ダイアログ
ボックスをクローズする前に、マウスドラッグによりイ
ンスタンスボックスを適当な位置に移動した状態を示す
図である。
【図28】本発明の実施形態のデバッグ対象プログラム
の実行経路において、デバッグ対象クラスのインスタン
ス生成をオブジェクト管理情報に反映してオブジェクト
ウインドウ上に表示させる処理を示すフローチャートで
ある。
【図29】本発明の実施形態のインスタンス生成通知関
数が受け取るパラメータの意味内容を示す図である。
【図30】本発明の実施形態のデバッグ対象プログラム
の実行経路において、デバッグ対象クラスのインスタン
スの削除をオブジェクト管理情報に反映してオブジェク
トウインドウ上に表示させる処理を示すフローチャート
である。
【図31】本発明の実施形態のプログラミング言語C+
+における派生クラスのインスタンスのメモリ構造を示
す図である。
【図32】本発明の実施形態のプログラミング言語C+
+において、派生クラスのインスタンスが生成、削除さ
れる処理を示すフローチャートである。
【図33】本発明の実施形態のインスタンス間のリンク
関係を実現する最も一般的な方法を示す図である。
【図34】本発明の実施形態のデバッガがインスタンス
間のリンク関係の変化を検出するためにリンク元インス
タンスとポインタメンバの間にリンクポインタクラスの
インスタンスを挟み込んだ状態を示す図である。
【図35】本発明の実施形態のプログラミング言語C+
+で記述されたプログラムにおけるリンクポインタを含
んだリンク元インスタンスの生成処理を示すフローチャ
ートである。
【図36】本発明の実施形態の図35におけるリンク生
成通知関数のパラメータの意味を示す図である。
【図37】本発明の実施形態のリンクポインタを変更す
る操作の代表例として、リンクポインタに新たに指すべ
きリンク先インスタンスのアドレスを代入する処理を示
すフローチャートである。
【図38】本発明の実施形態のリンク変更通知関数に渡
されるパラメータの意味を示す図である。
【図39】本発明の実施形態のプログラミング言語C+
+で記述されたプログラムにおけるリンクポインタを含
んだリンク元インスタンスの削除処理を示すフローチャ
ートである。
【図40】本発明の実施形態の図3、図4で示した順序
木クラス、ノードクラスを定義するヘッダファイルを示
す図である。
【図41A】本発明の実施形態の図3、図4で示した順
序木クラス、ノードクラスを実装する実装ファイルを示
す図である。
【図41B】本発明の実施形態の図3、図4で示した順
序木クラス、ノードクラスを実装する実装ファイルを示
す図である。
【図42】本発明の実施形態の図40で示したヘッダフ
ァイルにデバッグマクロを埋め込んだ状態を示す図であ
る。
【図43A】本発明の実施形態の図41A、図41Bで
示した実装ファイルにデバッグマクロを埋め込んだ状態
を示す図である。
【図43B】本発明の実施形態の図41A、図41Bで
示した実装ファイルにデバッグマクロを埋め込んだ状態
を示す図である。
【図43C】本発明の実施形態の図41A、図41Bで
示した実装ファイルにデバッグマクロを埋め込んだ状態
を示す図である。
【図44A】本発明の実施形態のデバッグマクロ一式と
リンクポインタテンプレートクラスを定義するデバッグ
ヘッダを示す図である。
【図44B】本発明の実施形態のデバッグマクロ一式と
リンクポインタテンプレートクラスを定義するデバッグ
ヘッダを示す図である。
【図44C】本発明の実施形態のデバッグマクロ一式と
リンクポインタテンプレートクラスを定義するデバッグ
ヘッダを示す図である。
【図45】本発明の実施形態の図42で示したデバッグ
マクロが埋め込まれたヘッダファイルをデバッグモード
でコンパイルした際のマクロ展開結果を示す図である。
【図46A】本発明の実施形態の図43A〜図43Cで
示したデバッグマクロが埋め込まれた実装ファイルをデ
バッグモードでコンパイルした場合のマクロ展開結果を
示す図である。
【図46B】本発明の実施形態の図43A〜図43Cで
示したデバッグマクロが埋め込まれた実装ファイルをデ
バッグモードでコンパイルした場合のマクロ展開結果を
示す図である。
【図46C】本発明の実施形態の図43A〜図43Cで
示したデバッグマクロが埋め込まれた実装ファイルをデ
バッグモードでコンパイルした場合のマクロ展開結果を
示す図である。
【図47】本発明の実施形態のデバッグ対象プログラム
において、インスタンスが生成された履歴があるクラス
に関する情報を管理するクラス情報構造体を示す図であ
る。
【図48】本発明の実施形態のデバッグ対象プログラム
の実行経路において、現時点で生存しているインスタン
スを表現するインスタンス情報構造体を示す図である。
【図49】本発明の実施形態のデバッグ対象プログラム
の実行経路において、現時点で生存中であるリンクポイ
ンタを表現するリンク情報構造体を示す図である。
【図50】本発明の実施形態のクラス情報構造体の集合
を管理するクラス情報テーブルを示す図である。
【図51】本発明の実施形態のインスタンス情報構造体
の集合を管理するインスタンス情報テーブルを示す図で
ある。
【図52】本発明の実施形態のリンク情報構造体の集合
を管理するリンク情報テーブルを示す図である。
【図53】本発明の実施形態のクラス情報構造体、イン
スタンス情報構造体、リンク情報構造体のフィールド間
の関係を示す図である。
【図54】本発明の実施形態の図6の順序木クラスTr
eeのインスタンスTree#0を生成する過程におい
て、リンクポインタrootのコンストラクタの呼び出
しが完了し、リンクポインタを含むインスタンスのコン
ストラクタの呼び出しが実行されていない時点の状態を
示す図である。
【図55】本発明の実施形態の図6において順序木クラ
スのインスタンスTree#0の生成が完了した時点に
おけるクラス情報テーブル、インスタンス情報テーブ
ル、リンク情報テーブルの内部状態を示す図である。
【図56】本発明の実施形態の図7のノードクラスのイ
ンスタンスNode#0を生成する過程において、リン
クポインタleft、リンクポインタrightのコン
ストラクタの呼び出し処理が完了し、リンクポインタを
含むインスタンスNode#0のコンストラクタの呼び
出し処理が未実行である状態を示す図である。
【図57】本発明の実施形態の図7のノードクラスのイ
ンスタンスNode#0の生成直後のクラス情報テーブ
ル、インスタンス情報テーブル、リンク情報テーブルの
内部状態を示す図である。
【図58】本発明の実施形態の図7の順序木において、
Node#0のアドレスをTree#0のrootポイ
ンタに設定した後のクラス情報テーブル、インスタンス
情報テーブル、リンク情報テーブルの内部状態を示す図
である。
【図59】本発明の実施形態のデバッグ対象クラスBa
seの最初のインスタンスが生成された直後におけるク
ラス情報テーブルとインスタンス情報テーブルの状態を
示す図である。
【図60】本発明の実施形態の図59で示した状態から
基底クラスBaseから派生したクラスDerived
のインスタンス生成処理において基底クラスBaseの
コンストラクタ呼び出しが完了した直後の状態を示す図
である。
【図61】本発明の実施形態の図60の状態から派生ク
ラスDerivedのインスタンス生成処理において派
生クラスのコンストラクタの呼び出しが完了した時点の
クラス情報テーブル、インスタンス情報テーブルの状態
を示す図である。
【図62】本発明の実施形態の図61の状態から派生ク
ラスDerivedのインスタンスDerived#0
が削除される処理において派生クラスのデストラクタの
呼び出しが完了した時点での状態を示す図である。
【図63】本発明の実施形態の図62の状態から派生ク
ラスDerivedのインスタンスDerived#0
が削除される処理が完了した時点でのクラス情報テーブ
ルとインスタンス情報テーブルの状態を示す図である。
【図64】本発明の実施形態の図63の状態から唯一の
インスタンスBase#0が削除された後の状態を示す
図である。
【図65】本発明の実施形態のオブジェクト管理情報に
含まれるその他の管理情報を示す図である。
【図66】本発明の実施形態のインスタンス生成通知関
数が新規のクラス情報エントリをクラス情報テーブルに
追加する際の初期値を示す図である。
【図67】本発明の実施形態のインスタンス生成通知関
数が新規のインスタンス情報エントリをインスタンス情
報テーブルに追加する際の初期値を示す図である。
【図68】本発明の実施形態のリンク生成通知関数がリ
ンク情報テーブルに追加するリンク情報エントリの初期
値を示す図である。
【図69】本発明の実施形態のインスタンス生成通知関
数が実行する処理の詳細を示すフローチャートである。
【図70】本発明の実施形態のインスタンス削除通知関
数が実行する処理の詳細を示すフローチャートである。
【図71】本発明の実施形態のリンク生成通知関数が実
行する処理の詳細を示すフローチャートである。
【図72】本発明の実施形態のリンク削除通知関数が実
行する処理の詳細を示すフローチャートである。
【図73】本発明の実施形態のリンク変更通知関数が実
行する処理の詳細を示すフローチャートである。
【図74】本発明の実施形態のデバッガスレッドが実行
する処理の詳細を示すフローチャートである。
【図75】本発明の他の実施形態の構成を示す図であ
る。
【符号の説明】
1 CPU 2 バス 3 ROM 3a 処理プログラム 3b パラメータ 4 RAM 4a オブジェクト管理情報 5 入力インタフェース 6 入力装置 7 出力インタフェース 8 出力装置 9 外部記憶装置インタフェース 10 外部記憶装置
フロントページの続き (72)発明者 平原 厚志 東京都大田区下丸子3丁目30番2号 キヤ ノン株式会社内

Claims (13)

    【特許請求の範囲】
  1. 【請求項1】 プログラムをデバッグする情報処理装置
    であって、 前記プログラムのソースコード中にデバッグ用マクロを
    挿入する挿入手段と、 前記デバッグ用マクロを有効にした前記ソースコードの
    コンパイルを任意のコンパイラで実行する実行手段と、 前記実行手段でコンパイルされた実行プログラムを、前
    記デバッグ用マクロに基づいてデバッグするデバッグ手
    段と、 前記デバッグ手段によるデバッグに関する情報を出力す
    る出力手段とを備えることを特徴とする情報処理装置。
  2. 【請求項2】 前記実行手段は、前記実行プログラムが
    生成するインスタンス間のリンクの変化を引き起こすソ
    ースコード個所を前記コンパイラによって検出させ、前
    記ソースコード箇所に前記デバッグ用マクロに基づいて
    デバッグ用命令コードを該コンパイラに挿入させること
    を特徴とする請求項1に記載の情報処理装置。
  3. 【請求項3】 前記挿入手段は、デバッグ対象のプログ
    ラムのクラス定義内、クラスの実装ファイル内、クラス
    のコンストラクタ内、デストラクタ内、クラスを指すポ
    インタ変数の宣言部分に、前記デバッグ用マクロを挿入
    することを特徴とする請求項1に記載の情報処理装置。
  4. 【請求項4】 前記デバッグ手段は、前記デバッグ用マ
    クロに基づいて、前記実行プログラムによるインスタン
    スの生成/削除の通知、リンクポインタの生成/削除/
    変更通知から、該プログラム内のインスタンスの生存状
    態、クラスの継承関係、インスタンス間のリンク関係を
    再現することを特徴とする請求項1に記載の情報処理装
    置。
  5. 【請求項5】 前記デバッグ手段によって、前記実行プ
    ログラムによるインスタンスの生成と削除、インスタン
    ス間のリンク関係の変化を検出し、状態変化が発生した
    場合は、該プログラムを一時停止させることを特徴とす
    る請求項1に記載の情報処理装置。
  6. 【請求項6】 外部装置と通信する通信手段を更に備
    え、 前記通信手段を介して、前記デバッグ手段は、前記外部
    装置上のデバッグ対象の実行プログラムをデバッグする
    ことを特徴とする請求項1に記載の情報処理装置。
  7. 【請求項7】 プログラムをデバッグする情報処理方法
    であって、 前記プログラムのソースコード中にデバッグ用マクロを
    挿入する挿入工程と、 前記デバッグ用マクロを有効にした前記ソースコードの
    コンパイルを任意のコンパイラで実行する実行工程と、 前記実行工程でコンパイルされた実行プログラムを、前
    記デバッグ用マクロに基づいてデバッグするデバッグ工
    程と、 前記デバッグ工程によるデバッグに関する情報を出力す
    る出力工程とを備えることを特徴とする情報処理方法。
  8. 【請求項8】 前記実行工程は、前記実行プログラムが
    生成するインスタンス間のリンクの変化を引き起こすソ
    ースコード個所を前記コンパイラによって検出させ、前
    記ソースコード箇所に前記デバッグ用マクロに基づいて
    デバッグ用命令コードを該コンパイラに挿入させること
    を特徴とする請求項7に記載の情報処理方法。
  9. 【請求項9】 前記挿入工程は、デバッグ対象のプログ
    ラムのクラス定義内、クラスの実装ファイル内、クラス
    のコンストラクタ内、デストラクタ内、クラスを指すポ
    インタ変数の宣言部分に、前記デバッグ用マクロを挿入
    することを特徴とする請求項7に記載の情報処理方法。
  10. 【請求項10】 前記デバッグ工程は、前記デバッグ用
    マクロに基づいて、前記実行プログラムによるインスタ
    ンスの生成/削除の通知、リンクポインタの生成/削除
    /変更通知から、該プログラム内のインスタンスの生存
    状態、クラスの継承関係、インスタンス間のリンク関係
    を再現することを特徴とする請求項7に記載の情報処理
    方法。
  11. 【請求項11】 前記デバッグ工程によって、前記実行
    プログラムによるインスタンスの生成と削除、インスタ
    ンス間のリンク関係の変化を検出し、状態変化が発生し
    た場合は、該プログラムを一時停止させることを特徴と
    する請求項7に記載の情報処理方法。
  12. 【請求項12】 外部装置と通信回線を介して通信する
    通信工程を更に備え、 前記通信回線を介して、前記デバッグ手段は、前記外部
    装置上のデバッグ対象の実行プログラムをデバッグする
    ことを特徴とする請求項7に記載の情報処理方法。
  13. 【請求項13】 プログラムをデバッグする情報処理の
    プログラムコードが格納されたコンピュータ可読メモリ
    であって、 前記プログラムのソースコード中にデバッグ用マクロを
    挿入する挿入工程のプログラムコードと、 前記デバッグ用マクロを有効にした前記ソースコードの
    コンパイルを任意のコンパイラで実行する実行工程のプ
    ログラムコードと、 前記実行工程でコンパイルされた実行プログラムを、前
    記デバッグ用マクロに基づいてデバッグするデバッグ工
    程のプログラムコードと、 前記デバッグ工程によるデバッグに関する情報を出力す
    る出力工程のプログラムコードとを備えることを特徴と
    するコンピュータ可読メモリ。
JP9355658A 1997-12-24 1997-12-24 情報処理装置及びその方法、コンピュータ可読メモリ Withdrawn JPH11184727A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP9355658A JPH11184727A (ja) 1997-12-24 1997-12-24 情報処理装置及びその方法、コンピュータ可読メモリ

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP9355658A JPH11184727A (ja) 1997-12-24 1997-12-24 情報処理装置及びその方法、コンピュータ可読メモリ

Publications (1)

Publication Number Publication Date
JPH11184727A true JPH11184727A (ja) 1999-07-09

Family

ID=18445109

Family Applications (1)

Application Number Title Priority Date Filing Date
JP9355658A Withdrawn JPH11184727A (ja) 1997-12-24 1997-12-24 情報処理装置及びその方法、コンピュータ可読メモリ

Country Status (1)

Country Link
JP (1) JPH11184727A (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7016807B2 (en) 2002-09-24 2006-03-21 Hitachi, Ltd. Device and method for monitoring a program execution

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7016807B2 (en) 2002-09-24 2006-03-21 Hitachi, Ltd. Device and method for monitoring a program execution

Similar Documents

Publication Publication Date Title
KR101099212B1 (ko) 예외 처리 구조물들을 포함하는 소프트웨어의 소스 언어 독립형 중간 표현을 처리하는 방법, 다수의 소스 코드 언어들에 대한 소스 언어 독립형 예외 처리 중간 표현들을 구현하기 위한 시스템 및 컴퓨터 판독가능 저장 매체
US5519866A (en) Method and apparatus of incrementally linking components of a modeled computer program
US5778212A (en) Interprocedural analysis user interface
US5956479A (en) Demand based generation of symbolic information
US6968540B2 (en) Software instrumentation method and apparatus
US5339435A (en) Heterogenous software configuration management apparatus
US5812855A (en) System and method for constaint propagation cloning for unknown edges in IPA
US9417931B2 (en) Unified metadata for external components
US20030093420A1 (en) Method and system for retrieving sharable information using a hierarchically dependent directory structure
US20140040856A1 (en) Apparatus, Method and System for Building Software by Composition
JPH08339296A (ja) 動的リンク・ライブラリをプログラムにリンクする方法
JP5147240B2 (ja) リバーシブルなデザイン・ツリーの変換のための方法とシステム
US6138272A (en) GDMO translator, method of GDMO translation, and recording medium containing program for GDMO translator
CN115017516A (zh) 一种基于符号执行的模糊测试方法
KR101224788B1 (ko) 비동기적 프로그램 흐름의 모델링을 갖는 소프트웨어 도구
JP2018156133A (ja) コンパイラプログラム、情報処理装置およびコンパイル方法
NO329240B1 (no) System og fremgangsmate for forklarende definering og bruk av undergrupper innenfor dokumentkoding
JP2002116917A (ja) オブジェクト指向型プログラミング言語によるソース・プログラムをコンパイルするコンパイラ
JP6651974B2 (ja) 情報処理装置、コンパイル方法及びコンパイラプログラム
JPH11184727A (ja) 情報処理装置及びその方法、コンピュータ可読メモリ
Kirby et al. An adaptive graphical browser for Napier88
JP5600301B2 (ja) システム表現およびハンドリング技術
JP2019179383A (ja) Api処理方法、端末、api処理プログラム
Byrne et al. GNU Smalltalk User's Guide
CN113495727A (zh) 业务组件开发方法、装置、电子设备及介质

Legal Events

Date Code Title Description
A300 Withdrawal of application because of no request for examination

Free format text: JAPANESE INTERMEDIATE CODE: A300

Effective date: 20050301