[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]  


異なる言語の使用

異なるプログラミング言語であっても共通点があるのが普通ですが、 その表記法が全く同様であるということはめったにありません。 例えば、 ポインタ pの指す値を取り出す方法は、 ANSI Cでは*pですが、 Modula-2ではp^です。 値の表現方法 (および表示方法) もまた異なります。 16進数は、 Cでは`0x1ae'のようになりますが、 Modula-2では`1AEH'のようになります。 いくつかの言語については、 言語固有の情報がGDBに組み込まれており、 これにより、 プログラムを記述した言語を使って上記のような操作を記述したり、 プログラムを記述した言語の構文にしたがってGDBに値を出力させることができます。 式を記述するのに使用される言語を、 作業言語と呼びます。

ソース言語の切り替え

作業言語を制御する方法は2つあります。 GDBに自動的に設定させる方法と、 ユーザが手作業で選択する方法です。 どちらの目的でも、 set languageコマンドを使用することができます。 起動時のデフォルトでは、 GDBが言語を自動的に設定するようになっています。 作業言語は、 ユーザの入力する式がどのように解釈されるか、 あるいは、 値がどのように表示されるかを決定します。 この作業言語とは別に、 GDBの認識しているすべてのソース・ファイルには、 それ自体の作業言語があります。 オブジェクト・ファイルのフォーマットによっては、 ソース・ファイルの記述言語を示す情報を、 コンパイラが書き込んでいることがあるかもしれません。 しかし、 ほとんどの場合、 GDBはファイル名から言語を推定します。 ソース・ファイルの言語の種類が、 C++シンボル名がデコード (demangle) されるか否かを制御します。 これによりbacktraceは、 個々のフレームを、 その対応する言語にしたがって適切に表示することができます。 GDBの中から、 ソース・ファイルの言語を設定することはできません。 他の言語で記述されたソースからCのソースを生成する、 cfrontf2cのようなプログラムをユーザが使用する場合には、 このことが問題となるでしょう。 このような場合には、 生成されるCの出力に#line指示子を使用するよう、 そのプログラムを設定してください。 こうすることによって、 GDBは、 元になったプログラムのソース・コードが記述された言語を正しく知ることができ、 生成されたCのコードではなく、 元になったソース・コードを表示します。

ファイル拡張子と言語のリスト

ソース・ファイル名が以下のいずれかの拡張子を持つ場合、 GDBはその言語を以下に示すものと推定します。

`.c'
Cソース・ファイル
`.C'
`.cc'
`.cp'
`.cpp'
`.cxx'
`.c++'
C++ソース・ファイル
`.f'
`.F'
Fortranソース・ファイル
`.ch'
`.c186'
`.c286'
CHILLソース・ファイル
`.mod'
Modula-2ソース・ファイル
`.s'
`.S'
アセンブラ言語のソース・ファイル。 この場合、 実際の動作はほとんどC言語と同様ですが、 ステップ実行時に、 関数呼び出しのための事前処理部をGDBはスキップしません。

さらに、 言語に対してファイル名の拡張子を関連付けすることも可能です。 言語の表示を参照してください。

作業言語の設定

GDBに言語を自動的に設定させる場合、 ユーザのデバッグ・セッションとユーザのプログラムにおいて、 式は同様に解釈されます。 もしそうしたければ、 言語を手作業で設定することもできます。 そのためには、 コマンド`set language lang'を実行します。 ここで、 langは、 cmodula-2 のような言語名です。 サポートされている言語のリストは、 `set language'で表示させることができます。 言語を手作業で設定すると、 GDBは、 作業言語を自動的に更新することができなくなります。 このことは、 作業言語がソースの言語と同一ではなく、 かつ、 ある式がどちらの言語でも有効でありながら、 その意味が異なるような状況でプログラムをデバッグしようとしたときに、 混乱をもたらす可能性があります。 例えば、 カレントなソース・ファイルがC言語で記述されていて、 GDBがそれをModula-2として解析している場合に、

print a = b + c

のようなコマンドを実行すると、 その結果は意図したものとは異なるものになるでしょう。 これはC言語では、 bcとを加算して、 その結果をaに入れるということを意味し、 表示される結果は、 aの値となります。 Modula-2では、 これはab+cの結果を比較してBOOLEAN型の値を出力することを意味します。

