前の関連記事: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ファイルの解説。
0 件のコメント:
コメントを投稿