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


GDB註釈

この章では、 GDBにおける註釈機能について説明します。 註釈は、 グラフィカル・ユーザ・インターフェイス、 あるいは、 比較的上位のレベルにおいてGDBとやりとりを行う他の同様のプログラムとGDBとの間を仲立ちすることを目的として設計されています。

註釈

註釈を生成するには、 --annotate=2オプションを指定してGDBを起動します。

註釈は改行文字で始まり、 その後ろに、 2つの`control-z'と註釈名が続きます。 註釈に関連付けらられた追加情報がない場合には、 註釈名の直後に改行が続きます。 追加情報がある場合は、 註釈名の後ろに空白を1つ空けて追加情報が続き、 最後に改行がきます。 追加情報の中に改行文字を含めることはできません。

改行文字と2つの`control-z'で始まらない出力はすべて、 GDBの出力を文字どおりに表わしています。 現在のところ、 GDBが改行文字に続けて2つの`control-z'文字を出力する必要性はないのですが、 そのような必要性が出てくれば、 これらの3文字の出力を意味する`escape'註釈によって 註釈を拡張することができます。

註釈付きでGDBを起動する単純な例を以下に示します。

$ gdb --annotate=2
GNU GDB 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it
under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty"
for details.
This GDB was configured as "sparc-sun-sunos4.1.3"

^Z^Zpre-prompt
(gdb) 
^Z^Zprompt
quit

^Z^Zpost-prompt
$ 

ここで`quit'は、 GDBへの入力です。 それ以外はGDBからの出力です。 `^Z^Z'`^Z'`control-z'文字を表わします) で始まる3行が註釈です。 それ以外はGDBからの出力です。

server接頭語

ユーザによって認識されている状態に影響を与えることなくGDBに対するコマンドを発行するためには、 そのコマンドの前に`server 'という文字列を付けてください。 これは、 このコマンドがコマンド履歴に影響を与えないということを意味しています。 すなわち、 行内にほかの文字がない状態でRETが押された場合にどのコマンドを繰り返すべきかという点に関する GDBの認識に影響を与えないということです。

server接頭語は、 値履歴への値の記録にも影響を与えません。 ある値を、 値履歴に記録することなく表示させたい場合には、 printコマンドの代わりにoutputコマンドを使ってください。

様々なコンテキストにおいて値を表示する際に、 GDBは註釈を使って、 その値をまわりのテキストから区切ります。

ある値が、 printコマンドを使って表示され、 値ヒストりに追加されると、 註釈は以下のようになります。

^Z^Zvalue-history-begin history-number value-flags
history-string
^Z^Zvalue-history-value
the-value
^Z^Zvalue-history-end

history-numberは、 その値の値履歴の中における番号です。 history-stringは、 `$5 = 'のような文字列で、 その後に値が表示されることをユーザに示すものです。 the-valueは、 値そのものに対応する出力です。 value-flagsは、 間接参照できる値については`*'、 間接参照できない値については`-'です。

値が値履歴に追加されない場合 (不正な浮動小数点数である場合や、 outputコマンドを使って表示される場合) の註釈も同様です。

^Z^Zvalue-begin value-flags
the-value
^Z^Zvalue-end

GDBが (例えば、 backtraceコマンドによる出力の中で) 関数の引数を表示する際の註釈は以下のようになります。

^Z^Zarg-begin
argument-name
^Z^Zarg-name-end
separator-string
^Z^Zarg-value value-flags
the-value
^Z^Zarg-end

argument-nameは引数名です。 separator-stringは、 ユーザの利便のために、 その名前と値を区切る (例えば`='のような) テキストです。 value-flagsthe-valueの意味は、 value-history-beginの註釈の場合と同一です。

構造体を表示する際には、 GDBは以下のように註釈します。

^Z^Zfield-begin value-flags
field-name
^Z^Zfield-name-end
separator-string
^Z^Zfield-value
the-value
^Z^Zfield-end