GDBによるソース言語の推定

GDBに作業言語を自動的に設定させるには、 `set language local'または`set language auto'を使用します。 この場合、 GDBは作業言語を推定します。 つまり、 ユーザ・プログラムが (通常はブレイクポイントに達することによって) あるフレーム内部で停止したとき、 GDBは、 そのフレーム内の関数に対して記録されている言語を作業言語として設定します。 フレームの言語が不明の場合 (つまり、 そのフレームに対応する関数またはブロックが、 既知ではない拡張子を持つソース・ファイルにおいて定義されている場合)、 カレントな作業言語は変更されず、 GDBは警告メッセージを出力します。 このようなことは、 全体がただ1つの言語で記述されているほとんどのプログラムにおいては 不要であると思われるでしょう。 しかし、 あるソース言語で記述されたプログラム・モジュールやライブラリは、 他のソース言語で記述されたメイン・プログラムから使用することができます。 このような場合に`set language auto'を使用することで、 作業言語を手作業で設定する必要がなくなります。

言語の表示

以下のコマンドは、 作業言語、 および、 ソース・ファイルの記述言語を知りたいときに役に立ちます。

show language
カレントな作業言語を表示します。 printコマンドなどによって ユーザ・プログラム内部の変数を含む式を作成したり評価したりするには、 このコマンドによって示される言語を使用します。
info frame
選択されているフレームのソース言語を表示します。 このフレームの中の識別子を使用すると、 この言語が作業言語になります。 このコマンドにより表示される他の情報について知りたい場合は、 フレームに関する情報を参照してください。
info source
選択されているソース・ファイルのソース言語を表示します。 このコマンドにより表示される他の情報のことを知りたい場合は、 シンボル・テーブルの検査を参照してください。

普通ではない状況においては、 標準のリストに含まれない拡張子を持つソース・ファイルがあるかもしれません。 この場合には、 その拡張子を特定の言語に明示的に関連付けすることができます。

set extension-language .ext language
拡張子.extを持つソース・ファイルは、 ソース言語language によって記述されているものと想定するよう設定します。
info extensions
すべてのファイル拡張子と、 その拡張子に関連付けされた言語を一覧表示します。

型と範囲のチェック

注意: 現在のリリースでは、 型チェックと範囲チェックを行うGDBコマンドは組み込まれていますが、 それらは実際には何も実行しません。 このセクションでは、 これらのコマンドが本来持つべく意図されている機能について記述してあります。

いくつかの言語は、 一連のコンパイル時チェック、 実行時チェックによって、 一般によく見られるエラーの発生を防ぐように設計されています。 これらのチェックには、 関数や演算子への引数の型のチェックや、 数学的操作の結果のオーバーフローを実行時に確実に検出することなどが含まれています。 このようなチェックは、 型の不一致を排除したり、 ユーザ・プログラムの実行時に範囲エラーをチェックしたりすることによって、 コンパイル後のプログラムの正しさを確かなものにするのに役に立ちます。 GDBは、 ユーザが望むのであれば、 上記のような条件のチェックを行います。 GDBはユーザ・プログラムの文をチェックすることはしませんが、 例えば、 printコマンドによる評価を目的としてGDBに直接入力された式をチェックすることはできます。 作業言語の場合と同様に、 GDBが自動的にチェックを行うか否かを、 ユーザ・プログラムのソース言語によって決定することもできます。 サポートされている言語のデフォルトの設定については、 サポートされる言語を参照してください。

型チェックの概要

いくつかの言語、 例えばModula-2などは、 強く型付けされています。 これは、 演算子や関数への引数は正しい型でなくてはならず、 そうでない場合にはエラーが発生するということを意味しています。 このようなチェックは、 型の不一致のエラーが実行時に問題を発生させるのを防いでくれます。 例えば、 1+2は

1 + 2 => 3
ですが、1+2.3は
error--> 1 + 2.3

のようにエラーになります。 第2の例がエラーになるのは、 CARDINAL型の1はREAL型の2.3と型の互換性がないからです。 GDBコマンドの中で使われる式については、 ユーザがGDBの型チェック機能に対して、 以下のような指示を出すことができます。

