(57)【要約】【課題】特定のプログラム実行区間においてプログラムの停止ができないようなシステムのプログラムの実行中におけるリスト構造の状態の変化を把握可能にする。【解決手段】デバッガ１０は、プログラム実行中におけるメモリアクセスを記録したメモリアクセス履歴２３を作成し、メモリアクセス履歴２３を解析して解析対象のリスト構造の状態が変化したタイミングを見つけ出し、変化したタイミングにおけるリスト構造の状態を再現する。再現されたリスト構造の状態が、表示装置４に表示される。【選択図】図３Ｃ
2012088798.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの実行中におけるメモリアクセスを記録したメモリアクセス履歴を作成するメモリアクセス履歴作成手段と、
前記メモリアクセス履歴を解析して、解析対象のリスト構造の状態が変化したタイミングを見つけ出すメモリアクセス履歴解析手段と、
前記変化したタイミングにおける前記リスト構造の状態を再現するリスト構造再現手段と、
前記再現されたリスト構造の状態を出力する出力手段
とを具備する
デバッグ装置。
【請求項２】
請求項１に記載のデバッグ装置であって、
更に、
前記メモリアクセス履歴から前記リスト構造を構成しているアドレスの集合であるアドレス集合を生成するアドレス集合生成手段を具備し、
前記メモリアクセス履歴解析手段は、前記メモリアクセス履歴に記録された各メモリアクセスの書き込みアドレスと前記アドレス集合から解析対象のリスト構造の状態が変化したタイミングを判断する
デバッグ装置。
【請求項３】
請求項１又は２に記載のデバッグ装置であって、
更に、
前記アドレス集合に含まれるアドレスと前記アドレス集合に含まれる前記アドレスの値をペアとして記憶するデータマップを、前記メモリアクセス履歴を用いて生成するデータマップ生成手段を具備し、
前記リスト構造再現手段は、前記データマップを用いて前記変化したタイミングにおける前記リスト構造の状態を再現する
デバッグ装置。
【請求項４】
プログラムの実行中に発生したメモリアクセスを記録したメモリアクセス履歴を作成するステップと、
前記メモリアクセス履歴を解析して、解析対象のリスト構造の状態が変化したタイミングを判断するステップと、
前記変化したタイミングにおける前記リスト構造の状態を再現するステップと、
前記再現されたリスト構造の状態を出力手段によって出力するステップ
とを具備する
デバッグ方法。
【請求項５】
請求項４に記載のデバッグ方法であって、
更に、
前記リスト構造を構成しているアドレスの集合であるアドレス集合を生成するステップを具備し、
前記メモリアクセス履歴に記録された各メモリアクセスの書き込みアドレスと前記アドレス集合から、解析対象のリスト構造の状態が変化したタイミングが判断される
デバッグ方法。
【請求項６】
請求項４のデバッグ方法であって、
前記プログラムが、組み込みシステムのプログラムである
デバッグ方法。
【請求項７】
コンピュータを、
プログラムの実行中におけるメモリアクセスを記録したメモリアクセス履歴を作成するメモリアクセス履歴作成手段と、
前記メモリアクセス履歴を解析して、解析対象のリスト構造の状態が変化したタイミングを見つけ出すメモリアクセス履歴解析手段と、
前記変化したタイミングにおける前記リスト構造の状態を再現するリスト構造再現手段と、
前記再現されたリスト構造の状態を出力する出力手段
として機能させる
デバッグ用プログラム。
【請求項８】
請求項７に記載のデバッグ用プログラムであって、
更に、前記コンピュータを、前記リスト構造を構成しているアドレスの集合であるアドレス集合を生成するアドレス集合生成手段として機能させ、
前記メモリアクセス履歴解析手段が、前記メモリアクセス履歴に記録された各メモリアクセスの書き込みアドレスと前記アドレス集合から解析対象のリスト構造の状態が変化したタイミングを判断するものである
デバッグ用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デバッグ装置、デバッグ方法及びデバッグ用プログラムに関し、特に、組み込みシステムのように、特定のプログラム実行区間においてプログラムの停止ができないようなシステムのプログラムのデバッグに好適なデバッグ装置、デバッグ方法及びデバッグ用プログラムに関する。
【背景技術】
【０００２】
近年、半導体集積回路の大規模化により、組み込みシステムにおけるプログラム開発もＣ言語による開発が主流となっている。その流れの中で、半導体集積回路の複雑な機能をデバッグするためにデバッガが使用され、そのデバッガにおいて管理されるデータも複雑になってきている。
【０００３】
特に、Ｃ言語のプログラムを実行してデバッグする場合、データ領域に記憶されているリスト構造の状態を効率的に把握することが重要になる。ここで、リスト構造とは、集合を表現するデータ構造であり、図１は、そのリスト構造が定義されたＣ言語ソースの例である。図１では、構造体型ｓｔｒｕｃｔ  Ｄａｔａがリスト構造の型として定義されている。リスト構造は、自分自身への型へのポインタ型の構造体メンバ（図１ではｎｅｘｔ）、及び、値を格納する構造体メンバ（図１では、ｓｔｒｉｎｇ及びｎｕｍｂｅｒ）を持った構造体によって構成される。リスト構造では各構造体のポインタ型の構造体メンバ（ｎｅｘｔ）の値に別の構造体のアドレスを入力することによって複数の構造体が連結され、これにより値を格納する構造体メンバ（ｓｔｒｉｎｇ及びｎｕｍｂｅｒ）に格納された値の集合を表現する。
【０００４】
例えば、特開２００８−１４６３１０号公報は、リスト構造を視覚的に分かりやすく表示する技術を開示している。この公報に開示されている技術では、リスト構造を構成する各構造体のポインタ型の構造体メンバ（図１ではｎｅｘｔ）の値から次に連結されている構造体を見つけ、これにより、リスト構造を構成する各構造体が解析される。より具体的には、例えば、図１において、ｍａｉｎ関数中の「ｒｅｔｕｒｎ」と書かれた行７０１にブレークポイントが設定され、デバッガの変数参照機能を利用してポインタ変数「ｈｅａｄ」（符号７０２により参照）が指している変数「＊ｈｅａｄ」の値を表示するように指定した場合の動作は、次のようになる。まず、「＊ｈｅａｄ」が構造体型かどうかが判断され、構造体型であった場合、更に、構造体メンバを解析し、「＊ｈｅａｄ」の構造体と等しい構造体型へのポインタが存在すれば、「＊ｈｅａｄ」の構造体と等しい構造体型へのポインタの個数が調べられる。その個数が一つであれば、「＊ｈｅａｄ」の構造体型のメンバを列挙した画面領域を一つの要素とし、それらを線で繋いで表示する。画面の表示の例が図２に示されている。この技術では、プログラムの実行を停止した時点におけるリスト構造の状態が表示されることに留意されたい
【０００５】
組み込みシステムのプログラムのデバッグにおける一つの問題は、プログラムの実行を自在に停止できない、即ち、特定のプログラム実行区間においてプログラムの停止が出来ない場合があることである。例えば、モーター制御プログラムの場合、モーターを動かす命令の直後でプログラムを停止すると、モーターが動き続けてしまい、モーターで制御している部品が損傷する可能性がある。したがって、組み込みシステムのプログラムのデバッグでは、特定のプログラム実行区間においてプログラムを停止させずにデバッグすることが必要になる。しかしながら、これは、プログラムの実行中におけるリスト構造の変化を把握することを困難にする。プログラムの実行を自在に停止できるシステムにおいては、所望のタイミングでプログラムの実行を停止させ、その時点におけるリスト構造の状態を例えば上述の技術を用いて逐次に把握することができる。しかし、特定のプログラム実行区間においてプログラムの停止ができない場合には、当該特定のプログラム実行区間の中間におけるリスト構造の状態の変化を知ることはできない。
【０００６】
このような背景から、（プログラムの停止時ではなく）プログラムの実行中におけるリスト構造の状態の変化を把握可能にする技術の提供が望まれる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００８−１４６３１０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
したがって、本発明の課題は、特定のプログラム実行区間においてプログラムの停止ができないようなシステムのプログラムの実行中におけるリスト構造の状態の変化を把握可能にする技術を提供することにある。
【課題を解決するための手段】
【０００９】
本発明の一の観点においては、デバッグ装置が、プログラム実行中におけるメモリアクセスを記録したメモリアクセス履歴を作成するメモリアクセス履歴作成手段と、前記メモリアクセス履歴を解析して、解析対象のリスト構造の状態が変化したタイミングを見つけ出すメモリアクセス履歴解析手段と、前記変化したタイミングにおける前記リスト構造の状態を再現するリスト構造再現手段と、前記再現されたリスト構造の状態を出力する出力手段とを具備する。
【００１０】
本発明の他の観点においては、デバッグ方法が、プログラムの実行中に発生したメモリアクセスを記録したメモリアクセス履歴を作成するステップと、前記メモリアクセス履歴を解析して、解析対象のリスト構造の状態が変化したタイミングを見つけ出すステップと、前記変化したタイミングにおける前記リスト構造の状態を再現するステップと、前記再現されたリスト構造の状態を出力するステップとを具備している。
【００１１】
本発明の更に他の観点においては、デバッグ用プログラムが、コンピュータを、プログラムの実行中におけるメモリアクセスを記録したメモリアクセス履歴を作成するメモリアクセス履歴作成手段と、前記メモリアクセス履歴を解析して、解析対象のリスト構造の状態が変化したタイミングを見つけ出すメモリアクセス履歴解析手段と、前記変化したタイミングにおける前記リスト構造の状態を再現するリスト構造再現手段と、前記再現されたリスト構造の状態を出力する出力手段として機能させる。
【発明の効果】
【００１２】
本発明によれば、特定のプログラム実行区間においてプログラムの停止ができないようなシステムのプログラムの実行中におけるリスト構造の状態の変化が把握可能になる。
【図面の簡単な説明】
【００１３】
【図１】Ｃ言語ソースの例を示す図である。
【図２】図１のＣ言語ソースのプログラムを実行したときに生成されるリスト構造の状態を表示する画面の例を示す図である。
【図３Ａ】本発明の一実施形態における、実行形式プログラムをデバッグする環境の例を示すブロック図である。
【図３Ｂ】本発明の一実施形態のデバッグ装置のハードウェア構成を示すブロック図である。
【図３Ｃ】本発明の一実施形態における、デバッガのソフトウェア構成を示すブロック図である。
【図４Ａ】本発明の一実施形態のデバッグ方法を示すフローチャートである。
【図４Ｂ】本発明の一実施形態のデバッグ方法を示すフローチャートである。
【図５】図１のＣ言語ソースのプログラムを１８行目(ｃｕｒ−＞ｎｕｍｂｅｒ＝１００１)まで実行したときのリスト構造の状態を示す図である。
【図６】図１のＣ言語ソースの１８行目の処理を実行したタイミングにおけるリスト構造の状態を再現する処理を説明する表である。
【発明を実施するための形態】
【００１４】
図３Ａは、本発明の一実施形態における、デバッグ装置１００を用いてプログラムデバッグを行うときの実行環境を示すシステム構成図である。デバッグ装置１００は、組み込みシステムのプログラムをデバッグするための装置であり、実行形式プログラム３０をターゲット（機器）４０にダウンロードし、実行形式プログラム３０の実行を制御する。実行形式プログラム３０には、構造体の変数がリスト構造であるかどうかを判断するためのデバッグ情報がコンパイラにより埋め込まれている。
【００１５】
図３Ｂは、本発明の一実施形態のデバッグ装置のハードウェア構成を示すブロック図である。本実施形態では、デバッグ装置１００が、コンピュータシステムとして構成されており、演算装置１（例えば、ＣＰＵ）とメモリ２と入力装置３（例えば、キーボード）と表示装置４と記憶装置５とを備えている。記憶装置５には、デバッガ１０がインストールされている。デバッガ１０は、実行形式プログラム３０のデバッグを行うためのプログラムである。演算装置１、メモリ２、入力装置３、及び記憶装置５を用いてデバッガ１０を実行することにより、実行形式プログラム３０のデバッグが行われる。
【００１６】
図３Ｃは、デバッガ１０のソフトウェア構成を示すブロック図である。デバッガ１０は、プログラム実行制御モジュール１１と、入力解析モジュール１２と、デバッグ情報解析モジュール１３と、メモリアクセス履歴情報解析モジュール１４と、画面出力制御モジュール１５とを備えている。
【００１７】
プログラム実行制御モジュール１１は、実行形式プログラム３０の実行、停止を制御し、また、ターゲット４０のＣＰＵの状態を取得する。入力解析モジュール１２は、入力装置３に与えられた、デバッグ装置１００への操作を解析する。デバッグ情報解析モジュール１３は、入力された実行形式プログラム３０に埋め込まれたデバッグ情報を解析し、メモリアクセス履歴情報解析モジュール１４に、構造体の型情報を渡す。
【００１８】
メモリアクセス履歴情報解析モジュール１４は、解析対象のリスト構造の状態が変化したタイミングを見つけ出し、変化したタイミングにおける該リスト構造の状態を再現する。このような処理を行う過程において、メモリアクセス履歴情報解析モジュール１４は、アドレス集合２１、データマップ２２及びメモリアクセス履歴２３を生成する。アドレス集合２１には、解析対象のリスト構造を構成しているアドレスが記述される。データマップ２２には、アドレス集合２１に含まれているアドレス全てについて、アドレスと当該アドレスの値がペアとして記述される。データマップ２２は、アドレスをキーとしたハッシュテーブルとして構成されている。メモリアクセス履歴２３は、配列に格納されており、プログラム実行中にターゲット４０において発生したメモリへの書き込みが、書き込みが行われたアドレスと書き込まれた値のペアとして記述される。これらのアドレス集合２１、データマップ２２及びメモリアクセス履歴２３は、記憶装置５に記憶される。
【００１９】
画面出力制御モジュール１５は、デバッグ情報解析モジュール１３及びメモリアクセス履歴情報解析モジュール１４から表示装置４に出力すべきデータ（例えば、リスト構造の状態が変化したタイミングにおけるリスト構造の状態を示すデータ）を受け取り、受け取ったデータに応じて表示装置４への出力を制御する。
【００２０】
図４Ａ、図４Ｂは、本発明の一実施形態において、デバッグ装置１００を用いて行われるデバッグ方法、即ち、実行形式プログラム３０をデバッグする手順を示すフローチャートである。ここで、本実施形態では、図１のＣ言語ソースの２０行目の直前までプログラムが実行された後、プログラムが中断されているものとする。
【００２１】
図４Ａを参照して、まず、プログラム開発者（ユーザ）は、入力装置３を用いて、解析対象のリスト構造のポインタ変数名を入力する（ステップＳ１００）。
【００２２】
デバッグ情報解析モジュール１３は、ポインタ変数名が指す構造体がリスト構造であるかを判断し、更に、リスト構造である場合にはプログラム中断時のリスト構造を解析する（ステップＳ１０１）。詳細には、ポインタ変数名が指す構造体からポイント型の構造体メンバ（図１の例ではｎｅｘｔ）を検出し、検出した構造体メンバ（ｎｅｘｔ）の値をターゲット４０のメモリから取得し、取得した構造体メンバ（ｎｅｘｔ）が指す構造体を特定する。これを繰り返すことにより、プログラム中断時のリスト構造を解析する。
【００２３】
続いて、メモリアクセス履歴情報解析モジュール１４は、アドレス集合２１とデータマップ２２に初期データを設定する。具体的には、メモリアクセス履歴情報解析モジュール１４は、プログラム中断時のリスト構造を構成しているポインタ変数と構造体のアドレスを初期データとしてアドレス集合２１に書き込む（ステップＳ１０２）。更にメモリアクセス履歴情報解析モジュール１４は、アドレス集合２１に記述されたアドレス全てについて、アドレスと、当該アドレスの値とをペアとしてデータマップ２２に書き込む（ステップＳ１０３）。
【００２４】
続いて、ユーザの操作により、実行形式プログラム３０が実行される（ステップＳ１０４）。実行中には、実行中に発生したメモリへの書き込み（以下、「メモリアクセス」という。）が、書き込みが行われたアドレス（書き込みアドレス）と書きこまれた値のペアとしてメモリアクセス履歴２３に保存される。
【００２５】
更に、デバッグを行うユーザにより、プログラムの実行が停止される（ステップＳ１０５）。
【００２６】
以下で行われる処理では、アドレス集合２１とメモリアクセス履歴２３とに保存されたデータをもとに、ステップＳ１００で入力されたポインタ変数名によって指定されたリスト構造の状態が変化したタイミングが解析される。更に、リスト構造の状態が変化したタイミングが検出されると、変化したタイミングにおけるリスト構造の状態が、アドレス集合２１とデータマップ２２とメモリアクセス履歴２３を用いて再現される。以下、詳細に説明する。
【００２７】
まず、メモリアクセス履歴情報解析モジュール１４においてメモリアクセス履歴２３が格納された配列のオフセット値を表わす変数Ｉｎｄｅｘが用意され、０が代入される（ステップＳ１０６）。
【００２８】
更に、図４Ｂに示されているように、メモリアクセス履歴情報解析モジュール１４は、メモリアクセス履歴２３に記憶されているＩｎｄｅｘ番目のメモリアクセスが存在するかどうかを確認し（ステップＳ１０７）、メモリアクセスが存在する場合には、当該メモリアクセスについて解析するために処理がステップＳ１０８に進む。以下、ステップＳ１０７で存在が確認されたメモリアクセスを解析対象メモリアクセスという。ステップＳ１０７でメモリアクセスが存在しないと判断されると、処理が終了する。
【００２９】
ステップＳ１０８では、メモリアクセス履歴情報解析モジュール１４は、解析対象メモリアクセス（即ち、メモリアクセス履歴２３のＩｎｄｅｘ番目のメモリアクセス）の書き込みアドレスと解析対象メモリアクセスで書き込まれた値をデータマップ２２に追加して、Ｉｎｄｅｘの値に１を加算する。データマップ２２に書き込みアドレスと値を追加する際、既に該書き込みアドレスと一致するメモリアクセスがデータマップ２２に存在する場合には、既にデータマップ２２に存在するメモリアクセスを削除してから追加を行う。このような処理によれば、データマップ２２には、解析対象メモリアクセス及びそれ以前のメモリアクセスによって書き込みが行われたアドレスと、該アドレスのそれぞれの値が保存されることになる。
【００３０】
続いて、メモリアクセス履歴情報解析モジュール１４は、アドレス集合２１に解析対象メモリアクセスの書き込みアドレスが含まれているかを確認する（ステップＳ１０９）。アドレス集合２１に該書き込みアドレスが含まれている場合、解析対象メモリアクセスによってリスト構造の状態が変化したことを意味している。そこで、ステップＳ１０９においてアドレス集合２１に該書き込みアドレスが含まれていると判断された場合には、変化したタイミングにおけるリスト構造の状態を再現する処理（ステップＳ１１０〜Ｓ１１７の処理）が行われる。一方、含まれてないと判断された場合、処理がステップＳ１０７に戻る。
【００３１】
変化したタイミングにおけるリスト構造の状態を再現する処理においては、次のような処理が行われる。
まず、ステップＳ１１０では、解析対象メモリアクセスの書き込みアドレスを格納する構造体型（図１の例では構造体型ｓｔｒｕｃｔ  ｄａｔａ）へのポインタ型の変数ｐが用意され、ステップＳ１００で入力された対象変数名で示された変数のアドレスが代入される。更に、リスト構造の要素の集合を格納する変数ｒｅｓｕｌｔ、及び、アドレスの集合を格納する変数ｓｅｔが用意され、空の集合が代入される。変数ｒｅｓｕｌｔは、リスト構造を構成する構造体の構造体メンバの値を格納する変数として定義される。
【００３２】
メモリアクセス履歴情報解析モジュール１４は、変数ｓｅｔに変数ｐのアドレスを追加する（ステップＳ１１１）。
【００３３】
更に、メモリアクセス履歴情報解析モジュール１４は、変数ｐがリスト構造の終端を表わす値（ＮＵＬＬ）であるかを判断する（ステップＳ１１２）。変数ｐが終端を表わす値でない場合には、メモリアクセス履歴情報解析モジュール１４は、変数ｐのアドレスと変数ｐが指している構造体のアドレスが全てデータマップ２２に存在しているかを確認し（ステップＳ１１３）、存在していない場合には、処理がステップＳ１０７に戻る。
【００３４】
一方、変数ｐのアドレスと変数ｐが指している構造体のアドレスが全てデータマップ２２に存在している場合、メモリアクセス履歴情報解析モジュール１４は、データマップ２２から変数ｐが指している構造体のアドレスをキーとして値を取得し、構造体の値として変数ｒｅｓｕｌｔに追加する（ステップＳ１１４）。
【００３５】
更に、メモリアクセス履歴情報解析モジュール１４は、変数ｓｅｔに変数ｐが指している構造体のアドレスを追加する（ステップＳ１１５）。
【００３６】
更に、メモリアクセス履歴情報解析モジュール１４は、変数ｐのアドレスによって特定される構造体を取得し、取得した構造体の構造体メンバのうち、当該構造体に連結されている構造体のアドレスを示す構造体メンバ（図１の例ではｎｅｘｔ）の値を取得して変数ｐに代入する（ステップＳ１１６）。ステップＳ１１６が行われた後、処理はステップＳ１１２に戻る。
【００３７】
ステップＳ１１２〜Ｓ１１６の処理が繰り返して行われると、最終的には変数ｐがリスト構造の終端を表わす値になり、ステップＳ１１２において変数ｐの値がリスト構造の終端を表わす値（ＮＵＬＬ）になる。変数ｐの値がリスト構造の終端を表わす値（ＮＵＬＬ）になると、処理がステップＳ１１７に移行する。
【００３８】
ステップＳ１１７では、画面出力制御モジュール１５が、変数ｒｅｓｕｌｔに格納された構造体メンバの値を、表示装置４を用いて表示する。以上の手順により、解析対象メモリアクセス直後の（即ち、リスト構造の状態の変化直後の）リスト構造の状態が再現され、表示装置４に表示される。本実施形態では、リスト構造の状態を出力する出力手段として表示装置４が用いられているが、他の出力装置（プリンタなど）が使用されてもよい。更に、メモリアクセス履歴情報解析モジュール１４がアドレス集合２１を変数ｓｅｔの値に置き換える。これにより、アドレス集合２１は、リスト構造の状態を変化させる解析対象メモリアクセスが発生した時点でリスト構造を構成しているアドレスが全て入る。続いて、処理がステップＳ１０７に戻る。
【００３９】
ステップＳ１０７〜Ｓ１１７の処理が、メモリアクセス履歴２３に格納されている全てのメモリアクセスに対して行われる。これにより、リスト構造の状態が変化した各タイミングにおけるリスト構造の状態が表示装置４に表示される。
【００４０】
図５、図６は、ステップＳ１１０〜Ｓ１１７において行われるリスト構造の状態を再現する処理の一例を示す図である。図５は、図１のＣ言語ソースの１８行目(ｃｕｒ−＞ｎｕｍｂｅｒ＝１００１)までプログラムを実行したときのリスト構造の状態を示している。以下、図６を参照しながら、１８行目の処理を実行したタイミング、即ち、値１００１がアドレス０ｘ１１２に書き込まれてリスト構造の状態が変化したタイミングにおけるリスト構造の状態を再現する処理を説明する。ここで、ステップＳ１００においてユーザが入力したポインタ変数名がｈｅａｄであり、ポインタ変数ｈｅａｄのアドレスがアドレス０ｘ１０であり、アドレス０ｘ１０にリスト構造を構成する最初の構造体のアドレスである０ｘ１００が代入されているとして説明を行う。
【００４１】
まず、ステップＳ１１０においては、変数ｐに０ｘ１０が代入され、変数ｓｅｔ、ｒｅｓｕｌｔには空の集合が代入される。続いて、ステップＳ１１１において変数ｐのアドレス、即ち、０ｘ１０が変数ｓｅｔの集合に追加される。
【００４２】
以下、ステップＳ１１４〜Ｓ１１６が変数ｐの値がＮＵＬＬ（０ｘ０）になるまで繰り返される。より具体的には、ステップＳ１１４の実行により、変数ｐに格納されているアドレス（０ｘ１０）の値（０ｘ１００）によって特定される構造体の構造体メンバの値［ｂｏｏｋ，１０００］がデータマップ２２から取り出され、変数ｒｅｓｕｌｔに追加される。
【００４３】
続いて、ステップＳ１１５の実行により、変数ｐに格納されているアドレス（０ｘ１０）の値（０ｘ１００）によって特定される構造体を構成するアドレス（０ｘ１００、０ｘ１０２、０ｘ１０４）が変数ｓｅｔの集合に追加される。
【００４４】
更に、ステップＳ１１６の実行により、変数ｐに格納されているアドレス（０ｘ１０）の値（０ｘ１００）によって特定される構造体の、当該構造体に連結される構造体を示す構造体メンバ（ｎｅｘｔ）のアドレス、即ち、０ｘ１０４が代入される。
【００４５】
続いて、ステップＳ１１４の２回目の実行により、変数ｐに格納されているアドレス（０ｘ１０４）の値（０ｘ１１０）によって特定される構造体の構造体メンバの値［ｋｅｅｐ，１０００］が変数ｒｅｓｕｌｔに追加される。
【００４６】
続いて、ステップＳ１１５の２回目の実行により、変数ｐに格納されているアドレス（０ｘ１０４）の値（０ｘ１１０）によって特定される構造体を構成するアドレス（０ｘ１１０、０ｘ１１２、０ｘ１１４）が変数ｓｅｔの集合に追加される。
【００４７】
更に、ステップＳ１１６の２回目の実行により、変数ｐに格納されているアドレス（０ｘ１０４）の値（０ｘ１１０）によって特定される構造体の、当該構造体に連結される構造体を示す構造体メンバ（ｎｅｘｔ）のアドレスが代入される。ここで、アドレス（０ｘ１０４）の値（０ｘ１１０）によって特定される構造体に連結される構造体は存在せず、よって、連結される構造体を示す構造体メンバの値はＮＵＬＬ（０ｘ０）であるから、変数ｐにＮＵＬＬ（０ｘ０）が代入される。変数ｐの値がＮＵＬＬであることから、リスト構造の状態の再現が完了したことが分かる。
【００４８】
以上に説明されているように、本実施形態のデバッグ方法では、リスト構造の状態が変化したタイミングが解析され、更に、変化したタイミングにおけるリスト構造の状態が再現されて表示される。ここで、上記のようなデバッグ方法では、リスト構造の状態が変化したタイミングの直後でプログラムの実行を中断しなくても、事後的に、リスト構造の状態が変化した時点におけるリスト構造の状態を再現できることに留意されたい。このようなデバッグ方法によれば、特定のプログラム実行区間においてプログラムの停止ができないようなシステムのプログラムの実行中におけるリスト構造の状態の変化を把握することができる。
【符号の説明】
【００４９】
１００：デバッグ装置
３０：実行形式プログラム
４０：ターゲット
１：演算装置
２：メモリ
３：入力装置
４：表示装置
５：記憶装置
１０：デバッガ
１１：プログラム実行制御モジュール
１２：入力解析モジュール
１３：デバッグ情報解析モジュール
１４：メモリアクセス履歴情報解析モジュール
１５：画面出力制御モジュール
２１：アドレス集合
２２：データマップ
２３：メモリアクセス履歴
【図１】
2012088798.tif 000003
【図２】
2012088798.tif 000004
【図３Ａ】
2012088798.tif 000005
【図３Ｂ】
2012088798.tif 000006
【図３Ｃ】
2012088798.tif 000007
【図４Ａ】
2012088798.tif 000008
【図４Ｂ】
2012088798.tif 000009
【図５】
2012088798.tif 000010
【図６】
2012088798.tif 000011