とりあえず、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を使うのは、回帰テストの時ってことらしい。