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


一連のコマンドのグループ化

ブレイクポイント・コマンド (ブレイクポイント・コマンド・リストを参照) とは別に、 一連のコマンドを一括して実行するために保存する方法を、 GDBは2つ提供しています。 ユーザ定義コマンドとコマンド・ファイルがそれです。

ユーザ定義コマンド

ユーザ定義コマンドとは、 ユーザが一連のGDBコマンドに単一コマンドとしての名前を新たに割り当てたものです。 これは、 defineコマンドによって行われます。 ユーザ・コマンドは、 空白で区切られた引数を最高で10個まで受け取ることができます。 引数は、 ユーザ・コマンドの中で$arg0...$arg9としてアクセスすることができます。 簡単な例を示すと:

define adder
  print $arg0 + $arg1 + $arg2

このコマンドを実行するには、以下のようにします。

adder 1 2 3

上の例では、 adderというコマンドを定義しています。 このコマンドは、 3つの引数の合計を表示します。 引数は文字列で代用されますので、 変数を参照することもできますし、 複雑な式を使うこともできます。 また、 下位関数の呼び出しを行うこともできます。

define commandname
commandnameという名前のコマンドを定義します。 同じ名前のコマンドが既に存在する場合は、 再定義の確認を求められます。 コマンドの定義は、 defineコマンドに続いて与えられる他のGDBコマンド行から構成されます。 これらのコマンドの末尾は、 endを含む行によって示されます。
if
評価される式である引数を1つだけ取ります。 その後に一連のコマンドが続きますが、 これらのコマンドは式の評価結果が真 (ゼロ以外の値) である場合にのみ実行されます。 さらに、 オプションでelse行が続き、 その後に、 式の評価結果が偽であった場合にのみ実行される一連のコマンドが続きます。 末尾は、 endを含む行によって示されます。
while
構文はifと似ています。 評価される式である引数を1つだけ取り、 その後に必ず、 実行されるべきコマンドが1行に1つずつ続き、 最後にendがきます。 コマンドは、 式の評価結果が真である限り、 繰り返し実行されます。
document commandname
ユーザ定義コマンドcommandnameのドキュメントを記述します。 このドキュメントはhelpコマンドによってアクセスできます。 コマンドcommandnameは既に定義済みでなければなりません。 このコマンドは、 defineコマンドが一連のコマンド定義を読み込むのと同様にして、 endで終わる一連のドキュメントを読み込みます。 documentコマンドの実行が完了すると、 コマンドcommandnameに対してhelpコマンドを実行すると、 ユーザの記述したドキュメントが表示されます。 documentコマンドを再度実行することによって、 コマンドのドキュメントを変更することができます。 defineコマンドによってコマンドを再定義しても、 ドキュメントは変更されません。
help user-defined
すべてのユーザ定義コマンドを一覧表示します。 個々のコマンドにドキュメントがあれば、 その1行目が表示されます。
show user
show user commandname
commandnameを定義するのに使われたGDBコマンドを表示します (ドキュメントは表示されません)。 commandnameを指定しないと、 すべてのユーザ定義コマンドの定義が表示されます。

ユーザ定義コマンドが実行されるときに、 定義内のコマンドは表示されません。 定義内の任意のコマンドにおいてエラーが発生すると、 ユーザ定義コマンドの実行が停止されます。 対話的に使われている場合には確認を求めてくるようなコマンドも、 ユーザ定義コマンドの内部で使われている場合には確認を求めることなく処理を継続します。 通常は実行中の処理に関してメッセージを表示するGDBコマンドの多くが、 ユーザ定義コマンドの中から呼び出されている場合にはメッセージを表示しません。

ユーザ定義コマンド・フック

特別な種類のユーザ定義コマンドであるフックを定義することができます。 `hook-foo'というユーザ定義コマンドが存在すると、 ユーザが`foo'というコマンドを実行するときにはいつも、 `foo'コマンドが実行される前に (引数のない) `hook-foo'が実行されます。 仮想コマンド`stop'というものが存在します。 (`hook-stop')を定義すると、 ユーザ・プログラムの実行が停止するたびに、 その定義内のコマンドが実行されます。 そのタイミングは、 ブレイクポイント・コマンドが実行される直前や、 自動表示の対象やスタック・フレームが表示される直前などです。 例えば、 シングル・ステップ実行をしている際にはSIGALRMシグナルを無視し、 通常の実行時には通常どおり処理したい場合には、 以下のように定義します。

define hook-stop
handle SIGALRM nopass
end

define hook-run
handle SIGALRM pass
end

define hook-continue
handle SIGLARM pass
end

