mysql-test-runでgdbをあげてみる

とりあえず、debugオプション付きのバイナリーをつくったので、
mysql-test-runにgdbオプション付きで簡単なクエリーを実行させようと思ったけど、
これがうまくいかない。。

インストール先の /usr/local/mysql/mysql-test の下で以下のような感じで試しました。

1. ./t/example.testというファイルをとりあえずつくる。
    こんな一行を書いて保存しておく。
  select 1;

2. 作ったテストを試してみるか
  $ ./mysql-test.run --record example

    All 1 tests were successful.
    The servers were restarted 1 times
    Spent 0.002 of 2 seconds executing testcases
    
    どうやらいけてるみたい。

3. じゃぁgdbオプション付きで動かすか
 
    $ ./mysql-test-run --gdb example
    :
    mysql-test-run: WARNING: Process 5854 died
    mysql-test-run: *** ERROR: Failed to start mysqld master
    
  あぁ。。なんか mysqld masterのスタートに失敗したとか言われてる。。
  ご機嫌ななめだなぁ。。
  さぁどうしよ。manual-gdbオプション叩いてみることにする。

4. manual-gdbで実行してみる
  $ ./mysql-test-run --manual-gdb example
      :
    To start gdb for master_0, type in another window:
    gdb -cd /usr/local/mysql/mysql-test -x /usr/local/mysql/mysql-test/var/tmp/gdbinit.master_0 /usr/local/mysql/libexec/mysqld
 
    gdbのコマンドが出てるんで、これを別窓で叩いてみる。
   :
  Version: '5.0.51-debug-log'  socket: '/usr/local/mysql/mysql-test/var/tmp/master.sock'  port: 9306  Source distribution
  [New Thread -1221166192 (LWP 5891)]
  [Switching to Thread -1221166192 (LWP 5891)]

  Breakpoint 1, mysql_parse (thd=0x86a6de8, inBuf=0x86de8f8 "select 1", length=8, found_semicolon=0xb7366f7c) at sql_parse.cc:6059
   6059      DBUG_ENTER("mysql_parse");
  (gdb) 

    おっ 見覚えのある画面に! これでいける?

    (gdb) break mysql_select
     Breakpoint 2 at 0x820d9ed: file sql_select.cc, line 2234. 

    (gdb) continue
     Continuing.

     Breakpoint 2, mysql_select (thd=0x86a6de8, rref_pointer_array=0x86a7ebc, tables=0x0, wild_num=0, 
     fields=@0x86a7e2c, conds=0x0, og_num=0, order=0x0, group=0x0,    having=0x0, proc_param=0x0, select_options=2156153344, result=0x86dea08, 
     unit=0x86a7b68, select_lex=0x86a7d98) at sql_select.cc:2234

    おっこれは、動いてるんじゃないでしょうか?
    backtraceも出してみる。

  (gdb) bt
  #0  mysql_select (thd=0x86a6de8, rref_pointer_array=0x86a7ebc, tables=0x0, wild_num=0, fields=@0x86a7e2c, conds=0x0, og_num=0, order=0x0, group=0x0, 
  having=0x0,proc_param=0x0, select_options=2156153344, result=0x86dea08, 
  unit=0x86a7b68, select_lex=0x86a7d98) at sql_select.cc:2234
  #1  0x0820e5aa in handle_select (thd=0x86a6de8, lex=0x86a7b10, result=0x86dea08, setup_tables_done_option=0) at sql_select.cc:256
  #2  0x081b701e in mysql_execute_command (thd=0x86a6de8) at sql_parse.cc:2676
  #3  0x081b80c7 in mysql_parse (thd=0x86a6de8, inBuf=0x86de8f8 "select 1", length=8, found_semicolon=0xb7366f7c) at sql_parse.cc:6123
  #4  0x081b8e63 in dispatch_command (command=COM_QUERY, thd=0x86a6de8, packet=0x86d68c9 "select 1", packet_length=9) at sql_parse.cc:1812
  #5  0x081ba375 in do_command (thd=0x86a6de8) at sql_parse.cc:1586
  #6  0x081bb071 in handle_one_connection (arg=0x86a6de8) at sql_parse.cc:1197
  #7  0xb7f3746b in start_thread () from /lib/tls/i686/cmov/libpthread.so.0
  #8  0xb7d516de in clone () from /lib/tls/i686/cmov/libc.so.6

  おぉーそれっぽい!

    どうやら動いたらしい。
  しかし --gdbではなぜ動かないんだろ。。
  これで地道に中をおってみるかな。
  
  スクリプトのオプションも他にもありそうだし、もう少し調べる予定。
  
 知ってる人に聞いてみると、
  debugするだけなら以下みたいにgdbで上げればいいだけみたい。
 $ sudo -u mysql gdb /usr/local/mysql/libexec/mysqld

 mysql-test-runを使うのは、回帰テストの時ってことらしい。