mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

gdbでリモートデバッグ

コンパイルしたマシンと別のマシンで動作しているプログラムを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