gdbserver - GNU デバッガー用リモートサーバー
gdbserver comm prog [args...]
gdbserver --attach comm pid
gdbserver --multi comm
gdbserver は、デバッグ対象のプログラムを実行しているマシンとは異なるマシン上で GDB を実行することを可能にするプログラムです。
使用方法 (サーバー(ターゲット)側):
まず、デバッグ対象のプログラムのコピーをターゲットシステムに用意します。 gdbserver は、 シンボルを関知しないので、 使用スペースを節約するためにプログラムからシンボルを取り除く (strip する) のでも構いません。 すべてのシンボルの処理は、ホストシステム上において動作する GDB が行います。
サーバーを使用するためには、ターゲットシステムにログインし、gdbserver プログラムを実行します。 その際には (a) GDB との通信方法、 (b) プログラム名、 (c) プログラムへの引数 を指定する必要があります。 一般的な書式は以下のようになります。
target> gdbserver <comm> <program> [<args> ...]
たとえば、シリアルポートを使用する場合は、以下のようになります。
target> gdbserver /dev/com1 emacs foo.txt
この例では、gdbserver に対して、emacs に引数 foo.txt を与えてデバッグすることを指定しています。 そして GDB との通信に /dev/com1 を使用します。 gdbserver は、ホストの GDB が通信して来ることを辛抱強く待ちます。
TCP 接続を使用する場合は、以下のようになります。
target> gdbserver host:2345 emacs foo.txt
この例では、ホストの GDB との通信に TCP
を用いる以外は、前の例と同じです。 引数 host:2345
は、host
からの TCP 接続が ローカルの TCP ポート 2345
に接続されるのを待つ、という意味です。 (現状では host
部は無視されます。) ターゲットシステムで存在する TCP
ポートとの衝突が無ければ、ポート番号は自由に選ぶことができます。
ホストの GDB の target
remote コマンドで、
同じポート番号を指定する必要があります。
他のサービスと衝突するポート番号を 選んだ場合、
gdbserver はエラーメッセージを出力して終了します。
gdbserver は、 実行中のプログラムに接続することができます。 これを行うには --attach 引数を使用します。 書式は次の通りです。
target> gdbserver --attach <comm> <pid>
pid は現在実行中のプロセスのプロセス ID です。 gdbserver に実行中のプロセスのバイナリを指定する必要はありません。
初期起動するコマンド、 あるいはアタッチするプロセス ID を指定せずに
gdbserver
を起動するには、 コマンドラインオプション
--multi を用います。 この場合は、
target extended-remote
を利用して、デバッグしたいプログラムを起動して連携することが必要です。
target> gdbserver --multi <comm>
使用方法 (ホスト側):
GDB がシンボルテーブルを検査したりするため、 ホストシステムには、
ターゲットプログラムのシンボルが取り除かれていない (strip されていない)
コピーが必要です。 通常の場合同様、
最初の引数にターゲットプログラムを指定して GDB を起動します。
(シリアル回線のボーレート (baud rate) が 9600
以外の場合は、--baud
オプションの指定が必要になります。) つまり、gdb TARGET-PROG
あるいは gdb --baud BAUD
TARGET-PROG のように起動します。
その後、新たに覚える必要のあるコマンドは、target
remote
(あるいは target extended-remote
) だけです。
コマンドの引数は、デバイス名 (通常 /dev/ttyb
のようなシリアルデバイス) か、 HOST:PORT
記述子です。
たとえば、
(gdb) target remote /dev/ttyb
は、シリアル回線 /dev/ttyb を使用してサーバーと通信します。また、
(gdb) target remote the-target:2345
は、TCP 接続で、ホスト `the-target' の gdbserver を起動した時に指定したポートと同じポート 2345 を使用してサーバーと通信します。 TCP 接続の場合、 `target remote' コマンドを実行する前に gdbserver を実行しておく必要があります。 そうしないと、`Connection refused' というようなエラーになるでしょう。
gdbserver では、 一度に複数の inferior
オブジェクトをデバッグできます。 これについては GDB マニュアルの
Inferiors Connections and Programs
ノードにおいて説明しています。 Ω- シェルコマンドでは
info -f gdb -n Inferiors Connections and
Programs
とします。 この場合は、 GDB コマンドの別の形である
extended-remote
GDB を実行します。
(gdb) target extended-remote the-target:2345
gdbserver オプションである --multi は、 この場合に使っても使わなくてもかまいません。
gdbserver の起動方法には 3 つのモードがあります。
プログラム名指定によるプログラムデバッグ gdbserver <comm>
<prog> [<args>...] パラメーター comm は、サーバーが
GDB と通信するための方法を指定します。 その値は、デバイス名
(シリアル回線利用時)、 TCP ポート番号 (:1234
)、
-
または stdio
(gdbserver
の標準入出力利用時) のいずれかです。 デバッグするプログラム名は
prog に指定します。 残りの引数は、
そのままプログラムに受け渡されます。 プログラムが終了すると、 GDB
が接続を閉じ、gdbserver
は終了します。
プログラム実行中のプロセス ID を指定したプログラムデバッグ
gdbserver --attach <comm> <pid> パラメーター comm
については前述済です。 実行しているプログラムのプロセス ID を
pid に指定します。 後は GDB がすべてを処理します。
前項目のモードと同じように、プロセス pid が終了すると、 GDB
が接続を閉じ、 gdbserver
は終了します。
マルチプロセスモード Ω- 複数のプログラム/プロセスのデバッグ gdbserver --multi <comm> このモードにおいては、 GDB が gdbserver に対して実行コマンドを指示します。 上のそれまでの 2 つのモードとは違って、 デバッグされていたプロセスが終了しても、 GDB は接続を閉じません。 したがって同一セッション内において、 複数のプロセスをデバッグすることができます。
いずれのモードにおいても、 以下のオプションが指定できます。
短い説明つきで、 すべてのオプションを表示します。
このオプションにより gdbserver はバージョン番号を表示して終了します。
gdbserver は実行中プログラムにアタッチします。 その文法は以下のとおりです。 target> gdbserver --attach <comm> <pid> pid は現在実行中のプロセスのプロセス ID です。 gdbserver に実行中のプロセスのバイナリを指定する必要はありません。
初期起動するコマンド、 あるいはアタッチするプロセス ID を指定せずに
gdbserver
を起動するには、
このコマンドラインオプションを用います。 そして
target extended-remote
を利用して、
デバッグしたいプログラムを起動します。 その文法は以下のとおりです。
target> gdbserver --multi <comm>
gdbserver
に対して、
デバッグ処理における追加ステータス情報を表示するように指示します。
このオプションは gdbserver
開発向けとして、
開発およびバグ報告に用いることを意図しています。
gdbserver
に対して、
リモートプロトコルによるデバッグ出力を行うことを指示します。
このオプションは gdbserver
開発向けとして、
開発およびバグ報告に用いることを意図しています。
gdbserver
に対して、デバッグ出力を指定した
filename に書き出すことを指示します。 このオプションは
gdbserver
開発向けとして、
開発およびバグ報告に用いることを意図しています。
gdbserver
に対して、
デバッグ出力の各行に追加情報を含めることを指示します。
デバッグを行うために起動するプログラムのラッパーを指定します。
このオプションに続けて、 ラッパー名を指定することが必要です。
ラッパーに受け渡すコマンドライン引数があれば、続けて記述します。
--
を記述して、 ラッパーへの引数の終わりを指示します。
デフォルトで gdbserver は TCP ポートを開いたまま、
待ち続けます。 したがって追加で接続することが可能です。 ただし
gdbserver
に --once
オプションをつけて実行すると、 最初の GDB セッションの接続を終えたら、
ポートの待ち受けを停止して、 それ以上の接続は行いません。
GDB の完全なドキュメントは Texinfo
マニュアルとしてメンテナンスされています。info
と
gdb
の両プログラム、および GDB の Texinfo
ドキュメントが適切にインストールされていれば、以下のコマンド
info gdb
を実行して完全なマニュアルを参照できます。
Using GDB: A Guide to the GNU Source-Level Debugger, Richard M. Stallman and Roland H. Pesch, July 1991.
Copyright (c) 1988-2022 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being Free Software and Free Software Needs Free Documentation, with the Front-Cover Texts being A GNU Manual, and with the Back-Cover Texts as in (a) below.
(a) FSF の裏表紙には、 以下の文章が記述されています: You are free to copy and modify this GNU Manual. Buying copies from GNU Press supports the FSF in developing GNU and promoting software freedom.