Thursday, February 17, 2011

動作中のmemcachedのログ出力レベルをGDBで無理やり変更する方法

memcached起動オプションで、-vvvをつけると標準エラー出力にログが表示される。
(-vvvオプションの詳細は、こことか詳しい。)

デバッグ目的で、起動中memcachedプロセスのログレベルをコマンドで変更したかったのだけど、動的にログレベルを変更するコマンドが見当たらない。

コマンドで用意されてなけりゃ、GDBで。
ということで、GDBでmemcachedプロセスにアタッチしてログ出力モード用の変数を無理やり変更したらできました(笑)

以下、手順を書いときます。


memcachedを-vつけずに起動(デバッグログ非表示モード)
kanbe@kanbe-laptop% ./memcached -p 11211 -r -B auto -C -m 10 -M -f 1.25 -I 1000000 -t 24 -c 256 -R 20

この状態で、telnetから適当にsetする。
memcachedプロセスの標準エラー出力には何も表示されない。


GDBでアタッチ

デバッグレベル用変数は、settings.verbose

verbose levelを最強にしてみる。(memcached起動オプションの-vvvと同じ)

(gdb) whatis settings
type = struct settings
(gdb) ptype settings
type = struct settings {
  size_t maxbytes;
  int maxconns;
  int port;
  int udpport;
  char *inter;
  int verbose;
  rel_time_t oldest_live;
  int evict_to_free;
  char *socketpath;
  int access;
  double factor;
  int chunk_size;
  int num_threads;
  char prefix_delimiter;
  int detail_enabled;
  int reqs_per_event;
  _Bool use_cas;
  enum protocol binding_protocol;
  int backlog;
  int item_size_max;
  _Bool sasl;
}
(gdb) p settings.verbose
$3 = 0
(gdb) set write on
(gdb) set settings.verbose = 3
(gdb) p settings.verbose
$4 = 3
(gdb) c
Continuing.

この状態でもう一回telnetからsetする
set ddddddddddddddddd 0 0 1
a
STORED

memcachedの標準エラー出力に以下が表示される
159: going from conn_read to conn_parse_cmd
<159 set ddddddddddddddddd 0 0 1 159: going from conn_parse_cmd to conn_nread > NOT FOUND ddddddddddddddddd
>159 STORED
159: going from conn_nread to conn_write
159: going from conn_write to conn_new_cmd
159: going from conn_new_cmd to conn_waiting
159: going from conn_waiting to conn_read

動いてるmemcachedプロセスのログレベルを変更できた!


参考

プログラムへのパッチ適用

No comments:

Post a Comment