4. GDB の下でのプログラム実行方法

 GDB の下であなたのプログラムを起動する場合、`run' コマンドを 使います。プログラムは `exec-file' コマンドを使うか GDB の引数を 使うかして、既に指定されている必要があります(“2. GDB が扱うファイルの解説” をご覧下さい); `run' が行うことは、下位のプロセスを生成し、その中にプログラムを 読み込み、そして、その動作を設定することです。

 プログラムの実行は、その上位のプログラムから受け取った信頼できる情報に よって影響されます。GDB は、この情報を記述する方法を提供していますが、 あなたは、プログラムをスタートする前にこのことを行っておく必要があります。 (プログラム起動後も変更可能ですが、この変更は、あなたがプログラムを 再起動するまでは何も影響を与えません。) これらの情報は、次の3つのカテゴリーに分けられます:

引数
あなたは、プログラムに与える引数を `run' コマンドの引数として 指定することができます。

環境
プログラムは、通常、GDB から環境を受け継ぎます。しかし、GDB の `set environment'`unset environment' コマンドを使う ことで、プログラムに与えられる環境の一部を変更することができます。

ワーキングディレクトリ
プログラムは、GDB からワーキングディレクトリを引き継ぎます。 GDB の `cd' コマンドを使うことによって、GDB のワーキング ディレクトリを変更することができます。
 `run' コマンドの後、デバッガは、ただあなたのプログラムが停止 することを待ち続けます。“5. 停止と継続”を参照して下さい。

 あなたのプログラムがいったん `run' コマンドで起動されたならば、 下位の関数コールによってもたらされる式を評価できることを覚えておいて 下さい。“8.1 式”を参照して下さい。もし、あなたが関数を単にそれ自身の範囲で 評価したい場合、`set' コマンドを使うことができます。 “10.1 変数への代入”を参照して下さい。


4.1 あなたのプログラムに渡す引数

 あなたのプログラムに与える引数は、`run' コマンドの引数として 記述されます。これらはシェルに渡されるので、それゆえプログラムに 対してワイルドカード・キャラクタは展開され、I/Oリダイレクションは 正しく実行されます。

 引数なしの `run' は、前回に実行した `run' と同一の引数を 使います。

 `set args' というコマンドは、次にプログラムが動作する時に使われる 引数を指定する時に使います。もし、`set args' に引数がなかった 場合は、次のプログラムの実行には引数がないことを意味します。もし、 あなたが引数を指定してプログラムを実行した後、次に引数なしで実行したい 場合は、これがその唯一の方法です。


4.2 あなたのプログラムの環境

 環境とは、一そろいの環境変数と、その値から成り立ちます。 環境変数は、あなたのユーザ名、ホームディレクトリ、端末のタイプ、 そして実行プログラムのサーチパスといったものごとを伝統的に記録して います。普通、環境変数はシェルによって設定され、あなたが起動する 別のプログラムに継承されます。デバッギング時、デバッガから抜ける ことなく異なった環境でプログラムの実行を試みるのは結構便利です。
info environment varname
あなたのプログラムが起動された時に与えられる環境変数 varname の 値を表示します。このコマンドの省略形は `i env varname' です。

info environment
あなたのプログラムが起動された時に与えられる、全ての環境変数の 名称と値を表示します。このコマンドの省略形は `i env' です。

set environmen varname value
set environmen varname = value
環境変数 varnamevalue という値を設定します。 これは、あなたのプログラムのためだけのものであり、GDB 自身の内容は 変更されません。 value は任意の文字列です; 環境変数の値は単に文字列であって、解釈はあなたのプログラム自身によって 行われます。 value というパラメータはオプションであり; 省略された場合、 変数には null 値が設定されます。このコマンドは `set e' のように 省略できます。

例えば、次のコマンド:

set env USER = foo
は、プログラムに対して、起動直後、`foo' という名前のユーザが プログラムを実行していると仮定するように指示したことになります。

delete environment varname
unset environment varname
あなたのプログラムに渡される環境の中から、varname という変数を 削除します。これは、`set env varname =' とは異なります。 その理由は、`delete environment' は変数を値なしにするのに対し、 前の例の場合、空の値を認識できるからです。 このコマンドは `d e' のように省略できます。


