コンパイルしたマシンと別のマシンで動作しているプログラムをgdbデバッグする方法のメモ。
プログラムを動かすサーバにgdbserverをインストールする。インストールはyumから出来る。
# yum install gdb-gdbserver
接続を受け付けるIPアドレスとポートを引数で指定し、起動済みプロセスのPIDを指定してgdbserverを起動。
# gdbserver 10.0.0.1:54321 --attach 16781
コンパイルマシンの方でgdbを立ち上げ、target remoteで、gdbserver起動時に指定したIPアドレス、ポート番号を指定してアタッチする。
$ gdb prog (gdb) target remote 10.0.0.1:54321 Remote debugging using 10.0.0.1:54321 [New Thread 16781] Malformed packet(b) (missing colon): re:2; Packet: 'T0505:786a8ebf;04:406a8ebf;08:2454e400;thread:418d;core:2;'
gdbとgdbserverのバージョンが違うとダメらしい。
gdbのバージョンが6.8-27.el5だったので、そのバージョンのgdbserverをbuildする。
$ tar xjf gdb-6.8a.tar.bz2 $ cd gdb-6.8/ /tmp/gdb-6.8 $ cd gdb/gdbserver /tmp/gdb-6.8/gdb/gdbserver $ ./configure --prefix=/usr/local $ make $ sudo make install
今回の動作環境では、コンパイルしたサーバとプログラム実行するサーバで、ライブラリのバージョンが違うためうまく動かなかった。
ライブラリバージョンが合えば使えるはず。。
gdbserver: error initializing thread_db library: version mismatch between libthread_db and libpthread
なお、gdbでのデバッグ終了時はdetachで終了すること。 exitで終了すると、リモートサーバ側のプロセスが終了してしまうので注意要。
参考:
BuildingCrossGDBandGDBserver - GDB Wiki
GDB/GDBserverによるクロスターゲットのリモートデバッグ 3ページ | SourceForge.JP Magazine