この章では、 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からの出力です。
ユーザによって認識されている状態に影響を与えることなく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-flagsとthe-valueの意味は、
value-history-begin
の註釈の場合と同一です。
^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-flagsとthe-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
これらの註釈の間にフレームの本体が入ります。 これは、 以下のものから構成されます。
^Z^Zfunction-call function-call-stringfunction-call-stringは、 デバッグ対象のプログラム中の関数に対するGDBからの関数呼び出しに対してこのフレームが関連付けられていることを、 ユーザに知らせるよう設計されたテキストです。
^Z^Zsignal-handler-caller signal-handler-caller-stringsignal-handler-caller-stringは、 オペレーティング・システムによるシグナル・ハンドラ呼び出し機構に対してこのフレームが関連付けられていることを、 ユーザに知らせるよう設計されたテキストです (これは、 シグナル・ハンドラそのものに対応したフレームではなく、 シグナル・ハンドラを呼び出したフレームです)。
^Z^Zframe-address address ^Z^Zframe-address-end separator-stringaddressは、 そのフレームにおいて実行中のアドレスです (
frame-begin
註釈におけるものと同一のアドレスですが、
ユーザが利用することを想定した形式で表示されます。
具体的には、
構文が言語に依存して変わります)。
separator-stringは、
ユーザの利便のために、
このアドレスと後続の情報を区切るための文字列です。
続いて以下の情報が表示されます。
^Z^Zframe-function-name function-name ^Z^Zframe-args argumentsfunction-nameは、 そのフレームにおいて実行中の関数名です。 関数名が不明の場合は`??'となります。 argumentsはフレームに対する引数で まわりが丸括弧()で囲まれます (個々の引数に対しても個別に註釈が加えられます。 値参照)。 ソースの情報が利用できる場合、 それに対する参照情報が次に表示されます。
^Z^Zframe-source-begin source-intro-string ^Z^Zframe-source-file filename ^Z^Zframe-source-file-end : ^Z^Zframe-source-line line-number ^Z^Zframe-source-endsource-intro-stringは、 ユーザの利便のために、 この参照情報をそれ以前に表示されたテキストから区切るものです。 filenameはソース・ファイル名、 line-numberはそのファイル中における行番号です (最初の行が行1となります)。 GDBがフレームの発生源 (ライブラリ名、 ロード・セグメント名等。 現在のところこれはRS/6000上でのみ実行されます ) に関する情報を表示する際の註釈は以下のようになります。
^Z^Zframe-where information続いて、 このフレームに対応するソースが実際に表示されるのであれば (例えば
backtrace
コマンドの出力ではこのようなことは行われません)、
source
に対する註釈
(ソースの表示参照)
が表示されます。
この註釈は、
ほとんどの註釈とは異なり、
通常の場合に出力されるテキストに追加して表示されるのではなく、
通常の場合に出力されるテキストの代わりに表示されます。
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はそのことを註釈で示すことによって、 いつ情報を送信すべきなのか、 また、 あるコマンドからの出力の終わりがどこなのかを判別できるようにします。
異なる種類の入力はそれぞれ異なる入力タイプを持ちます。
個々の入力タイプには3種類の註釈があります。
pre-
註釈は、
出力されているプロンプトの先頭を示すものです。
修飾されていない註釈(12)はプロンプトの終端を示します。
post-
註釈は、
入力に関連付けられているかもしれないエコー出力の終端を示します。
例えば、
prompt
入力タイプは以下のような註釈を提供します。
^Z^Zpre-prompt ^Z^Zprompt ^Z^Zpost-prompt
入力タイプには以下のものがあります。
prompt
commands
commands
コマンドにおけるように、
コマンドの集合を要求しているときに出力されます。
入力される個々のコマンドに対して、
註釈が繰り返されます。
overload-choice
query
prompt-for-continue
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
step
やcontinue
のようなGDBコマンドによってプログラムの実行が開始されると
^Z^Zstarting
が出力されます。 プログラムが停止すると
^Z^Zstopped
が出力されます。
stopped
註釈に先行する様々な註釈によって、
どのようにプログラムが停止したのかが説明されます。
^Z^Zexited exit-status
^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-textnameは、
SIGILL
やSIGSEGV
のようなシグナルの名前です。
stringはシグナルの説明です。
例えば、
Illegal Instruction
やSegmentation fault
のような文字列です。
intro-text、
middle-text、
end-textはユーザのために表示されるもので、
特定の形式はありません。
^Z^Zsignal
signalled
のそれによく似ていますが、
これによってGDBが言っていることは、
プログラムがシグナルを受信したということだけです。
シグナルを受信したために停止したとは言っていません。
^Z^Zbreakpoint number
^Z^Zwatchpoint 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'