GDBのコマンドのうち、 その名前が1つの単語から成るものには、 フックを定義することができます。 ただし、 コマンド・エイリアスにフックを定義することはできません。 フックは、 コマンドの基本名に対して定義しなければなりません。 例えば、 btではなくbacktraceを使います。 フックの実行中にエラーが発生すると、 GDBコマンドは停止します。 (ユーザが実際に指定したコマンドが実行する機会を与えられる前に) GDBはプロンプトを表示します。 既知のコマンドのいずれにも対応しないフックを定義しようとすると、 defineコマンドは警告メッセージを表示します。

コマンド・ファイル

GDBのコマンド・ファイルとは、 各行がGDBコマンドから成るファイルのことです。 (行の先頭が#の) コメントも含めることができます。 コマンド・ファイル内の空行は何も実行しません。 それは、 端末上での実行の場合とは異なり、 最後に実行されたコマンドの繰り返しを意味しません。 GDBを起動すると、 自動的に初期化ファイルからコマンドを読み込んで実行します。 これは、 `.gdbinit'という名前のファイルです。 GDBは、 ユーザのホーム・ディレクトリに初期化ファイルがあればまずそれを読み込み、 続いてコマンンドライン・オプションとオペランドを処理した後、 カレントな作業ディレクトリに初期化ファイルがあればそれを読み込みます。 このように動くのは、 ユーザのホーム・ディレクトリに初期化ファイルを置くことで、 コマンドライン・オプションやオペランドの処理に影響を与える (set complaintsのような) オプションを設定することができるようにするためです。 `-nx'オプションを使用すると、 初期化ファイルは実行されません。 モードの選択を参照。 GDBの設定のいくつかでは、 初期化ファイルは異なる名前で知られています (このような環境では、 特別な形式のGDBが他の形式のGDBと共存する必要があり、 そのために特別なバージョンのGDBの初期化ファイルには異なる名前が付られます)。 特別な名前の初期化ファイルを持つ環境には、 以下のようなものがあります。

また、 sourceコマンドによって、 コマンド・ファイルの実行を要求することもできます。

source filename
コマンド・ファイルfilenameを実行します。

コマンド・ファイルの各行は順番に実行されます。 コマンドの実行時に、 そのコマンドは表示されません。 どれか1つでもコマンドがエラーになると、 コマンド・ファイルの実行は停止されます。 対話的に使われている場合には確認を求めてくるようなコマンドも、 コマンド・ファイル内で使われている場合は確認を求めることなく処理を継続します。 通常は実行中の処理についてメッセージを表示するGDBコマンドの多くが、 コマンド・ファイルの中から呼び出されている場合にはメッセージを表示しません。

制御された出力を得るためのコマンド

コマンド・ファイルやユーザ定義コマンドの実行中には、 通常のGDBの出力は抑止されます。 唯一出力されるのは、 定義内のコマンドが明示的に表示するメッセージだけです。 本節では、 ユーザが希望するとおりの出力を生成するのに役に立つ3つのコマンドについて説明します。

echo text
textを表示します。 表示不可の文字も、 Cのエスケープ・シーケンスを使うことでtextの中に含めることができます。 例えば、 改行コードを表示するには`\n'を使います。 明示的に指定しない限り、 改行コードは表示されません。 標準的なCのエスケープ・シーケンスに加えて、 バックスラッシュの後に空白を置くと空白を表します。 これは、 先頭もしくは末尾に空白のある文字列を表示するのに便利です。 というのは、 こうしないと、 引数の先頭もしくは末尾の空白は削除されるからです。 ` and foo = 'を表示するには、 `echo \ and foo = \ 'を実行してください。 Cと同様、 textの末尾にバックスラッシュを置くことで、 コマンドを次の行以降に継続することができます。 例えば、
echo This is some text\n\
which is continued\n\
onto several lines.\n
echo This is some text\n
echo which is continued\n
echo onto several lines.\n
と同じ出力をもたらします。
output expression
expressionの値を表示し、 それ以外には何も表示しません。 改行コードも、 `$nn = 'も表示されません。 expressionの値は値ヒストリには含まれません。 式の詳細については、 を参照してください。
output/fmt expression
expressionの値を、 fmtで指定されるフォーマットで表示します。 printコマンドと同様のフォーマットを指定することができます。 詳細については、 出力フォーマットを参照してください。
printf string, expressions...
stringで指定された文字列にしたがってexpressionsの値を表示します。 複数のexpressionsはコンマで区切られ、 数値かポインタのいずれかを指定できます。 これらの値は、 ユーザ・プログラムからCのサブルーチン
printf (string, expressions...);
を実行した場合と同様に、 stringの指定にしたがって表示されます。 例えば、 次のようにして2つの値を16進数で表示することができます。
printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-foo
フォーマットを指定する文字列の中で使えるバックスラッシュ・エスケープ・シーケンスは、 バックスラッシュとそれに続く単一文字から構成される簡単なものだけです。


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