最後の指示が選択された場合、 GDBは上記の第2の(エラー)例のような式でも評価しますが、 その際には警告メッセージを出力します。 型チェックをしないよう指示した場合でも、 型に関係のある原因によってGDBが式の評価ができなくなる場合がありえます。 例えば、 GDBはintの値とstruct fooの値を加算する方法を知りません。 こうした特定の型エラーは、 使用されている言語に起因するものではなく、 この例のように、 そもそも評価することが意味をなさないような式に起因するものです。 個々の言語は、 それが型に関してどの程度厳密であるかを定義しています。 例えば、 Modula-2とCはいずれも、 算術演算子への引数としては数値を要求します。 Cでは、 列挙型とポインタは数値として表わすことができますので、 これらは算術演算子への正当な引数となります。 特定の言語に関する詳細については、 サポートされる言語を参照してください。 GDBは、 型チェック機能を制御するためのコマンドをさらにいくつか提供しています。

set check type auto
カレントな作業言語に応じて、 型チェックを実行する、 または、 実行しないよう設定します。 個々の言語のデフォルトの設定については、 サポートされる言語を参照してください。
set check type on
set check type off
カレントな作業言語のデフォルトの設定を無視して、 型チェックを実行する、 または、 実行しないよう設定します。 その設定が言語のデフォルトと一致しない場合は、 警告メッセージが出力されます。 型チェックを実行するよう設定されているときの式の評価において型の不一致が発生した場合には、 GDBはメッセージを出力して式の評価を終了させます。
set check type warn
型チェック機能に警告メッセージを出力させますが、 式の評価自体は常に実行するよう試みさせます。 式の評価は、 他の原因のために不可能になる場合もあります。 例えば、 GDBには数値と構造体の加算はできません。
show type
型チェック機能のカレントな設定と、 GDBがそれを自動的に設定しているか否かを表示します。

範囲チェックの概要

いくつかの言語 (例えば、 Modula-2) では、 型の上限を超えるとエラーになります。 このチェックは、 実行時に行われます。 このような範囲チェックは、 計算結果がオーバーフローしたり、 配列の要素へのアクセス時に使うインデックスが配列の上限を超えたりすることがないことを確実にすることによって、 プログラムの正しさを確かなものにすることを意図したものです。 GDBコマンドの中で使う式については、 範囲エラーの扱いを以下のいずれかにするよう GDBに指示することができます。

範囲エラーは、 数値がオーバフローした場合、 配列インデックスの上限を超えた場合、 どの型のメンバでもない定数が入力された場合に発生します。 しかし、 言語の中には、 数値のオーバフローをエラーとして扱わないものもあります。 C言語の多くの実装では、 数学的演算によるオーバフローは、 結果の値を「一巡」させて小さな値にします。 例えば、 mが整数値の最大値、 sが整数値の最小値とすると、

m + 1 => s

になります。 これも個々の言語に固有な性質であり、 場合によっては、 個々のコンパイラやマシンに固有な性質であることもあります。 特定の言語に関する詳細については、 サポートされる言語を参照してください。 GDBは、 範囲チェック機能を制御するためのコマンドをさらにいくつか提供しています。

set check range auto
カレントな作業言語に応じて、 範囲チェックを実行する、 または、 実行しないよう設定します。 個々の言語のデフォルトの設定については、 サポートされる言語を参照してください。
set check range on
set check range off
カレントな作業言語のデフォルトの設定を無視して、 範囲チェックを実行する、 または、 実行しないよう設定します。 設定が言語のデフォルトとは異なる場合は、 警告メッセージが出力されます。 範囲エラーが発生した場合は、 メッセージが表示され、 式の評価は終了させられます。
set check range warn
GDBの範囲チェック機能が範囲エラーを検出した場合、 メッセージを出力し、 式の評価を試みます。 例えば、 プロセスが、 自分の所有していないメモリをアクセスした場合 (多くのUnixシステムで典型的に見られる例です) など、 他の理由によって式の評価が不可能な場合があります。
show range
範囲チェック機能のカレントな設定と、 それがGDBによって自動的に設定されているのか否かを表示します。

サポートされる言語