field-nameはフィールド名です。 separator-stringは、 ユーザの利便のために、 その名前と値を区切る (例えば`='のような) テキストです。 value-flagsthe-valueの意味は、 value-history-beginの註釈の場合と同一です。

配列を表示する際には、 GDBは以下のように註釈します。

^Z^Zarray-section-begin array-index value-flags

array-indexは、 註釈される最初の要素のインデックスです。 value-flagsの意味は、 value-history-beginの註釈の場合と同一です。 この後に、 任意の数の要素が続きます。 要素は以下のように単一要素であることもあります。

`,' whitespace         ; 最初の要素については省略
the-value
^Z^Zelt

また、 繰り返し要素であることもあります。

`,' whitespace         ; 最初の要素については省略
the-value
^Z^Zelt-rep number-of-repititions
repetition-string
^Z^Zelt-rep-end

いずれの場合でも、 the-valueは要素の値を出力したものであり、 whitespaceには、 空白、 タブ、 改行が含まれます。 繰り返し要素の場合、 number-of-repititonsは、 その値を持つ配列要素が何個連続しているかを示す数です。 また、 repetition-stringは、 繰り返しが表現されていることをユーザに知らせるよう設計された文字列です。

配列のすべての要素が出力されると、 配列の註釈は以下によって終了します。

^Z^Zarray-section-end

フレーム

GDBがフレームを表示する際には、 常に註釈が加えられます。 例を挙げると、 GDBが停止したときに表示されるフレームや、 backtraceコマンドやupコマンド等の出力がこれに該当します。

フレームに対する註釈の先頭は以下のようになります。

^Z^Zframe-begin level address
level-string

levelはフレームの番号です (最下位のフレームが0で、 それ以外のフレームは正の数を取ります)。 addressは、 そのフレームにおいて実行中のコードのアドレスです。 level-stringは、 ユーザにレベル(フレーム番号)を知らせるよう設計された文字列です。 addressは、 `0x'の後ろに小文字の16進数が1つ以上続く形式になります。 (これが言語に依存しないことに注意してください)。 フレームの末尾は以下のようになります。

^Z^Zframe-end

これらの註釈の間にフレームの本体が入ります。 これは、 以下のものから構成されます。

表示

GDBがdisplayコマンドによって何かを表示するよう通知された場合、 表示結果に註釈が加えられます。

^Z^Zdisplay-begin
number
^Z^Zdisplay-number-end
number-separator
^Z^Zdisplay-format
format
^Z^Zdisplay-expression
expression
^Z^Zdisplay-expression-end
expression-separator
^Z^Zdisplay-value
value
^Z^Zdisplay-end

numberは表示の番号です。 number-separatorは、 ユーザのために、 この番号を後続の情報と区切るためのものです。 formatには、 サイズ、 形式、 および、 値の表示方法に関するその他の情報が含まれます。 expressionは、 表示対象となった式です。 expression-separatorは、 ユーザのために、 この式を後続のテキストと区切るためのものです。 valueが、 実際に表示された値です。

GDBの入力に対する註釈

プロンプトを表示して入力を要求する際、 GDBはそのことを註釈で示すことによって、 いつ情報を送信すべきなのか、 また、 あるコマンドからの出力の終わりがどこなのかを判別できるようにします。

異なる種類の入力はそれぞれ異なる入力タイプを持ちます。 個々の入力タイプには3種類の註釈があります。 pre-註釈は、 出力されているプロンプトの先頭を示すものです。 修飾されていない註釈(12)はプロンプトの終端を示します。 post-註釈は、 入力に関連付けられているかもしれないエコー出力の終端を示します。 例えば、 prompt入力タイプは以下のような註釈を提供します。

^Z^Zpre-prompt
^Z^Zprompt
^Z^Zpost-prompt

入力タイプには以下のものがあります。

prompt
GDBがコマンドの入力を要求しているときに出力されます。 (GDBのメイン・プロンプトです)。
commands
GDBが、 例えばcommandsコマンドにおけるように、 コマンドの集合を要求しているときに出力されます。 入力される個々のコマンドに対して、 註釈が繰り返されます。
overload-choice
いくつかのオーバーロードされた関数群の中から選択するよう、 GDBがユーザに対して要求しているときに出力されます。
query
潜在的な危険性を持つ操作を実行してもかまわないことを確認するよう、 GDBがユーザに対して要求しているときに出力されます。
prompt-for-continue
処理を継続するためにリターン・キーを押すよう、 GDBがユーザに対して要求しているときに出力されます。 注: これが正しく機能すると期待しないでください。 代わりに、 set height 0を使ってプロンプトを抑止してください。 註釈がある場合、 行数カウントに不具合があるからです。

エラー

^Z^Zquit

この註釈は、 GDBが割り込みに反応する直前に出力されます。

^Z^Zerror

この註釈は、 GDBがエラーに反応する直前に出力されます。

quit註釈とerror註釈は、 GDBによる未完了の註釈が突然終了してしまったことを示唆しています。 例えば、 value-history-begin註釈の後にerrorが出力された場合、 対応するvalue-history-endが表示されることを期待することはできません。 もっとも、 それが表示されないことを期待することもできません。 error註釈は、 GDBが即座にトップ・レベルにまで一気に復帰することを必ずしも意味するわけではありません。

quit註釈やerror註釈に先行して、 以下の表示が行われることがあります。

^Z^Zerror-begin

これとquit註釈やerror註釈との間の出力はすべてエラー・メッセージです。

今のところ警告メッセージにはまだ註釈が加えられていません。

ブレイクポイントに関する情報

info breakpointsコマンドの出力に対しては、 以下のような註釈が加えられます。

^Z^Zbreakpoints-headers
header-entry
^Z^Zbreakpoints-table

header-entryの構文はエントリ (下記参照) のそれと同一ですが、 データの代わりに、 個々のフィールドの意味をユーザに知らせるための文字列を含みます。 これに続いて任意個数のエントリが続きます。 あるフィールドがこのエントリには適合しない場合、 それは省略されます。 フィールドの末尾には空白類が含まれることがあります。 個々のエントリは、 以下のものから構成されます。

^Z^Zrecord
^Z^Zfield 0
number
^Z^Zfield 1
type
^Z^Zfield 2
disposition
^Z^Zfield 3
enable
^Z^Zfield 4
address
^Z^Zfield 5
what
^Z^Zfield 6
frame
^Z^Zfield 7
condition
^Z^Zfield 8
ignore-count
^Z^Zfield 9
commands

addressはユーザが利用することを想定したものである点に注意してください。 つまり、 その構文は言語に依存して変わるということです。

出力の終端は以下のようになります。

^Z^Zbreakpoints-table-end

失効通知

以下の註釈は、 何らかの状態が変更された可能性があることを通知するものです。

^Z^Zframes-invalid
フレーム (例えばbacktraceコマンドからの出力) が変更された可能性があることを示します。
^Z^Zbreakpoints-invalid
ブレイクポイントが変更された可能性があることを示します。 例えば、 ユーザがブレイクポイントを追加もしくは削除した場合です。

プログラムの実行

stepcontinueのようなGDBコマンドによってプログラムの実行が開始されると

^Z^Zstarting

が出力されます。 プログラムが停止すると

^Z^Zstopped

が出力されます。 stopped註釈に先行する様々な註釈によって、 どのようにプログラムが停止したのかが説明されます。

^Z^Zexited exit-status
プログラムが終了(exit)したときに表示されます。 exit-statusは終了ステータス (正常終了の場合は0、 それ以外の場合は0以外の値) です。
^Z^Zsignalled
プログラムがシグナルを受信したために終了したときに表示されます。 ^Z^Zsignalledの後に以下の註釈が続きます。
intro-text
^Z^Zsignal-name
name
^Z^Zsignal-name-end
middle-text
^Z^Zsignal-string
string
^Z^Zsignal-string-end
end-text
nameは、 SIGILLSIGSEGVのようなシグナルの名前です。 stringはシグナルの説明です。 例えば、 Illegal InstructionSegmentation faultのような文字列です。 intro-textmiddle-textend-textはユーザのために表示されるもので、 特定の形式はありません。
^Z^Zsignal
この註釈の構文はsignalledのそれによく似ていますが、 これによってGDBが言っていることは、 プログラムがシグナルを受信したということだけです。 シグナルを受信したために停止したとは言っていません。
^Z^Zbreakpoint number
プログラムが番号numberのブレイクポイントに到達したときに表示されます。
^Z^Zwatchpoint number
プログラムが番号numberのウォッチポイントに到達したときに表示されます。

ソースの表示

ソース・コードを表示する代わりに、 以下のような註釈が使われます。

^Z^Zsource filename:line:character:middle:addr

filenameはソース・ファイルの絶対ファイル名です。 lineは、 そのファイルの中の行番号です (ファイルの中の先頭行は1となります)。 characterは、 そのファイルの中の文字位置です (ファイルの中の先頭文字は0となります)。 (これは、 ほとんどのデバッグ形式において、 必ず行の先頭を指すことになります)。 middleの部分は、 addrが行の途中を指すときは`middle'となり、 addrが行の先頭を指すときは`beg'となります。 addrは、 表示されているソースに関連付けられているターゲット・プログラム内のアドレスです。 addrは、 `0x'の後ろに小文字の16進数が1つ以上続く形式となります (これは言語に依存しないことに注意してください)。

将来追加する可能性のある註釈

     - target-invalid
       ターゲットが変更された可能性があることを示す註釈
       (レジスタ、ヒープ内容、実行ステータスなど)。
       性能を向上するため、より高い精度をもって`registers-invalid'や
       `all-registers-invalid'を検出できるように徐々にしていきたいと考えています。
     - set/showパラメータに対する(失効通知を含む)体系的な註釈
     - 失効通知の候補リストを返す`info'


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