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
は接続を閉じません。
したがって同一セッション内において、
複数のプロセスをデバッグすることができます。
いずれのモードにおいても、
以下のオプションが指定できます。
- --help
- 短い説明つきで、
すべてのオプションを表示します。
- --version
- このオプションにより
gdbserver
はバージョン番号を表示して終了します。
- --attach
-
gdbserver
は実行中プログラムにアタッチします。
その文法は以下のとおりです。
target> gdbserver --attach <comm> <pid>
pid
は現在実行中のプロセスのプロセス
ID です。 gdbserver
に実行中のプロセスのバイナリを指定する必要はありません。
- --multi
- 初期起動するコマンド、
あるいはアタッチするプロセス
ID を指定せずに "gdbserver"
を起動するには、
このコマンドラインオプションを用います。
そして "target extended-remote"
を利用して、
デバッグしたいプログラムを起動します。
その文法は以下のとおりです。
target> gdbserver --multi <comm>
- --debug
- "gdbserver"
に対して、
デバッグ処理における追加ステータス情報を表示するように指示します。
このオプションは
"gdbserver"
開発向けとして、
開発およびバグ報告に用いることを意図しています。
- --remote-debug
- "gdbserver"
に対して、
リモートプロトコルによるデバッグ出力を行うことを指示します。
このオプションは
"gdbserver"
開発向けとして、
開発およびバグ報告に用いることを意図しています。
-
--debug-file=filename
- "gdbserver"
に対して、デバッグ出力を指定した
filename
に書き出すことを指示します。
このオプションは
"gdbserver"
開発向けとして、
開発およびバグ報告に用いることを意図しています。
-
--debug-format=option1[,option2,...]
- "gdbserver"
に対して、
デバッグ出力の各行に追加情報を含めることを指示します。
- --wrapper
- デバッグを行うために起動するプログラムのラッパーを指定します。
このオプションに続けて、
ラッパー名を指定することが必要です。
ラッパーに受け渡すコマンドライン引数があれば、続けて記述します。
"--" を記述して、
ラッパーへの引数の終わりを指示します。
- --once
- デフォルトで
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."