GDBは、 C、 C++、 Fortran、 Chill、 アセンブリ言語、 Modula-2をサポートしています。 いくつかのGDBの機能は、 使用されている言語にかかわらず、 式の中で使用できます。 GDBの@演算子、 ::演算子、 および`{type}addr'を参照) は、 サポートされている任意の言語において使用することができます。 次節以降で、 個々のソース言語がGDBによってどの程度までサポートされているのかを詳しく説明します。 これらの節は、 言語についてのチュートリアルやリファレンスとなることを意図したものではありません。 むしろ、 GDBの式解析機能が受け付ける式や、 異なる言語における正しい入出力フォーマットのリファレンス・ガイドとしてのみ役に立つものです。 個々の言語については良い書籍が数多く出ています。 言語についてのリファレンスやチュートリアルが必要な場合は、 これらの書籍を参照してください。

C/C++

CとC++は密接に関連しているので、 GDBの機能の多くは両方の言語に適用できます。このようなものについては、2つの言語を一緒に議論します。 C++のデバッグ機能は、 C++コンパイラとGDBによって協同で実装されています。 したがって、 C++のコードを効率よくデバッグするには、 GNU g++、 HP ANSI C++コンパイラ(aCC)などの、 サポートされているC++コンパイラで、 C++のプログラムをコンパイルする必要があります。 GNU C++を使用する場合、 最高の結果を引き出すには、 stabsデバッグ・フォーマット を使用してください。 g++のコマンドライン・オプション`-gstabs'、 または、 `-gstabs+'によって、 このフォーマットを明示的に選択することができます。 詳細については、 Using GNU CCの`Options for Debugging Your Program or GNU CC' の部分を参照してください。

C/C++演算子

演算子は、 特定の型の値に対して定義されなければなりません。 例えば、 +は数値に対しては定義されていますが、 構造体に対しては定義されていません。 演算子は、 型のグループに対して定義されることがよくあります。 C/C++に対しては、以下の定義が有効です。

以下の演算子がサポートされています。 これらは優先順位の低いものから順に並べられています。

,
カンマ、 あるいは、 順序付けの演算子です。 カンマによって区切られたリストの中の式は、 左から右の順で評価されます。 最後に評価された式の結果が、 式全体の評価結果になります。
=
代入。 代入された値が、 代入式の値になります。 スカラ型に対して定義されています。
op=
a op= bという形式の式において使用され、 a = a op bに変換されます。 op==は、 同一の優先順位を持ちます。 opには、 |^&<<>>+-*/%の各演算子が使用できます。
?:
3項演算子です。 a ? b : cは、 aが真であればb、 偽であればcとみなすことができます。 aは整数型でなければなりません。
||
論理ORです。 整数型に対して定義されています。
&&
論理ANDです。 整数型に対して定義されています。
|
ビットごとのORです。 整数型に対して定義されています。
^
ビットごとの排他的ORです。 整数型に対して定義されています。
&
ビットごとのANDです。 整数型に対して定義されています。
==、!=
等価、 および、 不等価です。 スカラ型に対して定義されています。 これらの式の値は、 偽のときはゼロであり、 真のときはゼロ以外の値となります。
<、>、<=、>=
未満、 超過、 以下、 以上です。 スカラ型に対して定義されています。 これらの式の値は、 偽のときはゼロであり、 真のときはゼロ以外の値となります。
<<、>>
左シフト、 右シフトです。 整数型に対して定義されています。
@
GDBの「人工配列」演算子です (を参照)。
+、-
加算および減算です。 整数型、 浮動小数点型、 ポインタ型に対して定義されています。
*、/、%
乗算、 除算、 剰余です。 乗算と除算は、 整数型と浮動小数点型に対して定義されています。 剰余は、 整数型に対して定義されています。
++, --
インクリメント、 デクリメントです。 変数の前にある場合は、 式の中でその変数が使用される前に実行されます。 変数の後ろにある場合は、 変数の値が使用された後に実行されます。
*
ポインタの間接参照です。 ポインタ型に対して定義されています。 ++と同一の優先度を持ちます。
&
アドレス参照演算子です。変数に対して定義されています。 ++と同一の優先順位を持ちます。 C++のデバッグでは、 C++言語そのものにおいては許されていないような`&'の使用法を、 GDBは実装しています。 C++の (`&ref'により宣言される) 参照変数が格納されているアドレスを調べるのに、 `&(&ref)' (あるいは、 もしそうしたいのであれば単に`&&ref') を使用することができます。
-
マイナス(負)です。 整数型と浮動小数点型に対して定義されています。 ++と同一の優先順位を持ちます。
!
論理NOTです。 整数型に対して定義されています。 ++と同一の優先順位を持ちます。
~
ビットごとのNOT (補数) 演算子です。 整数型に対して定義されています。 ++と同一の優先順位を持ちます。
., ->
構造体のメンバ、 ポインタの指す構造体のメンバをそれぞれ指定する演算子です。 便宜上、 GDBは両者を同一のものとして扱い、 格納されている型情報をもとに、 ポインタによる間接参照の必要性を判断します。 構造体 (struct) および共用体 (union) に対して定義されています。
[]
配列のインデックスです。 a[i]は、 *(a+i)として定義されています。 ->と同一の優先順位を持ちます。
()
関数のパラメータ・リストです。 ->と同一の優先順位を持ちます。
::
C++のスコープ解決演算子です。 構造体(struct)、 共用体(union)、 クラス(class)に対して定義されています。
::
2重コロンはまた、 GDBのスコープ演算子 も 表わします (を参照)。 上記の::と同一の優先順位を持ちます。

