9.1. デバッグ方法

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

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

注釈

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

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

MySQL :: 2.9.4 Installing MySQL Using a Standard Source Distribution にある通り、CMakeのオプションに -DWITH_DEBUG=yes オプションを渡すことでデバッグ用にビルドすることができます。

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

% mkdir -p ~/work/
% cd ~/work/
% wget https://cdn.mysql.com/Downloads/MySQL-8.0/mysql-boost-8.0.29.tar.gz
% tar xvzf mysql-boost-8.0.29.tar.gz
% mkdir mysql-8.0.29-build
% cd mysql-8.0.29-build
% cmake ../mysql-8.0.29 \
    -DCMAKE_INSTALL_PREFIX=/tmp/local \
    -DWITH_DEBUG=yes \
    -DWITH_BOOST=../mysql-8.0.29/boost
% make

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

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

注釈

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

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

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

% cd ~/work/
% git clone git@github.com:mroonga/mroonga.git
% cd mroonga
% ./autogen.sh
% ./configure --with-debug \
              --prefix=/tmp/local \
              --with-mysql-source=$HOME/work/mysql-8.0.29 \
              --with-mysql-config=$HOME/work/mysql-8.0.29-build/scripts/mysql_config \
              --with-mysql-build=$HOME/work/mysql-8.0.29-build
% make

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

% 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) が実行されてしまいます。

特定のテストだけを実行したい、という場合は次のようにしてテスト名を --do-test オプションに渡します。

./test/run-sql-test.sh --do-test=foobar

9.1.2.2. トレースを見る

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

./test/run-sql-test.sh --debug --do-test=foobar

この呼び出しは ${MySQLの作業ディレクトリ}/${MySQLのバージョン}/mysql-test/var/log/mysqld.1.trace に格納されます。

新しく関数を作成した場合は MRN_DBUG_ENTER_FUNCTION 関数の先頭に配置し、関数の呼び出しを記録するようにすると良いでしょう。

9.1.2.3. GDB を立ち上げる

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

./test/run-sql-test.sh --gdb