Eclipse CDTでmysqldをデバッグする


諸事情により、そろそろMySQLのソースを読み込んでいかないといけない雰囲気です。
これまではamazon:超・極める!MySQLを参考にWindowsのVisual C++ 2005 Express Editionで眺めていたのですが、#ifdef __WIN__ の壁に阻まれてしまいUNIX/Linux依存なところが追いきれていませんでした。またLinuxEmacsgdbも試してはみたのですが、プログラムの構造や主要な変数・構造体を理解していない状態からCUIで追うのは正直しんどくて挫折していました。ていうか無理。grep地獄。
最近Eclipse 3.4 Ganymede CDTでいけそうだとの話を聞き、試しているところです。感触としては、完璧とは言えないものの、ソースを読み込むためのツールとしては使えそうです。
手順とか特に書きませんが、ポイントは以下のニ点になります。

  • フルC/C++インデクサーを使う
  • 自動Makefile生成を外し、あらかじめconfigureしておく

C/C++インデクサーはVisual StudioのIntelliSenseに相当するもので、関数の定義を追ったり逆にその関数を使っている箇所を一覧表示したり、オートコンプリートの候補を表示する重要な機能です。設定はプロジェクトのプロパティ ⇒ C/C++ 一般 ⇒ インデクサー で行います。スクリーンショットPleiadesで日本語化しています。

デフォルトは高速C/C++インデクサーですが、これだとMySQLの複雑なマクロ定義が追いきれないようでエディタがすさまじい数のSyntax Errorを吐きます。コンパイラとは無関係なのでビルドは通るものの、インデクサーがきちんと仕事をしてくれないとEclipse CDTでソースを読む意味がありません。
スクリーンショットのようにフルC/C++インデクサーを使い、さらに「すべてのファイルに索引付け」をチェックすれば、ほとんどのSyntax Errorは解消されます。残念ながらごく少量は残ります。また索引付けにはビルドするのと同じくらいの時間がかかります。
次に、Makefileの自動生成をOFFにし、あらかじめconfigureをしてMakefileを作成しておきます。設定箇所はプロジェクトのプロパティ ⇒ C/C++ ビルド です。

configureのサンプルはd:id:sh2:20071215にあります。このサンプルでRPM版と同じ機能構成になり、インストール先が一つのディレクトリ配下に収まるようになります。あとはEclipse CDT上からビルドするだけです。Makeターゲットを作成すればmake installもできます。
次のスクリーンショットEclipse CDTからデバッガを起動したところです。

Eclipse CDTのデバッガはJavaのそれとほぼ同じ感覚で使えます。mysqldの動作を追う場合はsql/sql_parse.ccのmysql_execute_command()にブレークポイントを仕掛けます。別の端末からmysqlを立ち上げて適当なSQLを実行するとこのブレークポイントにヒットするので、あとはステップ実行していけばmysqldの動作を見ていくことができます。ちなみに本当にステップ実行すると最後まで見るのに数時間はかかります(^^;