Thursday, February 17, 2011

実行中のmemcachedプロセスをGDBでdebugする方法

アタッチするプロセス番号を取得
kanbe@kanbe-laptop% ps -aux |grep memcached
kanbe 26951 0.2 0.0 622312 1376 pts/1 Sl+ 11:34 0:00 ./memcached -vvv -p 11211 -r -B auto -C -m 10 -M -f 1.25 -I 1000000 -t 24 -c 256 -R 20 -L

process番号は26951

アタッチしてブレイクポイントをセット
cd /path/to/memcached_install_dir/bin
sudo gdb memcached
(gdb) attach 26951
(gdb) b slabs_alloc
(gdb) c
Continuing.
別端末からtelnetで適当にset
kanbe@kanbe-laptop% telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
set key 1 0 0 1
gdb上で該当threadに切り替わり、セットしたブレイクポイントのとこで止まる
[Switching to Thread 0x7f9b5adbd700 (LWP 26952)]
Breakpoint 1, slabs_alloc (size=60, id=1) at slabs.c:421
421 void *slabs_alloc(size_t size, unsigned int id) {

あとは、煮るなり焼くなり。

デタッチ
(gdb) detach
Detaching from program: /home/kanbe/work/memcached/bin/memcached, process 26951
!!!!!!!!!! 注意点 !!!!!!!!

attachした状態でrun, quitすると、memcachedプロセスが止まってしまう!!
(一応ほんとにプロセス止めるの?っていう確認メッセージが出る)

gdbを終了するときはdetachしてからquitで。

以下、既に実行中のプロセスのデバッグより引用

detach
アタッチされたプロセスのデバッグが終了した場合には、 detachコマンドを使用してそのプロセスをGDBの管理から解放することができます。 プロセスからディタッチしても、 そのプロセスは実行を継続します。 detachコマンド実行後は、 ディタッチされたプロセスと GDBは互いに完全に依存関係がなくなり、 attachコマンドによる別のプロセスへのアタッチや、 runコマンドによる別のプロセスの起動が可能になります。 detachコマンドを実行後RETキーを押しても、 detachコマンドは再実行されません。

プロセスがアタッチされている状態で、 GDBを終了したりrunコマンドを使用したりすると、 アタッチされたプロセスを終了させてしまいます。 デフォルトの状態では、 このようなことを実行しようとすると、 GDBが確認を求めてきます。 この確認処理を行うか否かは、 set confirmコマンドで制御可能です (オプションの警告およびメッセージ参照)。

参考ページ

Debugging with GDB

No comments:

Post a Comment