JPH06222958A - プログラム異常検出装置 - Google Patents

プログラム異常検出装置

Info

Publication number
JPH06222958A
JPH06222958A JP5008511A JP851193A JPH06222958A JP H06222958 A JPH06222958 A JP H06222958A JP 5008511 A JP5008511 A JP 5008511A JP 851193 A JP851193 A JP 851193A JP H06222958 A JPH06222958 A JP H06222958A
Authority
JP
Japan
Prior art keywords
program
variable
area
pointer
source program
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.)
Granted
Application number
JP5008511A
Other languages
English (en)
Other versions
JP3101458B2 (ja
Inventor
Yotaro Kitadate
陽太郎 北館
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP05008511A priority Critical patent/JP3101458B2/ja
Publication of JPH06222958A publication Critical patent/JPH06222958A/ja
Application granted granted Critical
Publication of JP3101458B2 publication Critical patent/JP3101458B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【目的】 ポインタの誤用に起因するプログラム異常を
検出するプログラム異常検出装置に関し、プログラム異
常を容易に検出可能にする。 【構成】 デバッグ対象のソースプログラム11を入力
し、このプログラム11中の変数に対応した変数領域を複
数の配置方法で複数のデータ部に割り付けて複数のデー
タ部を生成しプログラム11中の処理記述を翻訳して手続
き部を複数生成することで、プログラムから翻訳された
手続き部とデータ部を含んだ複数のオブジェクトプログ
ラム 12,13を生成する翻訳手段19と、主記憶領域2と、
プログラム11で予めブレークポイントを設定しておき主
記憶領域2にこれら複数のプログラム12,13をロードし
て並行して実行し、夫々のプログラム 12,13の実行がプ
ログラム11上の夫々同じ地点に至るか、又は少なくとも
一方の実行が停止するときにプログラム11上同一の変数
に対応する上記複数のプログラム 12,13内の変数同士を
夫々比較する実行・比較手段18を有する。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明はプログラム異常検出装置
に係り、特に、ポインタの誤用に起因するプログラム異
常を検出するプログラム異常検出装置に関する。
【0002】電子計算機のプログラムのデバッグ方法と
しては、現在、種々様々な方法が行われている。しか
し、発生頻度は低いものの、仮に発生した場合に発見困
難な微妙なプログラム異常は、デバッグ作業の効率を悪
くする。そして、このようなプログラム異常の一つであ
る、ポインタの誤用に起因するプログラム異常を容易に
検出するツールが要望されている。
【0003】
【従来の技術】手続き型プログラムの実行は、プログラ
ムに記述された処理手続きにしたがって、プログラムで
定義された変数から値を読出して演算を行い、演算結果
を変数に書き込むことを繰り返し行うことで進行する。
また、変数値や演算結果の値に応じて、次に実行する処
理部分が決定される。
【0004】したがって、処理の途中で、プログラマの
意図しなかった変数に値が書き込まれると、以後の複数
の変数値またはプログラムの実行順序はプログラマの意
図しない経過を辿り、たとえばプログラムが異常終了し
たり、誤った結果が出力されるなどのプログラムエラー
の原因となる。
【0005】プログラムに定義された変数は翻訳プログ
ラムによってデータ部に変数領域を割り付けられ、ま
た、処理手続きは、変数領域にアクセスしつつ処理をす
る手続き部として生成される。データ部と手続き部はプ
ログラムの実行時に主記憶領域にロードされ、CPU
(セントラルプロセッシングユニット;中央演算処理装
置)によって実行される。
【0006】また、C言語などのプログラミング言語で
は、変数として自動変数も存在する。これは、プログラ
ム内の関数(サブルーチン)が呼ばれたときに、一時的
に主記憶領域上の自動変数領域の一部を獲得し、そこを
その関数の変数領域として使用する。この関数の処理が
終了するとその変数領域は開放され、以後は他の関数の
自動変数領域として使用可能となる。
【0007】この自動変数はローディングされた領域以
外を使用するが、各関数に対応する自動変数の配置方法
は翻訳プログラムにより決定される。よって、広義に
は、自動変数領域もデータ部の一つと考えることにす
る。
【0008】また、プログラムによっては、実行中に主
記憶領域上の作業領域を獲得し、獲得した作業領域にア
クセスしつつ処理を進める。この獲得処理は何度も行う
ことができ、そのたびに新しい領域が割り当てられる。
またこの領域の一部が開放された後は、その部分はその
後の獲得要求に対して割り当てられることになる。
【0009】C言語においてはさらにポインタと呼ばれ
る変数があり、このポインタを使用することで、ポイン
タに格納されているアドレス値に存在する主記憶領域上
の領域にアクセスすることができる。したがって、もし
仮に、本来とは異なった値がポインタに格納されたとす
ると意図しない領域にアクセスすることになり、プログ
ラムエラーの原因となる。
【0010】なお、この主記憶領域上の領域はポインタ
が指す領域と呼ばれ、狭義のデータ部の変数領域、自動
変数領域、主記憶領域の作業領域などをポインタが指す
領域とすることが可能である。
【0011】プログラムエラーの原因を調査してプログ
ラムを修正する作業はデバッグと呼ばれており、プログ
ラムエラーの原因の調査方法には、大別して、処理手続
きを処理順に辿っていく方法と、誤った値を生成した原
因を逆に辿っていく方法の2つがある。
【0012】前者はプログラムの手続き記述に沿ってデ
ータの条件を様々に仮定しながら、処理経過を辿ってプ
ログラムの異常発生箇所を発見しようとするものであ。
また後者は、残された変数の値から各変数値がどのよう
に生成されていったかを推定して異常な変数値を見つけ
ることで、異常発生箇所を発見しようとするものであ
る。
【0013】デバッグでは、通常、これら2つの方法が
組み合わされて行われる。しかし、多くの処理手続きを
辿る作業は効率が悪く、また、多くの変数の中から異常
な値を見つけ出すことも困難であるため、初めに処理手
続きの範囲を絞り込むのが一般的である。
【0014】ところで、プログラムが異常終了した場合
にシステムによって自動的に出力される情報として、メ
モリダンプ情報がある。これにより、デバッグを行う作
業者は、プログラムの処理部分を調べ各処理部分の実行
の痕跡を残す変数を決定したのち、メモリダンプ情報を
見ることによって処理部分の軌跡を推定することができ
る。
【0015】また、メモリダンプ情報には、通常CPU
が最後に実行しようとしていた命令アドレスが含まれる
ため、この命令アドレス値に基づいてソースプログラム
上の行番号を知ることもできる。
【0016】あるいは、デバッガというプログラムを実
行することにより、停止したプログラムの主記憶領域上
での内容を調べることもある。
【0017】ところが、メモリダンプが出力された時点
では既に変数値が変更されていて、原因の箇所を発見で
きない場合がある。この場合、ソースプログラムにデバ
ッグ行を追加したり、デバッガを使用する方法が用いら
れる。
【0018】デバッグ行は、ソースプログラム上にいく
つかの特定の変数値や、実行した処理手続き上の箇所を
意味するデータを出力する処理を付加するものである。
デバッグ行を付加したソースプログラムを改めて翻訳し
てこれを実行し、出力データの中に期待と異なる値が見
い出された場合、その出力箇所を求めることで異常の発
生箇所が推定される。
【0019】しかし、デバッグ行を付加する方法では、
エラーに関係した変数や処理部分を発見するまでに、デ
バッグ行を変更してソースプログラムを翻訳しては実行
する作業を幾度も繰り返さなければならないことがあ
る。
【0020】またデバッガを使用する場合、初めに調査
対象のプログラムをロードし、そのプログラム上の幾つ
かの地点にブレークポイントを設定して実行させる。そ
していずれかのブレークポイントで停止したときに、デ
バッガに指示して停止したときの行番号やソースプログ
ラムの部分をディスプレイに表示し、変数の値もディス
プレイに表示する。
【0021】しかし、処理手続きが複雑な場合には、作
業者の記憶力の限界から、上記のような会話処理によっ
て異常発生箇所を追求することが困難なことがある。そ
こで、プログラムの異常発生箇所をある程度推定できた
ら次にソースプログラム、或いはそのプログラムの設計
書を調べて、処理手続きに沿ってその正当性を調べ、ま
た設計通りにプログラムが作成されているかを調べるこ
とになる。もしそれで原因がつかめなければ、プログラ
ム上でさらに範囲を細分して上記の調査を繰り返し行
う。
【0022】このように処理手続きに沿って調べる方法
では、プログラム設計上の誤りや処理の内容の誤りは検
出することができる。しかしながら、たとえば変数名の
誤記などの細かいミスによって発生するエラーを発見す
ることは困難である。
【0023】このような発見困難なミスの一つに、以下
に説明するポインタに関するミスがある。すなわち、ポ
インタが格納し得るアドレス値には特に制限がないた
め、誤って、処理上全く無関係な処理部分の変数領域を
ポインタが指すことがあり得る。
【0024】ポインタに誤ったアドレス値を設定する原
因としては、たとえば、意図しない変数のアドレスを格
納した場合、アドレス値を格納せずに使用したため変数
の初期値やゴミの値を使用することになった場合、関数
呼出しにおいてポインタをふくむ引数の順序を間違って
指定したため関数に誤った値が渡された場合などがあ
る。
【0025】また、ポインタに整数を加算したり減算し
たことによって、本来の変数領域の外を指すことになる
場合がある。また、ポインタの型、すなわちポインタが
指すデータの型が正しくないと、ポインタに整数を加算
したり減算した結果、目的とは異なるアドレス値となる
場合もある。
【0026】また、ポインタがあるとき自動変数を指
し、その自動変数領域が開放されたのちそのポインタを
使用すると、使用されていない領域にアクセスしたり、
無関係の関数が使用している自動変数領域にアクセスす
ることがある。さらに、実行中に獲得したメモリ上の作
業領域内のアドレスをポインタに格納して使用し、その
領域を開放したのち再度そのポインタ値を使用すれば、
やはり同じようなことが起こる。
【0027】このように、ポインタの誤用の可能性は多
く、しかも誤用した場合、通常は関数を呼び出してから
復帰するまでの間に、その関数には無関係な変数の値が
突然変化したように見えるため、前述したように処理手
続きを処理順にしたがって論理的に辿っていく方法で誤
り箇所を見つけることが困難である。また、誤った値を
生成した原因を辿っていく方法でも見つけることは困難
である。
【0028】そこで、ポインタの誤用を発見するには、
変数の値の異常の発生の時点を発見する方法によってい
た。
【0029】
【発明が解決しようとする課題】しかしながら、上記し
た従来のポインタの誤用によるプログラム異常の検出方
法によれば、デバッグ作業に膨大な時間と労力を必要と
する上に、この結果検出できる誤りは小さなものであ
り、プログラマにとっては極めて困難な作業であった。
【0030】ポインタの異常をその発生時点で検出する
方法としては、実行前に各ポインタが指し得る変数のア
ドレスやアドレス範囲を指定しておき、実行中に自動的
に各ポインタの値を調べて、指定された範囲外を指して
いたらその旨を出力する方法も考えられる。この方法
は、配列指標が配列の範囲を越えた値になったかどうか
をチェックする方法に類似したものである。しかし、ポ
インタの場合には実行中に様々な変数を指すことが多
く、実行前に各ポインタが指し得る変数のアドレスやア
ドレス範囲を予め指定する作業は多大な時間と労力を必
要とする。したがって、この方法も実際には不可能であ
る。
【0031】本発明は上記の点に鑑みてなされたもので
あって、ポインタの誤用によるプログラム異常を容易に
検出し得るプログラム異常検出装置を提供することを目
的とする。
【0032】
【課題を解決するための手段】そこで本発明では、ポイ
ンタ値とそれが指している変数との関連は、オブジェク
トプログラムを生成する際の変数の割り付け方に依存
し、したがって、ポインタの誤用を含むプログラムに対
して、翻訳時の変数の割り付け方を変更すれば、誤用さ
れたポインタが指す変数は変化し、その結果、そのポイ
ンタが指す領域は別の変数となり、そのポインタが指す
領域の値やプログラム内のいずれかの変数の値は異なっ
たものとなると期待できることに着目して、上記の問題
を解決するために、図1の原理図のとおり構成した。
【0033】すなわち、被デバッグプログラムとしてソ
ースプログラム11を入力し、ソースプログラム11中
の変数に対応した変数領域を複数の配置方法で複数のデ
ータ部に割り付けつつ上記複数のデータ部を生成し、か
つ、ソースプログラム11中の処理記述を翻訳して手続
き部を複数生成することで、ソースプログラムから翻訳
された手続き部とデータ部を含んだ複数のオブジェクト
プログラム12,13を生成する翻訳手段19と、翻訳
手段19により生成された複数のオブジェクトプログラ
ム12,13がロードされる主記憶領域2と、ソースプ
ログラム11で予めブレークポイントを設定しておき、
主記憶領域2に上記複数のオブジェクトプログラム1
2,13をロードして並行して実行し、それぞれのオブ
ジェクトプログラム12,13の実行がソースプログラ
ム11上のそれぞれ同じ地点に至るか、あるいは、少な
くとも一方の実行が停止するときに、ソースプログラム
11上同一の変数に対応する上記複数のオブジェクトプ
ログラム12,13内の変数どうしをそれぞれ比較し、
すべての変数どうしの値が等しかった場合は実行を再開
し、そうでない場合は実行を打ち切る実行・比較手段1
8とを有する構成とした。
【0034】
【作用】上記構成の本発明によれば、翻訳手段19は変
数領域を複数の配置方法で複数のデータ部に割り付ける
よう作用し、実行・比較手段18は、並行される複数の
オブジェクトプログラム12,13の実行がそれぞれソ
ースプログラム11上の同じブレークポイントに至る
か、あるいは少なくとも一方が停止するときに、ソース
プログラム11上同一の変数に対応するそれぞれのオブ
ジェクトプログラム12,13内の変数同志を比較し、
すべて値が等しかった場合は実行を再開し、異なる場合
は実行を打ち切るよう作用する。
【0035】
【実施例】図2は本発明の一実施例の全体構成図であ
る。図2において、1はCPU、2はOS(オペレーテ
ィングシステム)領域3と利用者プログラム領域4を有
する主記憶領域であり、OS領域3にはOSプログラム
(図中、OS Prog.と記す)5が、利用者プログラム領
域4にはユーティリティプログラムが格納される。ま
た、6はキーボードディスプレイ装置、7は外部記憶装
置をそれぞれ示す。
【0036】外部記憶装置7の記憶領域8には、初め
に、本発明に係る翻訳手段である翻訳プログラム9及び
実行・比較手段である実行・比較プログラム10が格納
されると共に、利用者がたとえばC言語により作成した
ソースプログラム(図中、S Prog.と記す)11が被デバ
ッグプログラムとして格納される。
【0037】ここで、図3は本実施例の処理の流れを概
略的に示す図であり、図2及び図3を参照して処理の流
れを説明する。
【0038】すなわち、CPU1に制御されて翻訳プロ
グラム9が実行されると、ソースプログラム11が2つ
のオブジェクトプログラム(図中、O Prog.と記す)12
及び13に翻訳されて記憶領域8に格納される。これら
のオブジェクトプログラム12及び13は、データ部
と、CPU命令からなる手続き部とを含み、またシンボ
ルテーブルと行番号テーブルからなるデバッグ情報12
a及び13aを有している。
【0039】このシンボルテーブルは、変数名と変数の
型と各オブジェクトプログラム12及び13のデータ部
における相対アドレスと、変数域が狭義のデータ部か自
動変数領域のいずれに割り当てられるかを示す記憶区分
とを各変数名毎に示す対応表である。また、行番号テー
ブルは、ソースプログラム11の行番号と、その行の先
頭に対応するオブジェクトプログラムの機械語命令の手
続き部における相対アドレスとを各行番号毎に示す対応
表である。
【0040】これらのオブジェクトプログラム12及び
13は、互いに異なる変数割り付け方法で生成される。
この変数割り付けは、たとえば図4に示すように、ソー
スプログラム11を翻訳プログラム9の一例であるコン
パイラ9aにより翻訳してオブジェクトプログラム12
又は13を生成する際に、変数配置モードを設定するパ
ラメータ14をコンパイラ9aの起動時にそれぞれ異な
る値に設定することで行われる。
【0041】たとえば、オブジェクトプログラム12で
は変数領域のアドレス値の小さい方から、オブジェクト
プログラム13では大きい方から順に各変数の領域が割
り付けられる。
【0042】図2及び図3に戻って説明するに、オブジ
ェクトプログラム12及び13が生成されると、実行・
比較プログラム10がOSプログラム5に依頼すること
で、各プログラム9,10,12,13を主記憶領域2の利用
者プログラム領域4に格納してオブジェクトプログラム
12及び13を並行して実行し、実行途中にブレークポ
イントで停止させて各オブジェクトプログラム12及び
13の変数の値を比較する。
【0043】ここで、上記の「並行して」の意味は、必
ずしも時間的に同時にという意味に限定されるものでな
く、たとえばマルチタスクのようにCPU1が時分割処
理によって順次実行してもよいし、またブレークポイン
トで停止させつつ交互に実行してもよい。なお、翻訳プ
ログラム9と実行・比較プログラム10の両プログラム
は、図2のように同時に主記憶領域2に格納しなくとも
よく、順次格納して処理してもよい。
【0044】オブジェクトプログラム12及び13の変
数の値を比較した結果、ソースプログラム11上では同
一の値であり両オブジェクトプログラム12及び13上
での値が異なる変数を検出した場合は、両オブジェクト
プログラムの実行を打ち切る。そして、その変数名と値
を不一致変数表15として出力し、キーボードディスプ
レイ装置6に不一致変数表15を表示する。
【0045】ここで、図5は利用者プログラム領域の構
成図であり、同図及び次に示す図6を参照してオブジェ
クトプログラムの自動変数領域について説明する。
【0046】図5に示す利用者プログラム領域4は主記
憶領域(2)の一部であり、手続き部と協議のデータ部
がローディングされる領域41と作業領域42と自動変
数領域43とからなる。自動変数領域43は関数(サブ
ルーチン)の呼出しに応じて設定される領域であり、関
数が新たに呼び出されたり復帰することでその大きさが
変動する。
【0047】図6は、この自動変数領域の大きさの変動
を説明する図である。
【0048】すなわち、同図(A)に示すように、まず
関数Aが呼び出され、関数Aから関数Bが呼び出され、
さらに関数Bから関数Cが呼び出されたのちに、関数
C、関数Bの順に復帰した場合、これに応じて自動変数
領域43は、同図(B)のとおりに関数Aの領域44に
関数Bの領域45が追加され、さらに関数Cの領域46
が追加されて大きさが増大したのちに、関数C、関数B
それぞれの領域46,領域45の順に削減されて小さく
なる。
【0049】次に、図7乃至図13を参照して、本発明
の一実施例について具体的に説明する。
【0050】図7はデバッグされるソースプログラム1
1の一例の具体的なソースリストを示す図であり、C言
語によるプログラムの一例を示している。なお、このソ
ースプログラムは、後述するとおり誤りを含んでいる。
【0051】図7に示すとおり、1行〜3行において、
3つの変数i,ary〔4〕、及びpが定義されてい
る。すなわち、変数iは4バイトからなる整数であり、
変数pは文字を指すポインタであり、pの変数領域は4
バイトからなる。ただし、pの指す領域は1バイトであ
る。
【0052】また、C言語では文法上aryのような配
列は変数とは別のものとされるが、本実施例では簡単の
ために1つの変数とみなして説明する。この配列ary
は4個の要素からなり、各要素は1バイトの文字からな
る。よって、配列aryは全体で4バイトからなる。
【0053】なお、このプログラムに記述された処理の
具体的な内容については、さらに後述する。
【0054】また、図8は、図7のソースプログラムを
翻訳プログラム9によって2つのオブジェクトプログラ
ム12及び13に翻訳した際の、それぞれのプログラム
の変数の割り付けを示す図である。
【0055】図8(A)はオブジェクトプログラム12
の変数配置であり、ソースプログラムの記述の順にアド
レス値が小さいほう(2000番地)から大きいほう(2011
番地)へ各変数i,ary,pに4バイトづづ割り付け
られる。
【0056】また、図8(B)はオブジェクトプログラ
ム13の変数配置であり、ソースプログラムの記述の順
にアドレス値が大きいほう(4011番地)から小さいほう
(4000番地)へ各変数i,ary,pに4バイトづづ割
り付けられる。
【0057】したがって、変数iの値が4になるとポイ
ンタpは配列aryの領域外を指すことになり、オブジ
ェクトプログラム12ではポインタp自身の一部を指し
このときに、後述する図7のソースプログラムの繰り返
し部分を実行すると、ポインタpの内容が壊れる。
【0058】またオブジェクトプログラム13では、メ
モリ上で配列aryに続いて変数iが存在する。そのた
め、iが4になると、繰り返し部分を実行することによ
って変数iの一部分が壊れることになる。したがって、
この直後においてオブジェクトプログラム12とオブジ
ェクトプログラム13における変数pや変数iの値がそ
れぞれ食い違うことになる。
【0059】なお、本実施例では、図5の主記憶領域
(2)のうち領域41のデータ部に各変数が割り付けら
れたものとする。自動変数領域43にも割り付けられた
変数に対しても可能であるが、この場合には自動変数領
域43中で割り当てられた領域のアドレスと、自動変数
の割り当てられて領域中での相対アドレスをもとにした
アドレス値の計算が必要になる。前者のアドレスはたと
えば常にCPUの特定レジスタに格納されており、後者
のアドレスは、オプジェクトプログラム内のシンボルテ
ーブルに記入されている。
【0060】ここで、図9及び図10は実行・比較プロ
グラム10による処理の流れを示すフローチャートであ
り、両図はI及びIIにおいて連続する図である。
【0061】実行・比較プログラム10が実行される
と、初めに、図9のステップS(以下、Sと記す)90
において、OSプログラム5に依頼して子プロセスA及
びBを生成する。これにより、主記憶領域の利用者プロ
グラム領域4にオブジェクトプログラム12とオブジェ
クトプログラム13の領域が確保され、またOS領域3
に各子プロセスを管理するための領域が確保される。
【0062】続いてS91において、OSプログラム5
に依頼して、子プロセスAにオブジェクトプログラム1
2をロードし、実行直前の状態で停止させる。続くS9
2において、同様に子プロセスBにオブジェクトプログ
ラム13をロードし、実行直前の状態で停止させる。
【0063】続いてS93において、OSプログラム5
に依頼して、各オブジェクトプログラム12及び13の
主記憶領域2上での手続き部と固定データ部のそれぞれ
実際の開始アドレスを計算して求める。
【0064】続いてS94において、オブジェクトプロ
グラム12と13のデバッグ情報のシンボルテーブルに
基づいて、各変数の変数名、変数の型、データ部内相対
アドレス、サイズなどを求めて変数対応表を作成する。
【0065】図11は変数対応表の一例を示す図であ
り、図7のソースプログラム11に対応したオブジェク
トプログラム12とオブジェクトプログラム13の変数
対応表を示している。この変数対応表は、図7及び図8
に基づいて説明したことから明らかなとおり、図示のよ
うになる。ただし、翻訳プログラムが定めた変数アドレ
スと、プログラムがローディングされたときに決まる変
数アドレスが食い違うことがあるが、その補正の方法は
周知のことであるのでここではその説明を省略する。
【0066】図9に戻って説明するに、変数対応表を作
成すると続くS95において、オブジェクトプログラム
12の中のデバッグ情報の前述した行番号テーブルを参
照して、ソースプログラム11中の手続きの各行の先頭
に対応するオブジェクトプログラム12内の命令の手続
き部内相対アドレスを求めて、求めた相対アドレスに、
オブジェクトプログラム12の手続き部の主記憶領域2
上の開始アドレスを加えることによって主記憶領域2上
の命令アドレスに変換し、そのアドレスにブレークポイ
ントを設定する。
【0067】すなわち、そのアドレスに存在する命令を
退避し、その位置に割り込みを発生させるための命令を
書き込む。
【0068】続いてS96において、S95と同様に行
番号テーブルを参照して、オブジェクトプログラム12
の手続き部の各行の先頭命令にブレークポイントを設定
する。
【0069】それぞれのブレークポイントを設定する
と、まずS97において、オブジェクトプログラム12
の実行を開始し、この実行が設定されたブレークポイン
トで停止するか、あるいは、プログラムがブレークポイ
ントに至らずに正常に終了するか異常に終了して停止す
るのを待つ。
【0070】オブジェクトプログラム12の実行が停止
すると、続くS98において、オブジェクトプログラム
13の実行を開始し、同様にオブジェクトプログラム1
3の実行が停止するのを待つ。
【0071】オブジェクトプログラム13の実行が停止
すると、続くS99において、図11に示した変数対応
表の先頭を読みに行く。
【0072】そして、続くS100において、変数対応
表の次の要素を読み出すことにより、オブジェクトプロ
グラム12及びオブジェクトプログラム13における対
応する変数のアドレスとサイズを求める。
【0073】このS100の処理において、変数対応表
が最後(at the end)となり要素がなかった場合には、
S101の処理に進む。変数対応表がまだ最後ではなく
(OK)要素があった場合には、図10のS102以降
の処理に進む。
【0074】すなわち、まずS102において、OSプ
ログラムに依頼して、その変数のオブジェクトプログラ
ム12における変数アドレスより変数値を読み出し、同
様に続くS103において、オブジェクトプログラム1
3における変数アドレスより変数値を読み出す。
【0075】両オブジェクトプログラム12及び13に
おける変数値を読み出すと、S104において、変数対
応表の型を参照してその変数がポインタであるか否かを
判断する。その変数が一つのポインタでない(No)、通
常の変数である場合はS105の処理に進み、変数対応
表のサイズと開始アドレスをもとに主記憶領域2にアク
セスしてそれらの変数値を求め、それらが等しいか否か
比較する。
【0076】そして、両オブジェクトプログラム12及
び13における変数値がそれぞれ等しければ(Yes) 、
プログラムに誤りは発生していないのでS100に戻っ
て変数対応表の次の要素を取り出し、以下、同様に繰り
返す。一方、両オブジェクトプログラム12及び13に
おける変数値がそれぞれ異なっていれば(No)、続くS
106においてその変数名とそれぞれの値をキーボード
ディスプレイ装置に表示する。
【0077】ところで、S104においてその変数がポ
インタである(Yes) と判断された場合は、続いてS1
07において、それらのポインタの値がともに翻訳プロ
グラム9で設定した初期値のままであるか否かを判断す
る。
【0078】そして、たとえば、それらがともに初期値
0のままであれば(Yes) 、そのポインタの値は一致し
ているとみなす。すなわち、プログラムに誤りは発生し
ていないのでS100に戻り、変数対応表の次の要素を
取り出して、以下、同様に処理を繰り返す。
【0079】また、S107において、それらのポイン
タの値の少なくとも一方が初期値でない(No)場合はS
108に進み、オブジェクトプログラム12においてそ
のポインタが初期値でない場合、指している領域の値を
主記憶領域2にアクセスして求める。次にS109にお
いても同様に行う。そして、S110においてその値を
比較する。
【0080】また、比較の方法として、ポインタが他の
変数を指している場合、両者が対応する変数をそれぞれ
指しているかを判定することもできる。この場合は、S
108及びS109において、そのポインタが格納して
いるアドレス値を占めている変数を変数対応表より求め
る。
【0081】あるいは、この変数が配列である場合に
は、変数内の指される領域の、その変数の先頭からのオ
フセットを求める。同一の変数を指し、かつオフセット
も等かった場合に、両ポインタの値は等しいと判定す
る。
【0082】なお、ポインタがともに変数以外の領域、
たとえば作業領域内や自動変数領域を指していたら、S
110においてそれぞれが指す領域の値を比較し、それ
らが等しければポインタ値が等しいものとみなしてもよ
い。ただしこの場合は、以前に使っていたが返却した領
域を指している場合があるので、値が不一致でもプログ
ラムのエラーでない場合が有り得る。これはどうしても
見つからない場合に最後の手段として使うのがよい。
【0083】S110において変数の値が等しくなけれ
ば(No)、S111に進んでそのポインタ名と、オブジ
ェクトプログラム12及びオブジェクトプログラム13
においてそれぞれが指す変数名をキーボードディスプレ
イ装置6の画面に表示する。
【0084】図12は、このキーボードディスプレイ装
置6の表示画面の一例を示す図である。
【0085】変数名と、オブジェクトプログラムのプロ
グラム名と、オブジェクトプログラムでの変数値などを
表示することが考えられ、たとえば、図示のようにポイ
ンタ値がその変数を指しているときは変数値の欄に”変
数名”を表示し、ポインタが指す領域を占める変数がな
いときはそれが指している領域の値を表示する。
【0086】次に、上記した図9及び図10の実行・比
較プログラム10の処理を図7に示したソースプログラ
ム11に適用した場合について、より具体的、かつ詳細
に説明する。
【0087】まず図7に戻って説明するに、このソース
プログラム11に期待される処理は、配列aryの4つ
の配列要素を全て1にすることである。なお、変数iは
7行〜9行における繰り返しの実行回数を数え、変数p
は配列aryの配列要素を指すポインタである。
【0088】4行〜10行に手続きが記述されており、
6行目のfor( )は7行〜9行を繰り返し処理
の本体として実行することを指示している。また、6行
目に記述されたi=0,p=aryの部分は繰り返しを
始める前に実行され、変数iに0を代入し、ポインタp
に配列aryの先頭要素のアドレスを代入するものであ
る。
【0089】つづいて記述されたi<10の部分は、繰
り返しを続行する条件を示している。すなわち、繰り返
しの本体を実行する前に毎回この式を評価し、本体を実
行するか、それとも実行せずに繰り返し処理を打ち切る
かを判定する。もしこの式(i<10)が満足されされ
ば、その回の繰り返し本体が実行される。
【0090】さらにつづいて記述されたi++,p++
の部分は、繰り返し本体が1回終了する度に実行される
部分で、iには1が加えられ、pは次の配列要素を指す
ように歩進される。実際には、pにも1が加えられる。
【0091】したがって、本プログラム例では、ポイン
タpは始めは配列aryの先頭の要素を指しているが、
繰り返し処理がされる度に歩進され、何回かの歩進の結
果、配列aryの領域外を指すようになる。
【0092】そして、図13はオブジェクトプログラム
12及び13を実行したときの、各変数の変化を示す図
である。
【0093】ソースプログラム11(図7)のブレーク
ポイントを、オブジェクトプログラム12及び13にお
いて、行番号テーブルを参照して、それぞれソースプロ
グラム11上の6行目と8行目の先頭に対応するアドレ
スに設定する。実行開始直後6行目のブレークポイント
で停止したとき、全ての変数はプログラムの初期値であ
る0であるため、オブジェクトプログラム12とオブジ
ェクトプログラム13の対応する変数値はそれぞれ等し
い。
【0094】すなわち、繰り返し本体が記述された8行
目のブレークポイントで停止するが、1回目のはじめ
は、オブジェクトプログラム12とオブジェクトプログ
ラム13の各変数は図示のとおり初期値0で、ポインタ
pは配列aryを指している。以後、繰り返しが実行さ
れる度に変数iは1ずつ加算され、pにも1ずつ加算さ
れるが、オブジェクトプログラム12とオブジェクトプ
ログラム13の対応する変数値はそれぞれ等しく、ポイ
ンタpは配列aryの中を指している。
【0095】しかし、4回目の繰り返しを終了したあ
と、6行目の前述したfor( )の中のi++を実
行することで、変数iの値は4となる。また、p++を
実行することで、ポインタpは配列aryの最後の要素
の次を指すようになる。
【0096】このため、5回目の8行目のブレークポイ
ントにおいて、オブジェクトプログラム12では配列a
ryの後方に存在する変数pの一部を指し、オブジェク
トプログラム12では配列aryの前方に存在する変数
iの一部を指すことになる(図8参照)。
【0097】すなわち、図7のソースプログラムは6行
目の記述i<10に誤りがあるため、5回目の繰り返し
で図10のS110の処理が実行されるとポインタpの
値が異なるものと判定され、ポインタpの名前とpの指
す変数名”p”と”i”がそれぞれ出力され、たとえば
図12のようにキーボードディスプレイ装置に表示され
る。
【0098】このように本実施例によれば、ポインタを
含むプログラムのポインタに起因する誤りを、ポインタ
値に関する値の正当な範囲を特に指定することなしに発
見することがきるので、従来の方法では極めて困難であ
ったポインタを含むプログラムのデバッグを効率的に行
うことができる。このようなプログラムの誤りは発生頻
度は低いものの、もし発生した場合にデバッグに要する
時間と労力は膨大なものであり、本実施例のプログラム
異常検出装置は極めて有効なデバッグ作業のツールとな
る。
【0099】また、上記実施例ではポインタの値も各変
数の値とともに比較したが、ポインタについてはそれが
格納する値、それが指す領域の値、あるいはそれが指す
変数を比較しない方法も可能である。たとえば、ソース
プログラム11については、5回目を実行したあと、p
及びiの値がともに異なることになり、6回目のはじめ
で停止する。ただし、5回目の*p=1;の実行におい
て、プログラムが異常終了することもあり得る。
【0100】なお、ここで翻訳プログラムの他の様々な
例について、図14〜図16を参照して紹介しておく。
【0101】図14に示す翻訳プログラムの他の例はコ
ンパイラ9aとアセンブラ9bからなり、C言語への一
適用例である。
【0102】すなわち、ソースプログラム11をいった
んアセンブラ・ソースプログラム20に翻訳する際に、
変数配置モードを設定するパラメータ14をコンパイラ
9aの起動時にそれぞれ異なる値に設定することで、ア
センブラ・ソースプログラム20中の変数の宣言順序を
異なる順序にするものである。
【0103】図15に示す翻訳プログラムのさらに他の
例も、上記と同様にC言語への一適用例である。
【0104】すなわち、コンパイラ9aによりソースプ
ログラム11をいったんアセンブラ・ソースプログラム
20に翻訳したのち、このアセンブラ・ソースプログラ
ム20をアセンブラ9bによりオブジェクトプログラム
12又は13に翻訳する際に、変数配置モードを設定す
るパラメータ14aをアセンブラ9bの起動時にそれぞ
れ異なる値に設定することで、オブジェクトプログラム
12又は13における変数の順序を異なる順序にするも
のである。
【0105】また、図16に示す翻訳プログラムのさら
に他の例は、図16(A)に示すとおり、図4で説明し
たのと同様にしてコンパイラ9a(又はアセンブラ9
b)によりソースプログラムAからオブジェクトプログ
ラムAを生成し、一方、図16(B)に示すとおり、ソ
ースプログラムAの変数の順序を例えば逆に入れ換える
ソース変換処理21を行ってソースプログラムBを生成
し、このソースプログラムBからコンパイラ9a(又は
アセンブラ9b)によりオブジェクトプログラムBを生
成するものである。
【0106】次に示す図17は図16(B)におけるソ
ース変換処理の一例を示す図であり、図17(A)のva
rprog1.cは変換前のソースプログラムA、図17(B)
のvarprog2.cはソースプログラムAを変換処理して得ら
れたソースプログラムBの各一例を示している。
【0107】たとえば、int a;は int型の整数aを定義
しているが、変換後のソースプログラムBでは、この整
数aを定義したあとに、int a ; の行が追加
されている。このint a ( a に下線 を5つ
並べたもの)の記述は追加したダミーの変数の名前をあ
らわす。整数bと整数cのあとにも同様のダミーの変数
が追加されている。
【0108】staticなどは変数の割り付け場所の区分な
どを示すもので、変換後のプログラムてもそのまま使用
している。これは、その直前の変数の割り付け場所の中
で変数と変数との間に新たな変数を割り付けるためであ
る。varprog1.cを翻訳すると、変数aの次に変数cが割
り付けられているが、varprog2.cの場合は変数aの次に
変数 a が、変数 a に続いて変数c
が割り付けられる。
【0109】このようにダミーの変数を追加してオブジ
ェクトプログラムを実行し各変数の値を調べると、各変
数が割り付けられる領域の間にダミーの変数が割り付け
られる領域が有るために、ポインタが誤って使われる
と、それが指す変数はvarprog1.cとvarprog2.cとで別の
変数になると期待でき、容易に誤りを発見することがで
きる。
【0110】なお、ここでソース変換処理の他の様々な
例について、図18〜図19を参照して紹介しておく。
【0111】図18はソース変換処理の他の例を示す図
である。
【0112】同図は、利用者の作成したソースプログラ
ムを、デバッグ対象のソースプログラムの変数定義と変
数定義との間にダミーの変数を定義した部分を挿入して
変換処理を行った結果を示す。
【0113】ここでは、各変数に初期値として0が定義
されている。これを翻訳したのち実行し、たとえばソー
スプログラム varprog3.c の各行において変数名が5つ
の下線 で終わる追加されたダミーの変数の値
を調べる。デバッグ対象のソースプログラムの変数が示
すポインタの誤りによってダミーの変数が壊されるた
め、ダミーの0でない変数が見つかった場合にプログラ
ムの異常の可能性があるとしてプログラムの実行を停止
させる。また、0でない変数が見つからなかった場合は
実行を再開する。
【0114】
【発明の効果】上述の如く本発明によれば、並行される
複数のオブジェクトプログラムの実行がそれぞれソース
プログラム上の同じ地点に至るか、あるいは少なくとも
一方が停止するときに、ソースプログラム上同一の変数
に対応するそれぞれのオブジェクトプログラム内の変数
同志を比較され、すべて値が等しかった場合は実行が再
開され、異なる場合は実行が打ち切られるため、ポイン
タを含むプログラムのポインタに起因する誤りをポイン
タ値に関する値の範囲を特別指定することなしに発見す
ることがきるので、従来のデバッグ方法では極めて困難
であったポインタを含むソースプログラムのデバッグで
も効率的に行うことができる特長がある。
【図面の簡単な説明】
【図1】本発明の原理図である。
【図2】本発明の一実施例の全体構成図である。
【図3】本発明の一実施例の処理の流れを示す図であ
る。
【図4】翻訳プログラムの一例を示す図である。
【図5】利用者プログラム領域の構成図である。
【図6】図5の自動変数領域の大きさの変動を説明する
図である。
【図7】ソースプログラムの一例のソースリストを示す
図である。
【図8】図7のソースプログラムを2つのオブジェクト
プログラムに翻訳した際の、それぞれの変数の割り付け
を示す図である。
【図9】本発明の一実施例になる実行・比較プログラム
による処理を示すフローチャート(その1)である。
【図10】本発明の一実施例になる実行・比較プログラ
ムによる処理を示すフローチャート(その2)である。
【図11】変数対応表の一例を示す図である。
【図12】表示画面の一例を示す図である。
【図13】オブジェクトプログラムを実行したときの各
変数の変化を示す図である。
【図14】翻訳プログラムの他の例を示す図である。
【図15】翻訳プログラムのさらに他の例を示す図であ
る。
【図16】翻訳プログラムのさらに他の例を示す図であ
る。
【図17】ソース変換処理の一例を示す図である。
【図18】ソース変換処理の他の例を示す図である。
【符号の説明】
2 主記憶領域 4 利用者プログラム領域 6 キーボードディスプレイ装置 7 外部規格装置 9 翻訳プログラム 10 実行・比較プログラム 11 ソースプログラム 12,13 オブジェクトプログラム 12a,13a デバッグ情報 18 実行・比較手段 19 翻訳手段

Claims (4)

    【特許請求の範囲】
  1. 【請求項1】 被デバッグプログラムとしてソースプロ
    グラム(11)を入力し、該ソースプログラム(11)
    中の変数に対応した変数領域を複数の配置方法で複数の
    データ部に割り付けつつ上記複数のデータ部を生成し、
    かつ、該ソースプログラム(11)中の処理記述を翻訳
    して手続き部を複数生成することで、該ソースプログラ
    ムから翻訳された該手続き部と該データ部を含んだ複数
    のオブジェクトプログラム(12,13)を生成する翻
    訳手段(9,19)と、 該翻訳手段(9,19)により生成された複数のオブジ
    ェクトプログラム(12,13)がロードされる主記憶
    領域(2)と、 該ソースプログラム(11)で予めブレークポイントを
    設定しておき、該主記憶領域(2)に上記複数のオブジ
    ェクトプログラム(12,13)をロードして並行して
    実行し、それぞれのオブジェクトプログラム(12,1
    3)の実行が該ソースプログラム(11)上のそれぞれ
    同じブレークポイントに至るか、あるいは、少なくとも
    一方の実行が停止するときに、該ソースプログラム(1
    1)上同一の変数に対応する上記複数のオブジェクトプ
    ログラム(12,13)内の変数どうしをそれぞれ比較
    する実行・比較手段(18,10)とを有することを特
    徴とするプログラム異常検出装置。
  2. 【請求項2】 前記実行・比較手段(18,10)は、
    対応する変数のうちポインタについては、該ポインタの
    ポインタ値がともに初期値の場合か、又は、ともに初期
    値でなく、それぞれのポインタが前記ソースプログラム
    (11)上で同一の変数を指している場合か、それらの
    ポインタ値が指す領域の値が等しい場合は値を等しいと
    判定し、そうでない場合は値を異なると判定することを
    特徴とする請求項1記載のプログラム異常検出装置。
  3. 【請求項3】 前記翻訳手段(9,19)は、前記ソー
    スプログラム(11)中で定義された変数に対して、一
    つはアドレスの小さい順に、もう一つはアドレスの大き
    い順に変数領域を割り付けることを特徴とする請求項1
    記載のプログラム異常検出装置。
  4. 【請求項4】 前記翻訳手段(9,19)は、前記ソー
    スプログラム(11)中で定義された複数の変数に対し
    て、該複数の変数がそれぞれ割り付けられた複数の領域
    を順に並べて一つのオブジェクトプログラムを生成する
    とともに、該複数の変数が割り付けられた一つの領域と
    他の領域との間にダミー領域を割り付けつつもう一つの
    オブジェクトプログラムを生成することを特徴とする請
    求項1記載のプログラム異常検出装置。
JP05008511A 1993-01-21 1993-01-21 プログラム異常検出装置 Expired - Fee Related JP3101458B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP05008511A JP3101458B2 (ja) 1993-01-21 1993-01-21 プログラム異常検出装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP05008511A JP3101458B2 (ja) 1993-01-21 1993-01-21 プログラム異常検出装置

Publications (2)

Publication Number Publication Date
JPH06222958A true JPH06222958A (ja) 1994-08-12
JP3101458B2 JP3101458B2 (ja) 2000-10-23

Family

ID=11695158

Family Applications (1)

Application Number Title Priority Date Filing Date
JP05008511A Expired - Fee Related JP3101458B2 (ja) 1993-01-21 1993-01-21 プログラム異常検出装置

Country Status (1)

Country Link
JP (1) JP3101458B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20140033616A (ko) * 2012-09-07 2014-03-19 삼성전자주식회사 혼합 모드 프로그램의 소스 코드 오류 위치 검출 장치 및 방법

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20140033616A (ko) * 2012-09-07 2014-03-19 삼성전자주식회사 혼합 모드 프로그램의 소스 코드 오류 위치 검출 장치 및 방법
JP2014053010A (ja) * 2012-09-07 2014-03-20 Samsung Electronics Co Ltd 混合モードプログラムのソースコードエラー位置検出装置及び方法

Also Published As

Publication number Publication date
JP3101458B2 (ja) 2000-10-23

Similar Documents

Publication Publication Date Title
EP0785510B1 (en) Program debugging system for debugging a program having a graphical user interface
US6186677B1 (en) Byte code instrumentation
US6981248B2 (en) Conditional breakpoint encountered indication
US7962832B2 (en) Method for detecting memory error
US20030033592A1 (en) Software debugger and software development support system
WO2005111801A2 (en) Apparatus and method for improving emulation speed of high-level languages in on-chip emulation systems
US11137740B2 (en) Numerical controller and method for determining look-ahead variable
JP3101458B2 (ja) プログラム異常検出装置
JP2922723B2 (ja) 情報処理装置
US20030018957A1 (en) Debugger monitor with anticipatory highlights
EP0801348A1 (en) Method of monitoring the operation of a computer
KR101476536B1 (ko) 프로그램 검수 방법 및 시스템
JPH11224211A (ja) ソフトウェア検査支援装置
JP6812637B2 (ja) プログラマブルコントローラシステム、その開発支援装置、ターゲット装置
JPH05250221A (ja) シミュレータ実行方式
JP2860054B2 (ja) プログラムデバッグ装置
WO2024069730A1 (ja) デバッグ装置及びデバッグ方法
JP2785606B2 (ja) パイプライン処理方式コンピュータ用プログラムのデバッガ
US10459825B2 (en) Intelligent expansion of system information collection
JPH02220145A (ja) プログラムトレース方式
JP2002073370A (ja) デバッグ支援装置およびその装置によるデバッグ方法
US7627859B2 (en) Method for configuring non-script language library files to be run as scripts
JP2001134464A (ja) 情報処理方法および装置
JP2003015907A (ja) デバッグ装置、デバッグプログラム、およびプログラム記録媒体
JP3098501B2 (ja) ソースステップ実行方法およびその装置

Legal Events

Date Code Title Description
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20000808

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

Free format text: PAYMENT UNTIL: 20080818

Year of fee payment: 8

LAPS Cancellation because of no payment of annual fees