C/C++定数

GDBでは、 以下のような方法によって、 C/C++の定数を表わすことができます。

C++式

GDBが持っている、 式を処理する機能は、 C++のほとんどの式を解釈することができます。

注意: GDBは、 適切なコンパイラが使用されている場合のみ、 C++のコードをデバッグすることができます。 典型的な例を挙げると、 C++のデバッグでは、 シンボル・テーブルの中の追加的なデバッグ情報に依存するため、 特別なサポートが必要になるということがあります。 使用されるコンパイラが、 a.out、 MIPS ECOFF、 RS/6000 XCOFF、 ELFを、 シンボル・テーブルに対するstabs拡張付きで生成することができるのであれば、 以下に列挙する機能を使用することができます (GNU CCの場合は、 `-gstabs'オプションを使用して明示的にstabsデバッグ拡張を要求することができます)。 一方、 オブジェクト・コードのフォーマットが、 標準COFFやELFのDWARFである場合には、 GDBの提供するほとんどのC++サポートは機能しません

  1. メンバ関数の呼び出しが許されます。 以下のような式を使用することができます。
    count = aml->GetOriginal(x, y)
    
  2. メンバ関数が (選択されたスタック・フレームの中で) アクティブな場合、 入力された式は、 そのメンバ関数と同一の名前空間を利用することができます。 すなわち、 GDBは、 C++と同様の規則にしたがって、 クラス・インスタンスへのポインタthisへの暗黙の参照を許します。
  3. オーバーロードされた関数を呼び出すことができます。 GDBは、 正しい定義の関数呼び出しを決定します。 ただし、 制限が一点あります。 実際に呼び出したい関数が要求する型の引数を使用しなければなりません。 GDBは、 コンストラクタやユーザ定義の型演算子を必要とするような変換を実行しません。
  4. GDBは、 C++の参照変数として宣言された変数を理解します。 C++のソース・コードで参照変数を使用するのと同一の方法で、 参照変数を式の中で使用することができます。 参照変数は自動的に間接参照されます。 GDBがフレームを表示する際に表示されるパラメータ一覧の中では、 参照変数の値は (他の変数とは異なり) 表示されません。 これにより、 表示が雑然となることを回避できます。 というのは、 参照変数は大きい構造体に対して使用されることが多いからです。 参照変数の アドレスは、 `set print address off'を指定しない限り、 常に表示されます。
  5. GDBはC++の名前解決演算子::をサポートしています。 プログラム中と同様に、 式の中でこれを使用することができます。 あるスコープが別のスコープの中で定義されることがありえるため、 必要であれば::を繰り返し使用することができます。 例えば、 `scope1::scope2::name'という具合です。 GDBはまた、 CおよびC++のデバッグにおいて、 ソース・ファイルを指定することで名前のスコープを解決することを許します (プログラム変数を参照)。

C/C++のデフォルト

GDBが自動的に型チェックや範囲チェックの設定を行うことを許すと、 作業言語がCやC++に変更されるときにはいつも、 それらの設定はデフォルトでoffになります。 これは、 作業言語を選択したのがユーザであってもGDBであっても同様です。 GDBが自動的に言語の設定を行うことを許すと、 GDBは、 名前が`.c'`.C'`.cc'などで終わるソース・ファイルを認識していて、 これらのファイルからコンパイルされたコードの実行を開始するときに、 作業言語をCまたはC++に設定します。 詳細については、 GDBによるソース言語の推定を参照してください。

C/C++の型チェックと範囲チェック

デフォルトでは、 GDBがCやC++の式を解析するときには、 型チェックは行われません。 しかし、 ユーザが型チェックを有効にすると、 GDBは以下の条件が成立するときに、 2つの変数の型が一致しているとみなします。

範囲チェックは、 onに設定されている場合、 数学的演算において実行されます。 配列のインデックスは、 それ自体は配列ではないポインタのインデックスとして使用されることが多いため、 チェックされません。

GDBとC

set print unionコマンドとshow print unionコマンドは共用体型 (union) に適用されます。 `on'に設定されると、 構造体 (struct) やクラス (class) の内部にある共用体 (union) はすべて表示されます。 `on'でない場合、 それは`{...}'と表示されます。 @オペレータは、 ポインタとメモリ割り当て関数によって作られた動的配列のデバッグに役に立ちます。 を参照してください。

C++用のGDB機能

GDBのコマンドの中には、 C++を使用しているときに特に役に立つものがあり、 また、 C++専用に特に設計されたものがあります。 以下に、 その要約を示します。

breakpoint menus
名前がオーバーロードされている関数の内部にブレイクポイントを設定したい場合、 関心のある関数定義を指定するのに、 GDBのブレイクポイント・メニューが役に立ちます。 ブレイクポイント・メニューを参照してください。
rbreak regex
あるオーバーロードされたメンバ関数が、 特別なクラスだけが持つメンバ関数というわけではない場合、 そのメンバ関数にブレイクポイントを設定するのに、 正規表現によるブレイクポイントの設定が役に立ちます。 ブレイクポイントの設定を参照してください。
catch throw
catch catch
C++の例外処理をデバッグするのに使用します。 キャッチポイントの設定を参照してください。
ptype typename
typenameに関して、継承関係などの情報を表示します。 シンボル・テーブルの検査を参照してください。
set print demangle
show print demangle
set print asm-demangle
show print asm-demangle
コードをC++のソースとして表示する場合と、 逆アセンブル処理の結果を表示する場合に、 C++のシンボルをソース形式で表示するか否かを制御します。 表示設定を参照してください。
set print object
show print object
オブジェクトの型を表示する際に、 派生した (実際の) 型と宣言された型のどちらを表示するかを選択します。 表示設定を参照してください。
set print vtbl
show print vtbl
仮想関数テーブルの表示形式を制御します。 表示設定を参照してください。
オーバーロードされたシンボル名
オーバーロードされたシンボルを宣言するのに C++において使用されるのと同一の表記法を使用して、 オーバーロードされたシンボル定義のうち、 特定のものを指定することができます。 単にsymbolと入力するのではなく、 symbol(types)と入力してください。 GDBコマンドラインの単語補完機能を使用して、 利用可能な選択肢を一覧表示させたり、 型のリストを完結させたりすることができます。 この機能の使用方法の詳細については、 コマンド名の補完を参照してください。

Modula-2

Modula-2をサポートするために開発されたGDBの拡張機能は、 (現在開発中の) GNU Modula-2コンパイラによって生成されたコードだけをサポートします。 他のModula-2コンパイラは現在サポートされていません。 他のModula-2コンパイラが生成した実行形式モジュールをデバッグしようとすると、 おそらく、 GDBが実行モジュールのシンボル・テーブルを読み込もうとしたところでエラーになるでしょう。

Modula-2演算子

演算子は、 特定の型の値に対して定義されなければなりません。 例えば、 +は数値に対して定義され、 構造体に対しては定義されません。 演算子は、 型のグループに対して定義されることがよくあります。 Modula-2においては、 以下の定義が有効です。

以下の演算子がサポートされています。 ここでは、 優先順位の低いものから順に並べています。

,
関数の引数の区切り記号、 または、 配列のインデックスの区切り記号です。
:=
代入です。 var := valueの値は valueです。
<、>
未満、 超過です。 整数型、 浮動小数点型、 列挙型に対して定義されています。
<=、>=
整数型、 浮動小数点型、 列挙型に対しては、 以下、 以上を表わします。 集合型に対しては、 集合の包含関係を表わします。 <と同一の優先順位を持ちます。
=、<>、#
スカラ型に対して定義されている等価および2種類の不等価です。 <と同一の優先順位を持ちます。 GDBスクリプトの中では、 #がスクリプトのコメント記号でもあるため、 不等価としては<>だけが使用可能です。
IN
集合のメンバを表わします。 集合型、 およびそのメンバの型に対して定義されています。 <と同一の優先順位を持ちます。
OR
ブール型のOR (disjunction) です。 ブール型に対して定義されています。
AND、&
ブール型のAND (conjunction) です。 ブール型に対して定義されています。
@
GDBの「人工配列」演算子です (を参照)。
+、-
整数型、 浮動小数点型に対しては、 加算、 減算を表わします。 集合型に対しては、 和集合 (union)、 差集合 (difference) を表わします。
*
整数型、 浮動小数点型に対しては、 乗算を表わします。 集合型に対しては、 積集合 (intersection) を表わします。
/
浮動小数点型に対しては、 除算を表わします。 集合型に対しては、 対称的差集合 (symmetric difference) を表わします。 *と同一の優先順位を持ちます。
DIV、MOD
整数型の除算における商と剰余を表わします。 整数型に対して定義されています。 *と同一の優先順位を持ちます。
-
マイナス(負)です。 INTEGERREAL型のデータに対して定義されています。
^
ポインタの間接参照です。 ポインタ型に対して定義されています。
NOT
ブール型のNOTです。 ブール型に対して定義されています。 ^と同一の優先順位を持ちます。
.
RECORDフィールドの区切り記号です。 RECORDデータに対して定義されます。 ^と同一の優先順位を持ちます。
[]
配列のインデックスを指定します。 ARRAY型のデータに対して定義されています。 ^と同一の優先順位を持ちます。
()
プロシージャの引数リストを指定します。 PROCEDUREオブジェクトに対して定義されています。 ^と同一の優先順位を持ちます。
::、.
GDBおよびModula-2のスコープ指定演算子です。

注意: 集合、 および集合に対する操作は、 まだサポートされていません。 このため、 GDBはIN演算子、 あるいは、 集合に対して+-*/=<>#<=>=のいずれかの演算子が使用された場合、 これをエラーとして扱います。

組み込み関数と組み込みプロシージャ

Modula-2では、 いくつかの組み込みプロシージャ、 組み込み関数が使用できます。 これらの説明にあたり、 以下のメタ変数を使用します。

a
ARRAY型の変数を表わします。
c
CHAR型の定数、 または変数を表わします。
i
整数型の変数、 または定数を表わします。
m
集合に属する識別子を表わします。 通常、 同一関数の中でメタ変数sとともに使用されます。 sの型は、 SET OF mtypeでなければなりません (ここでのmtypemの型です)。
n
整数型または浮動小数点型の、 変数または定数を表わします。
r
浮動小数点型の変数または定数を表わします。
t
型を表わします。
v
変数を表わします。
x
多くの型の中の1つの型の、 変数または定数を表わします。 詳細については、 関数の説明の部分を参照してください。

また、 すべてのModula-2の組み込みプロシージャは、 以下に説明する値を返します。

ABS(n)
nの絶対値を返します。
CAP(c)
cが小文字であれば、 それを大文字にして返します。 cが小文字でなければ、 cをそのまま返します。
CHR(i)
序数がiである文字を返します。
DEC(v)
変数vの値から1を引きます。 新しい値を返します。
DEC(v,i)
変数vの値からiで示される値を引きます。 新しい値を返します。
EXCL(m,s)
集合sから要素mを取り除きます。 新しい集合を返します。
FLOAT(i)
整数値iに等しい浮動小数点値を返します。
HIGH(a)
配列aの最後の要素のインデックスを返します。
INC(v)
変数vの値に1を加えます。 新しい値を返します。
INC(v,i)
変数vの値にiで示される値を加えます。 新しい値を返します。
INCL(m,s)
集合sに要素mが存在しない場合、 要素mを追加します。 新しい集合を返します。
MAX(t)
tの最大値を返します。
MIN(t)
tの最小値を返します。
ODD(i)
iが奇数であればブール型のTRUEを返します。
ORD(x)
引数の序数値を返します。 例えば、 文字の序数値は、 (ASCII文字セットをサポートするマシン上では) そのASCII値です。 ここでxは、 整数型、 文字型、 列挙型のような順序を持つ型でなければなりません。
SIZE(x)
引数のサイズを返します。 xは変数または型のいずれかです。
TRUNC(r)
rの整数部を返します。
VAL(t,i)
tのメンバのうち、 その序数値がiであるものを返します。

注意: 集合、 および集合に対する操作はまだサポートされていません。 したがって、 INCLプロシージャ、 EXCLプロシージャを使用すると、 GDBはエラーとして扱います。

定数

GDBでは、 Modula-2の定数を以下のような方法で表現することができます。

Modula-2デフォルト

型チェックと範囲チェックがGDBにより自動的に設定される場合、 作業言語がModula-2に変わるたびに、 それらはデフォルトでonに設定されます。 これは、 作業言語を選択したのがユーザであろうとGDBであろうと同様です。 GDBに自動的に言語を設定させると、 ファイル名の末尾が`.mod'であるファイルからコンパイルされたコードに入るたびに、 作業言語はModula-2に設定されます。 詳細については、 GDBによるソース言語の推定を参照してください。

標準Modula-2との差異

Modula-2プログラムのデバッグを容易にするために2、 3の修正が施されています。 これは主に、 型に対する厳密性を緩めることによって実現されています。

Modula-2の型チェックと範囲チェック

注意: GDBは現在のところ、 型チェック、 範囲チェックをまだ実装していません。

GDBは、 以下のいずれかの条件が成立するとき、 2つのModula-2変数の型が等しいとみなします。

型チェックが有効である限り、 等しくない型の変数を組み合わせようとする試みはすべてエラーとなります。 範囲チェックは、 数学的操作、 代入、 配列のインデックス境界、 およびすべての組み込み関数、 組み込みプロシージャにおいて実行されます。

スコープ演算子::.

Modula-2のスコープ演算子 (.) とGDBのスコープ演算子 (::) との間には2、 3の微妙な相違点があります。 この2つは似た構文を持っています。


module . id
scope :: id

ここで、 scopeはモジュール名またはプロシージャ名、 moduleはモジュール名、 idはユーザ・プログラムの中で宣言された任意の (異なるモジュール以外の) 識別子です。 ::演算子を使用すると、 GDBはscopeによって指定されたスコープにおいて識別子idを探します。 指定されたスコープにおいてそれを見つけることができないと、 GDBはscopeによって指定されたスコープを包含するすべてのスコープを探します。 .演算子を使用すると、 GDBはカレントなスコープにおいて、 modueによって指定された定義モジュールから取り込まれた、 idによって指定される識別子を探します。 この演算子では、 識別子idが定義モジュールmoduleから取り込まれていない場合やmoduleにおいてidが識別子でない場合は、 エラーになります。

GDBとModula-2

GDBコマンドの中には、 Modula-2プログラムのデバッグにはほとんど役に立たないものがいくつかあります。 set printshow printの5つのサブ・コマンド`vtbl'`demangle'`asm-demangle'`object'`union'はC/C++にのみ適用されます。 最初の4つはC++に適用され、 最後の1つはCの共用体 (union) に適用されます。 これらは、 Modula-2において直接類似するものが存在しません。 @演算子 (を参照) は、 どの言語においても使用することができますが、 Modula-2においてはあまり役に立ちません。 この演算子は、 動的配列のデバッグを支援することを目的とするものですが、 C/C++では作成できる動的配列は、 Modula-2では作成できません。 しかし、 整数値定数によってアドレスを指定することができるので、 `{type}adrexp'は役に立ちます (を参照)。 GDBスクリプトの中では、 Modula-2の不等価演算子#はコメントの開始記号として解釈されます。 代わりに<>を使用してください。


[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]