[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、 Java、 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のスコープ演算子も表わします (参照)。 上記の::と同一の優先順位を持ちます。

ユーザ・コードの中で演算子が再定義されていると、 GDBは通常、 事前定義されている意味ではなく、 再定義された意味において、 その演算子を実行することを試みます。

C/C++定数

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