こんにちは、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