LibreOfficeでprintfデバッグみたいに変数の値をログに出力する方法

最近、LibreOfficeのソースコードを見ては、ほんの少しの修正で直せる物を直してます。
直しているとき、今、動いている部分の変数の値を見てみたいと思うことがあります。そういうとき、王道はデバッガを使って見ていくのが正しいのですが、LibreOfficeでは実行時に通る部分の値などをログに書き出せる仕組みがあるそうなので試してみました。
- LibreOffice: Basic logging functionality.: https://api.libreoffice.org/docs/cpp/ref/a02512.html
- How to debug - The Document Foundation Wiki: https://wiki.documentfoundation.org/Development/How_to_debug#Macros_Controlling_Debug_Code
- DebuggingLibreOffice - Ubuntu Wiki: https://wiki.kubuntu.org/DebuggingLibreOffice
autogen.inpuにオプションを指定
ソースコードのautogen.shにオプションを指定する autogen.input に以下のオプションを追加します。
--enable-debug
--enable-sal-log
ソースコードの中にSAL_INFOを仕込む
ソースコードの中で、この部分の変数をログに書き出したいと思っている部分に、 SAL_INFO("場所","表示したい文字列" << 表示したい変数 )みたいな感じで書きます。 以下はvcl/quartz/salgdi.cxxの90行目にフォントがどうなっているか調べたかったときに入れたヤツ。
SAL_INFO( "vcl.quartz", "CoreTextGlyphFallbackSubstititution::FindFontSubstitute() rPattern.maSearchName=" << rPattern.maSearchName );
ビルドする
これは、いつもどおりmakeを実行すればOKです。
環境変数SAL_LOGを設定
ビルドが終わったら、ログを表示させるための環境変数を設定します。これは以下のような感じで実行すればOK。
$ export SAL_LOG=+INFO,+WARN
make debugrunを実行してログを記録
これで、make debugrunを実行しますが大量のログが表示されます。なので、以下のような形で実行してファイルに書き出します。
$ make debugrun 2>&1 | tee log.$(date "+%Y%m%d%H%M%S")
make debugrunが実行されるとデバッガが起動してコマンド受付状態になるので、実行するためにrと入力します。するとLibreOfficeが実行されるので自分が見たい部分の機能を実行します。LibreOfficeを終了するとデバッガに戻るので、qを押して終了です。
あとは、記録されたログをgrepなどして記録された部分を見ていきましょう。
_ LibreOfficeのソースコードから効率よく検索する方法
libreOfficeのソースコードを検索するサービスにopengrok.libreoffice.orgというサービスがありますが、 git grep を使えばサクっと検索できます。
使い方は簡単でLibreOfficeのソースコード直下で、 git grep (検索したい文字列) を実行すればいいだけ。 大文字小文字を無視して検索する場合は、 git grep -i (検索したい文字列) のようにiオプションを付けます。
これでファイルの大体の当たりをつけたら、そのファイルに git log (履歴を見たいファイル) を実行します。 そうするとファイルの変更履歴がわかるので、 git diff (変更履歴のハッシュ値) で、その変更点で何をやったのかわかるので参考にして、あーでもないこーでもないと考えるだけです。
検索をするとき
$ git grep (検索したい文字列)
$ git grep -i (検索したい文字列) 大文字小文字を無視して検索
ファイルの履歴を見る
$ git log (履歴を見たいファイル)
$ git log --oneline (履歴を見たいファイル) 履歴一覧を表示
そのコミットの変更点を見る
$ git diff (変更履歴のハッシュ値) ハッシュ値は全部入れなくてもOK
_ git diffでパッチを作る
いきなり、ぶっ込むのも怖いし変更点を見てもらいたいなと思ったときにパッチを作ったので、その方法もメモ。
gitでパッチを作るのは、 git diff > hoge.patchだけ。これでパッチを作った場合、パッチを当てる方法は、 git apply hoge.patch で当てられます。