4.3 あなたのプログラムのワーキングディレクトリ

 あなたがプログラムを `run' コマンドによって起動した時、それは ワーキングディレクトリを GDB のワーキングディレクトリから継承します。 GDB のワーキングディレクトリは、最初、その親プロセス (通常シェル) から継承されますが、`cd' コマンドを使って GDB の新しいワーキング ディレクトリを指定することができます。

 GDB のワーキングディレクトリは、コマンドへのデフォルト値として、 GDB を起動したディレクトリと同一の場所が供給されます。 “2. GDB が扱うファイルの解説”を参照して下さい。

cd directory
GDB のワーキングディレクトリに directory を設定します。

pwd
GDB のワーキングディレクトリを表示します。


4.4 あなたのプログラムへの入出力

 GDB の下で動作するあなたのプログラムは、デフォルトで GDB と同一の 端末を用いて入出力を行います。

 あなたは、プログラムの入出力に対するリダイレクトを、`run' コマンド への `sh'-スタイルのリダイレクションによって行うことができます。 例えば、

run > outfile
はプログラムを起動し、その出力を `outfile' に転換します。

 プログラムの入出力を指定する別の方法は、`tty' コマンドを使うと いうものです。このコマンドは引数としてファイル名を受け取り、結果として このファイルを `run' コマンドがこの後デフォルトで利用するように 設定します。これはまた、この後 `run' コマンドが起動した時のために、 チャイルドプロセスのための端末のコントロールをリセットします。例えば、

tty /dev/ttyb
`run' コマンドの直後に起動したプロセスがデフォルトで入出力を 行う端末を `/dev/ttyb' とし、それらの制御端末をそこに設定します。

 `tty' コマンド指定後の `run' による明白なリダイレクトは 入出力リダイレクトとして有効であり、制御端末には有効になりません。

 あなたが `tty' コマンドやリダイレクトによる入力のある `run' コマンドを使った場合、それはあなたのプログラムの入力 だけに影響を及ぼします。GDB への入力は、依然、あなたの端末から 受け取られます。


4.5 既に起動しているプロセスのデバッギング

 あるオペレーティング・システムは、GDB に対して、GDB の外部から 起動された既に動作しているプロセスのデバッグを許可しています。 これを行うには、`run' コマンドのかわりに `attach' コマンドを 使います。

 `attach' コマンドは、あなたがデバッグしたいプロセスのプロセス-IDと いう一つの引数のみ受け付けます。(プロセスのプロセス-IDを見つけ出す 一般的な方法は、ps ユーティリティを使うことです。)

 このアレンジの後で、プロセスをデバッグするために GDB が最初に行う ことは、それを止めることです。あなたは、普通、プロセスを `run' で 起動した場合に可能な全ての GDB のコマンドを使って、所属したプロセスに 対して調査と修整をかけることができます。 ブレークポイントの挿入、ステップ実行や継続、記憶領域の修整も可能です。 もし、GDB にプロセスを所属させた後で、あなたがそのプロセスに対して 実行の継続を望むのなら、`continue' コマンドを使うことができます。

 所属させられたプロセスに対するデバッグが終了したならば、それを GDB の 管理下から解放するために `detach' コマンドを使うことができます。 `detach' コマンドの後、そのプロセスと GDB は完全に無関係な状態と なり、他のプロセスを `attach' したり、`run' を実行したり できるようになります。

 もし、`run' コマンドによって所属させられているプロセスが存在する 間にあなたが GDB を終了する場合、あなたは、そのプロセスを kill する ことになります。あなたは、このことを実施していいかどうかの承認について 尋ねられることになります。

 `attach' コマンドは、また、シリアル接続を通したリモートマシンの デバッグにも用いられます。詳しくは、“14.1 リモート・デバッギング用のコマンド” を参照して下さい。


4.6 チャイルドプロセスを kill するには

kill
GDB の下で走っているデバッグ対象プログラムである、チャイルドプロセスを kill します。

このコマンドは、コアダンプをデバッグする場合の代用として便利なものです。 GDB は、プログラムが実際に動作している場合コアダンプ・ファイルを無視 しますので、`kill' コマンドが、コアダンプ・ファイルを再び利用 させるための唯一の方法です。

これはまた、プログラムをいったんデバッガの外で起動した後、再びその デバッグに戻りたいような場合にも便利です。

`kill' コマンドは、更に、多くのシステムでプロセスとして動作して いるので修整不能な実行可能ファイルから、プログラムをリコンパイル・ 再リンクしたいような場合にも利用できます。しかし、このような場合は、 あなたが新しいバージョンとして望む、リコンパイルされたプログラムの新しい シンボルテーブルを必要とする前に、いったん GDB から抜けて GDB を リスタートすることが、このことを行う最も簡単な方法です。


目次に戻る