mysql CLCをWindows10上でデバッグするメモ

先日、Windows 10 上であっさりと mysql.exe が落ちる事象について書きました。
sakaik.hateblo.jp

早速、yoku0825 さんがバグ報告を上げてくださったので、対応されるのが楽しみです。
bugs.mysql.com


あとは本家の対応待ちでも良いのですが、あまりにも落ち方が潔かったので、ちょっと覗いてみたくなったので、やってみました。この日記は、Windows 10 上での mysql command line client (mysql CLC)のデバッグ環境のつくりかたのメモです。私のPCには一応、Visual Studio Community 2019 が入っているので、それを使います。MySQLサーバは動作済みであるものとします(今回ビルドするクライアントで、既に動作中のサーバに接続する、ということをやります)

ソースのダウンロードと展開

 今回は、mysql-8.0.22.zip を用意(当然、リリース直後にDL済み:-))。適当なフォルダに展開(今回は D:\work\mysql-8.0.22\)

Visual Studio 用のファイル群の作成(cmake)

 cmakeを使って、Windows用でビルドするための ソリューションファイルとかを生成させます。ソース内の client フォルダに移動してから実行します。私の環境では cmake にパスを通していなかったので、長々とフルパス指定で実行しました。 BOOST ライブラリをダウンロードする指定をせよ、とエラーになったので、指定しています。また、-G で指定する開発環境は、VS2018 までは 64ビット版用に Win64 という文字を付加していたのですが、2019ではなくなった、または、別オプションで指定することになったようです(古いブログを真似して Win64 を付けたりするとエラーになります)。

D:\work\mysql-8.0.22\client>"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake"  .. -DDOWNLOAD_BOOST=1 -DWITH_BOOST=. -G "Visual Studio 16 2019"

 これで sln ファイルが生成されました

Visual Studio の起動とプロジェクトの読み込みとビルド

 ファイル-開く-プロジェクト・ソリューション で、client フォルダ内の MySQL.sln を指定してひらきます。
次に、右ペインにある「ソリューションエクスプローラー」で mysql を選択して、右クリック、ビルド。日本語環境では、文字コードに関するワーニングが出ますが、今回追いかけたい部分には影響ないと判断し、とりあえず無視しておくことにします(ちゃんとやりたい場合は、せじまさんのブログを参考に、各ソースファイルに BOM を付けたら良いと思います)。
f:id:sakaik:20201224120843p:plain

 今回の設定の場合、ビルド後の実行ファイルは、client\runtime_output_directory\ に作成されます。(が、GUI上でデバッグするので、このファイルの所在を知らなくても今回は特に問題ありません)

 そういや、この時点ですでに mysql.ccのソースファイルを開いていますね、私。ソリューションエクスプローラーから、mysql - Source Files の中にあります。

mysql CLC の起動前の準備

 Visual Studio 上で mysql.exe をデバッグ実行したいのですが、接続用パラメタを与えないと起動してすぐに終了してしまいますよね。以下の方法で、起動パラメタを指定します。

プロジェクト-mysqlのプロパティを開く
f:id:sakaik:20201224121511p:plain

デバッグ-コマンド引数のところに、-u -p などのパラメタを指定する
f:id:sakaik:20201224121704p:plain

デバッグ実行

 デバッグ実行は、ソリューションエクスプローラーから mysql を右クリックで、デバッグ-新しいインスタンスの開始。
f:id:sakaik:20201224122101p:plain

 とりあえず、SELECT REPEAT('a', 1000000); とかを実行して、落ちるところを楽しみましょう。

その他の情報

 ソースコードの左端をクリックしてブレークポイントの赤丸を付けることができます。
その箇所で停まった状態から、ステップイン/ステップアウトは上部のアイコンから(あるいは F10/F11でもできます)。一旦停まっている状態で、とりあえず後は全部流しちゃっていいや、という時には、「続行」のアイコンで流せます。


 とりあえずこの方法でできたという話をまとめたものなので、もっと効率のよいやり方やショートカットなどの情報があれば、ぜひ教えてください。