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


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

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

ユーザ定義コマンド

ユーザ定義コマンドとは、 一連の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行が続くことがあり、 この場合は、 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を指定しないと、 すべてのユーザ定義コマンドの定義が表示されます。

ユーザ定義コマンドが実行されるときに、 定義内のコマンドは表示されません。 定義内のコマンドがどれか1つでもエラーになると、 ユーザ定義コマンドの実行が停止されます。

対話的に使われている場合には確認を求めてくるようなコマンドも、 ユーザ定義コマンドの内部で使われている場合には確認を求めることなく処理を継続します。 通常は実行中の処理に関してメッセージを表示する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を起動すると、 自動的に初期化ファイルからコマンドを読み込んで実行します。 これは、 UNIX上では`.gdbinit'という名前のファイルであり、 DOS/Windows上では`gdb.ini'という名前のファイルです。 GDBは、 ユーザのホーム・ディレクトリ(10) に初期化ファイルがあればまずそれを読み込み、 続いてコマンンドライン・オプションとオペランドを処理した後、 カレントな作業ディレクトリに初期化ファイルがあればそれを読み込みます。 このように動くのは、 ユーザのホーム・ディレクトリに初期化ファイルを置くことで、 コマンドライン上のオプションやオペランドの処理に影響を与える (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]