FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

MySQLをVSCodeでdebugしてみる。

こんにちは、FLINTERSでエンジニアをやっている阿部といいます。

こちらはFLINTERSの ☔️梅雨にも負けないブログ祭り☔️ 企画の記事です。

テーマは #MySQL #技術 #データベース です。

今回はMySQLのソースコードをVSCodeでdebugできるかやってみました!

試したPC環境

こんな感じです。

$ uname  --kernel-release  --hardware-platform 
5.14.21-150400.24.100-default x86_64
$ cat /etc/SUSE-brand 
openSUSE
VERSION = 15.4

ソースコードを拾ってくる。

MySQLのソースコードがGithubで公開されているので、そこから拾ってきました。

せっかくなので、最新の8.4でためしてみます。

$ git clone https://github.com/mysql/mysql-server.git
$ git fetch origin --tag
$ git checkout -b debug/mysql-8.4.0 mysql-8.4.0

事前に必要なものをセットアップ

公式ページに必要なものは書いてあるのですが、どうも私の環境では足りないものが多かったです。

今回は、以下を追加インストールしたので、ご参考までに晒しておきます...

rpcgen
libtirpc3 
libstdc++6

ビルドしよう!

さあビルドだといきたいところなのですが、LANG変数が ja_JP.UTF-8 だとcmakeがコケる罠にはまったので、LANGを変更しておきます...

※このあたりで参考にしたサイトはブログ末尾にまとめています。

$ export LANG=C

また、cmakeのパラメータには、gcc/g++を明示的にversion10であることを指定する必要がありました。 (これは単に複数バージョン入っているせいかもしれない...)

$ mkdir ./build && cd ./build && mkdir ./boost

$ cmake .. \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=./boost \
-DCMAKE_C_COMPILER=gcc-10 \
-DCMAKE_CXX_COMPILER=g++-10 \
-DCMAKE_CXX_COMPILER_VERSION=10 \
-DCMAKE_BUILD_TYPE=Debug \
-Dprotobuf_BUILD_SHARED_LIBS=OFF

$ make -j2 #並列度はローカルマシンのスペック次第で。。

mysqlを初期化する

インスタンスを初期化し、debugモードで起動します。

/build/bin/mysqld --initialize

./build/bin/mysqld --debug

またrootユーザのパスワードを変更しておきます。(初期パスワードは/build/bin/mysqld --initializeの実行時に出力されます。

$ ./build/bin/mysql -u root -p 
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY "set secure password...!";

再度入り直して、SQLを叩けることを確認します。

mysql> SELECT space , name , state FROM information_schema.innodb_tablespaces;
+------------+------------------+--------+
| space      | name             | state  |
+------------+------------------+--------+
| 4294967294 | mysql            | normal |
| 4294967293 | innodb_temporary | normal |
| 4294967279 | innodb_undo_001  | active |
| 4294967278 | innodb_undo_002  | active |
|          1 | sys/sys_config   | normal |
+------------+------------------+--------+
5 rows in set (0.00 sec)

大丈夫そう。

VSCodeの設定

VSCodeでデバッグ実行するために launch.json を作ります。

以下のJSONファイルを launch.json の名前で .vscode ディレクトリに保存しておきます。

{
    "configurations": [
        {
            "name": "gdb launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/bin/mysqld",
            "args": ["--debug"],
            "stopAtEntry": false,
            "environment": [],
            "externalConsole": false,
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": false
                }
            ]
        }
    ]
}

デバックしてみよう〜

実際に試してみます。

なんでもいいんですが、なんとなくtablespaceまわりがよくわからんなーという今日この頃なので、tablespaceを作成してるくさいfunctionあたりにブレークポイントを貼ってみます。

こいつでいいのか...?

VSCodeからMySQLをdebug起動したいので、先ほどつくったlaunch.jsonでの name を指定してデバック実行します。

で、CREATE TABLESPACE を打ってみると、、

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENGINE=INNODB;

ブレークポイントに止まったことが確認できました。

抜ければclient側の結果も帰ってきてるのでOK。

Query OK, 0 rows affected (5 min 51.14 sec)

おわりに

若干駆け足になってしまいましたが、とりあえず動いたのでよかったです。

ただやってみて思ったのですが、やはりコードの量が量だからか、アウトライン解析あたりが重くて、 私の自宅貧弱PCではちょいちょいVSCodeが悲鳴を上げてました...

参考

今回のブログ執筆にあたって、以下を参考にさせていただきました。感謝ですm( )m