公式サイトは閉鎖されていますが、GitHub リポジトリにてソフトウェアのダウンロードやドキュメントへのアクセスは可能です。
ご注意ください。
はじめに
Coati Software が開発している Sourcetrail というソースコード解析ツールが昨年末(2019/11)にOSS化され、GitHub上で公開されています。
このツールの特色としては、ソース中の依存関係をインタラクティブに図示(グラフ)することができ、コード検索やビューも備わっているのでソースをマクロ⇔ミクロ視点で追跡できるというところにあるようです。
対応言語は C, C++, Java, Python となっています。
百聞は一見に如かず、ということで早速 MySQL のソースコードを可視化してみます。
実行環境
Windows 10 pro 8core 12GB RAM
Ubuntu-18.04 LTS : WSL(Windows Subsystem for Linux) Ver.1
MySQL ビルド
Sourcetrailにて C,C++ で対象のソース(Source Group)を指定するには、幾つかの選択肢があります。
- Compilation Database
- Visual Studio
- Code::Blocks
- Enpty C++ Source Group
今回はSourcetrail推奨のCompilation Databaseでセットアップしてみます。
(Visual Studio を普段利用している場合はそちらを指定するとよいのではと思います)
具体的には、CMake を使ったビルド環境からエクスポートしたcompile_commands.json
をSourcetrailに読み込ませます。
ビルド対象のMySQLは、本稿執筆時点の最新バージョンである 8.0.18 の boost 同梱版ソースコードを使用しました。
ビルド方法について特筆すべき点はありませんので、詳細は割愛させていただきます。
1 2 3 4 5 6 7 8 |
$ sudo apt-get install -y cmake gcc libssl-dev build-essential libncurses5-dev pkg-config $ mkdir testbuild;cd testbuild $ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.18.tar.gz $ tar xzvf mysql-boost-8.0.18.tar.gz $ cd mysql-8.0.18 $ mkdir bld;cd bld $ cmake -DWITH_BOOST=../boost .. $ make |
ビルド後、以下のようにCMAKE_EXPORT_COMPILE_COMMANDS
フラグを付けてJSONファイルをエクスポートします。
1 2 |
$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .. $ ls -l compile_commands.json |
ちなみに公式ドキュメントによると、
Visual studio CMake Generator で作成された compile_commands.json を Compilation Database で指定することはサポートされていないとのことです。
一方、Source Group で Visual studio を指定した場合にも Compilation Database の設定をする必要があるのですが、
そちらは Sourcetail が提供する Visual Studio Pluginを使ってエクスポートした compile_commands.json を使うようです。
WSL 用 X Server 設定
Sourcetrail は Linux, macOS, Windows (いずれも64bit版)が公開されています。
初め、Windows用のSourcetrailを使おうとしたところ、 WSL 上の compile_commands.json が何故か上手く読み込めなかったため、今回はLinux用を使ってみることにします。
WSL から Sourcetail のGUIを表示するために、VcXsrv windows xserverをインストールしました。
※インストール手順は割愛します。
VcXsrvを起動(XLaunch)したあと、WSLにX11をインストールして、PC側へ X Window が立ち上がることを確認します。
1 2 3 4 |
$ sudo apt install -y x11-apps x11-utils x11-xserver-utils dbus-x11 libxkbcommon-x11-0 $ echo 'export DISPLAY=localhost:0.0' >> ~/.bash_profile $ source ~/.bash_profile $ xeyes |
Sourcetrail (Linux) インストール
GitHubから最新バージョンをダウンロードします。
本稿執筆時点では、Sourcetrail 2019.4.102
というバージョンでした。
インストール手順は、公式ドキュメントに沿って進めていきます。
1 2 3 4 5 6 7 8 |
$ wget https://github.com/CoatiSoftware/Sourcetrail/releases/download/2019.4.102/Sourcetrail_2019_4_102_Linux_64bit.tar.gz $ tar zxvf Sourcetrail_2019_4_102_Linux_64bit.tar.gz $ cd Sourcetrail $ sudo ./install.sh Installing Sourcetrail in /opt/sourcetrail ./install.sh: 21: ./install.sh: update-desktop-database: not found Installation complete. Enter 'sourcetrail' to launch application. |
update-desktop-database がインストールされていない環境なのでその旨メッセージが出ていますが、Sourcetail実行自体に問題は見受けられませんでしたので取り敢えず無視して進めました。
PATH が通されているので、以下のコマンドでSourcetailが起動します。(フォアグラウンド起動だとコンソール上に実行ログメッセージが出力され続けます)
1 |
$ sourcetrail |
Sourcetrailプロジェクトの作成とインデックス処理
無事画面起動しました。
新規にプロジェクトを作成し、対象のソースファイルにインデックスを貼ることでSourcetail上で操作できるようになります。
- New Project をクリックします。
- Project Name, Project Locationを任意の設定で入力します。
なお、Project Location の指定先は空き容量に余裕がある場所にします。(この後実行するインデックス処理によって生成された作業ファイルが3.2Gまで増加していました。途中一時ファイルなども作成されるため更に余裕はあったほうが良いです。) -
Add Source Group をクリックします。
-
C/C++ from Compilation Database を選択し、Nextをクリックします。
-
Compilation Database(compile_commands.json) にエクスポートした compile_commands.json を指定します。
読み込む対象ファイル数が多いため少し時間がかかりますが、Source Files to Index に 2552 source files ~ と表示されれば正常に読み込まれたことになります。
※show source files をクリックすると対象ファイルのリストがポップアップされます。
-
Header Files & Directories to Index のセクションにて Select from Compilation Database をクリックします。
-
Select from Include Paths にて表示された、ソースが存在するディレクトリにチェックをつけ、Saveをクリックします。
選択内容が反映されました。
-
Exclude Files & Directories には今回何も設定せず、Nextをクリックします。
- 次のページでも今回は何も設定せず、Nextをクリックします。
-
これまでの設定内容を確認し、Createをクリックします。
-
メイン画面に Start Indexing が表示されます。All files(デフォルトのまま)を選択し、Startをクリックします。
-
インデックス処理が開始されました。
-
処理中、PCが非常に重くなりました。sourcetrail_indexerというプロセスが8つ起動し、CPU・メモリが飽和状態です。。。高負荷な処理になるので実行タイミングはご注意ください。
-
インデックス処理が完了しました。 所要時間は約42分と、結構かかかりました。
2つエラーが出ています。内容としては一種類で、Fatalでないので、Sourcetail利用に支障ないものと判断し一旦無視しておきます。
使ってみる
初期画面のoverviewではカテゴリとそのカテゴリ内の対象オブジェクト数が表示されているのみです。
試しに Files をクリックしてみると、ファイル名昇順でリストされたボックスの図に展開されました。
さらに特定のファイル(例として32.h
)をクリックしてみると、さらに図が展開されました。
ヘッダーファイルということもあり、マクロの define や、他のヘッダーファイルの include が図に表現されています。
次は特定の関数を検索してみます。例としてmysql_parse
で検索してみました。
オレンジ色のボックスが Function で、同色の矢印が call (呼び出し)を表しています。
mysql_parse から伸びている Referenced Symbols をクリックしてみると、mysql_parse関数内での参照・呼び出し先が一気に展開されました。
Custom Trail という機能を使うと From ~ Toや依存階層の深度、対象となるNodeとEdgeを細かく選択できるようです。
また、show caller graph, show callee graph という機能で、呼び出し元先に特化した検索もできました。
[show caller gragh での検索結果]
気になる点
非常に見やすいUIデザインで使いやすい印象でしたが、一点だけ気になるのが実行中の処理の重さでした。
無論、MySQLという巨大なソースコードを対象に検索をかけて図を描画するので致し方ないですが、、、
連続でNodeのボックスをクリックしたり、検索対象や結果が膨大だったりするとすぐフリーズしてしまいました。
(場合によってはWarningがポップアップされますが、されずにそのまま・・・ということもあり)
そんなに大きくない規模のプログラムに対してであれば問題ないかとは思いますが、MySQLソースコードに対してストレスなく操作するPCは高いスペックが必要かなという所感でした。
まとめ
ソースコード解析の手法や利用ツールについては、十人十色、お気に入りの方法を確立されている方も多いのではと思います。
Sourcetailは、それ単体で利用するというよりは、補助的に、特に構造を俯瞰的に把握する上で役立てるのに最適かと考えられます。 (デバッグ実行やスタックトレースでの解析時のお供に)
コードエディタ連携用のプラグインが豊富に取り揃えられていることも魅力的です。
まだまだディープな使い方までは探求できていませんが、他にもユースケースは色々と考案できそうで、興味深いソフトウェアでした。
ソースコード構造の理解という点では、MySQL 8.0 で MySQL Internals Manual から移行された、Doxygen で生成された Source Code Documentation が大元ですが、そちらとはまた違ったアプローチになりますので、併用する価値は大いにありそうです。