9.1. デバッグ方法 — Mroonga vmrn_version documentation

本文へスキップ
`Ctrl`+`K`

# 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/
    $ release_id=$(curl -s https://downloads.mariadb.org/rest-api/mariadb/ \
        | jq -r '.major_releases[] | select(.release_support_type == "Long Term Support" and .release_status == "Stable") | .release_id' \
        | head -n1)
    $ version=$(curl -s https://downloads.mariadb.org/rest-api/mariadb/$release_id \
        | jq -r '.releases[].release_id' \
        | head -n1)
    $ wget https://downloads.mariadb.org/rest-api/mariadb/$version/mariadb-$version.tar.gz
    $ tar xf mariadb-$version.tar.gz
    $ rm -rf mariadb-$version/storage/mroonga
    $ cmake \
        -Smariadb-$version \
        -Bmariadb-$version.build \
        -GNinja \
        -DCMAKE_BUILD_TYPE=Debug \
        -DCMAKE_INSTALL_PREFIX=/tmp/local \
        -DWITH_DEBUG=ON
    $ cmake --build mariadb-$version.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`が表示します。