ブレイクポイント・コマンド (ブレイクポイント・コマンド・リスト参照) とは別に、 一連のコマンドを一括して実行するために保存する2つの方法を、 GDBは提供しています。 ユーザ定義コマンドとコマンド・ファイルがそれです。
ユーザ定義コマンドとは、
一連のGDBコマンドに単一コマンドとしての名前を新たに割り当てたものです。
これは、
define
コマンドによって行われます。
ユーザ・コマンドは、
空白で区切られた引数を最高で10個まで受け取ることができます。
引数は、
ユーザ・コマンドの中で、
$arg0...$arg9としてアクセスすることができます。
簡単な例を以下に示します。
define adder print $arg0 + $arg1 + $arg2
このコマンドを実行するには以下のようにします。
adder 1 2 3
上の例では、
adder
というコマンドを定義しています。
このコマンドは、
3つの引数の合計を表示します。
引数にはテキストの置換機能が働きますので、
変数を参照することもできますし、
複雑な式を使うこともできます。
また、
下位関数の呼び出しを行うこともできます。
define commandname
define
コマンドに続いて与えられる、
他のGDBコマンド行から構成されます。
これらのコマンドの終端は、
end
を含む行によって示されます。
if
else
行が続くことがあり、
この場合は、
else
行の後に、
式の評価結果が偽であった場合にだけ実行される一連のコマンドが続きます。
終端は、
end
を含む行によって示されます。
while
if
と似ています。
引数として、
評価の対象となる式を1つだけ取ります。
その後には、
実行されるべきコマンドが1行に1つずつ続き、
最後にend
がなければなりません。
コマンドは、
式の評価結果が真である限り、
繰り返し実行されます。
document commandname
help
コマンドによってアクセスできます。
コマンドcommandnameは既に定義済みでなければなりません。
このコマンドは、
define
コマンドが一連のコマンド定義を読み込むのと同様に、
end
で終わる一連のドキュメントを読み込みます。
document
コマンドの実行が完了すると、
コマンドcommandnameに対してhelp
コマンドを実行すると、
ユーザの記述したドキュメントが表示されます。
document
コマンドを再度実行することによって、
コマンドのドキュメントを変更することができます。
define
コマンドによってコマンドを再定義しても、
ドキュメントは変更されません。
help user-defined
show user
show user 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
コマンド・ファイルの各行は順番に実行されます。 コマンドの実行時に、 そのコマンドは表示されません。 どれか1つでもコマンドがエラーになると、 コマンド・ファイルの実行は停止されます。
対話的に使われている場合には確認を求めてくるようなコマンドも、 コマンド・ファイル内で使われている場合は確認を求めることなく処理を継続します。 通常は実行中の処理についてメッセージを表示するGDBコマンドの多くが、 コマンド・ファイルの中から呼び出されている場合にはメッセージを表示しません。
コマンド・ファイルやユーザ定義コマンドの実行中には、 通常のGDBの出力は抑止されます。 唯一出力されるのは、 定義内のコマンドが明示的に表示するメッセージだけです。 ここでは、 ユーザが希望するとおりの出力を生成するのに役に立つ、 3つのコマンドについて説明します。
echo 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
output/fmt expression
print
コマンドと同じフォーマットを指定することができます。
詳細については、
出力フォーマット
を参照してください。
printf string, expressions...
printf (string, expressions...);を実行した場合と同様に、 stringの指定にしたがって表示されます。 例えば、 次のようにして2つの値を16進数で表示することができます。
printf "foo, bar-foo = 0x%x, 0x%x\n", foo, bar-fooフォーマットを指定する文字列の中で使えるバックスラッシュ・エスケープ・シーケンスは、 バックスラッシュとそれに続く単一文字から構成される簡単なものだけです。