9.1. デバッグ方法#

9.1.1. デバッグ用ビルド方法#

デバッグ用にビルドすることにより、GDB上でのシンボル解決など開発時に得られる情報が多くなります。そのため、開発時はデバッグ用にMySQLとMroongaをビルドします。

注釈

片方だけデバッグ用ビルドにすると構造体のサイズなどが異なってしまうため、Mroongaがロードできなかったり、実行時にassertに引っかかったりしてうまく動作しません。

9.1.1.1. MySQLのデバッグ用ビルド方法#

MySQL :: 2.9.4 標準ソース配布を使用して MySQL をインストールするにある通り、CMakeのオプションに-DWITH_DEBUG=ONオプションを渡すことでデバッグ用にビルドすることができます。

ダウンロードからビルドまでの流れは以下の通りです。

$ mkdir -p ~/work/
$ cd ~/work/
$ wget https://cdn.mysql.com/Downloads/MySQL-8.4/mysql-8.4.2.tar.gz
$ tar xf mysql-8.4.2.tar.gz
$ cmake \
    -Smysql-8.4.2 \
    -Bmysql-8.4.2.build \
    -GNinja \
    -DCMAKE_BUILD_TYPE=Debug \
    -DCMAKE_INSTALL_PREFIX=/tmp/local \
    -DWITH_DEBUG=ON
$ cmake --build mysql-8.4.2.build

9.1.1.2. MariaDBのデバッグ用ビルド方法#

MySQLの代わりにMariaDBを使いたい場合でも、-DWITH_DEBUG=ONを使えます。

MariaDBをビルドする前にstorage/mroonga/(MariaDBにバンドルされているMroonga)を削除しなければいけないことに注意してください。

ダウンロードからビルドまでの流れは以下の通りです。

$ mkdir -p ~/work/
$ cd ~/work/
$ wget https://downloads.mariadb.org/rest-api/mariadb/11.4.3/mariadb-11.4.3.tar.gz
$ tar xf mariadb-11.4.3.tar.gz
$ rm -rf mariadb-11.4.3/storage/mroonga
$ cmake \
    -Smariadb-11.4.3 \
    -Bmariadb-11.4.3.build \
    -GNinja \
    -DCMAKE_BUILD_TYPE=Debug \
    -DCMAKE_INSTALL_PREFIX=/tmp/local \
    -DWITH_DEBUG=ON
$ cmake --build mariadb-11.4.3.build

9.1.1.3. Mroongaのデバッグ用ビルド方法#

MroongaはCMakeのオプションに--preset=debugを渡すことでデバッグ用にビルドすることができます。

注釈

Mroongaをビルドするには、必要なツールやライブラリーを事前にインストールする必要があります。

依存関係の詳細についてはその他を参照してください。

リポジトリのcloneからビルドまでの流れは以下の通りです。

$ cd ~/work/
$ git clone git@github.com:mroonga/mroonga.git
$ cmake \
    -Smroonga \
    -Bmroonga.mysql-8.4 \
    --preset=debug \
    -DCMAKE_INSTALL_PREFIX=/tmp/local \
    -DMYSQL_BUILD_DIR=$HOME/work/mysql-8.4.2.build \
    -DMYSQL_CONFIG=$HOME/work/mysql-8.4.2.build/scripts/mysql_config \
    -DMYSQL_SOURCE_DIR=$HOME/work/mysql-8.4.2
$ cmake --build mroonga.mysql-8.4

無事にビルドができたら以下のようにテストを実行してください。すべてのテストが[pass]になればデバッグ用ビルドは成功しています。

$ cd mroonga.mysql-8.4
$ ../mroonga/test/run-sql-test.sh

9.1.2. run-sql-test.shを使いこなす#

run-sql-test.shはデバッグの友。ここでは、その便利な使い方の一例をご紹介します。

9.1.2.1. 指定したテストを実行する#

何もオプションを渡さずにrun-sql-test.shを実行するとmysql-test/mroonga以下にある全てのテスト(*.test)が実行されてしまいます。

特定のテストだけを実行したい、という場合は次のようにしてテストを指定します。

$ ../mroonga/test/run-sql-test.sh ../mroonga/mysql-test/mroonga/storage/t/truncate.test

9.1.2.2. トレースを見る#

次のようにして--debugオプションをつけてテストを実行すると、関数の呼び出しなどが記録されます。

$ ../mroonga/test/run-sql-test.sh --debug ../mroonga/mysql-test/mroonga/storage/t/truncate.test

この呼び出しは${MySQLのビルドディレクトリ}/mysql-test/var/log/mysqld.1.traceに格納されます。

新しくメソッドを作成した場合はMRN_DBUG_ENTER_METHOD()/DBUG_RETURN()をメソッドの先頭/末尾に配置し、関数の呼び出しを記録するようにするとよいでしょう。

9.1.2.3. GDB を立ち上げる#

--manual-gdbオプションを指定することで、テストを実行する際にGDBを用いてデバッグをできます。

$ ../mroonga/test/run-sql-test.sh --manual-gdb ../mroonga/mysql-test/mroonga/storage/t/truncate.test

このために別のターミナルでgdbを実行する必要があります。gdbを実行するためのコマンドラインはrun-sql-test.shが表示します。