linuxBean14.04(163)OUStringの文字列をgdbで見る方法

ラベル: , ,
LibreOfficeのC++で文字列の表現に使われているOUString型をgdbで見るほう方がようやくわかりました。しかし変換にとても時間がかかります。

前の関連記事:linuxBean14.04(162)LibreOfficeのC++の拡張機能の例をCUIのデバッガにかける


.gdbinitファイルにマクロを定義する


ホームフォルダに.gdbinitという名前のファイルを作成しThe recommended .gdbinit fileに書いてあるコードをコピペします。

Terminalを起動してgdbを起動します。

ソースも表示してくれます。

あとの操作はlinuxBean14.04(162)LibreOfficeのC++の拡張機能の例をCUIのデバッガにかけると同じです。


listコマンドを使わなくてもソースを表示して、現在の行をハイライトしてくれます。

上図で表示している変数aURLはcom.sun.star.util.URL型のStructです。

LibreOffice: URL Struct Referenceを見るとその属性の型はstringになっています。

Pythonであれば普通に文字列として扱えるはずですがC++ではrtl::OUStringという型に入っています(UNO Type Mappings - N->N->N)。

この型はgdbでは文字列として出力できません。
(gdb) p aURL.Path
p aURL.Path
$1 = {pData = 0xa7d388d0}
pDataの中身の16進数が表示されるだけです。

UTF8エンコードをデコードするでデコードしてみると、'ӈDLEということで意味がわかりません。

How to debug - The Document Foundation Wikiに rtl::OUStringはUTF-16と書いてありました。

pou aURL.Path

それが.gdbinitで定義したpouを使うとちゃんと文字列が出力されます。
(gdb) pou aURL.Path
pou aURL.Path
"ImageButtonCmd"
ちゃんとaURL.Pathに入っている文字列ImageButtonCmdが出力されました。

しかしすごく時間がかかります。

これだけ出力するのに10秒ぐらいかかりました。

EclipseのGUIでも出力されるように工夫してみようと思いましたが、こんなに時間がかかるようならちょっと無理ですね。

まあ変数の文字列がみれるようになっただけでもよかったです。

参考にしたサイト


class OUString
LibreOfficeのC++の文字列の型の解説。

Debugging - Apache OpenOffice Wiki
.gdinitにこのマクロを入れることでOUStringの属性の文字列がgdbで出力できました。

LibreOffice: URL Struct Reference
URL Struct

UNO Type Mappings - N->N->N
LibreOfficeのC++では文字列はrtl::OUString型に入っています。

UTF8エンコードをデコードする
UTF8のエンコードを変換できます。

How to debug - The Document Foundation Wiki
rtl::OUStringはUTF-16、rtl::OStringは8-bitと書いてあります。

[Libreoffice] gdb pretty printers landed in master
gdb7以上であればPythonスクリプトでOUStringを変換できるようですがやり方がわかりませんでした。

DebuggingIt
ここにも.gdbinitのマクロが載っています。dbg_dump()もやってみましたがうまくコンパイルできませんでした。

Debugging with GDB: 2.1.3 GDBが起動時に行なうこと
.gdbinitファイルの解説。

次の関連記事:linuxBean14.04(164)LibreOfficeのC++の拡張機能の例をEclipseでデバッガにかける

PR

0 件のコメント:

コメントを投稿