LibreOffice5(144)ログを取得する方法

2018-02-25

旧ブログ

t f B! P L
LibreOfficeのログを取得します。取得するレベルによってログを取得する方法はいくつかありました。最後のPYUNO_LOGLEVEL="ARGS"はマクロのデバッグに使えそうです。

前の関連記事:LibreOffice5(143)MenuBarとPopupMenuのサービスとインターフェイスの一覧


LibreOfficeのバグレポートに添付するレベルのログを取得する


LibreOfficeのバグ報告方法 - The Document Foundation Wiki

ここに各OSでログを取得する解説がありました。

Linux でバックトレースを得る方法にはバックトレース、straceログ、valgrindログの3種類が書いてあります。

まず見つけたのがopenSUSE:Bugreport LO - openSUSEの解説だったので、この解説に書いてあるstarceログを取得してみました。

手元のlinuxBean14.04にはstaceコマンドはすでに入っていました。

strace -o /tmp/strace.log -f -tt -s 512 ./soffice

soffice.binのある/opt/libreoffice5.4/programフォルダでTeminalを開いてこのコマンドを実行してLibreOfficeを操作すると/tmpフォルダにstrace.logファイルが出力されました。

ちょっと操作しただけですごい量のログがでてきます。
13028 14:26:04.941935 execve("./soffice", ["./soffice"], [/* 57 vars */]) = 0
13028 14:26:04.943892 brk(0)            = 0xb82b4000
13028 14:26:04.943965 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
13028 14:26:04.944036 mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76c7000
13028 14:26:04.944087 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
13028 14:26:04.944133 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
13028 14:26:04.944178 fstat64(3, {st_mode=S_IFREG|0644, st_size=103153, ...}) = 0
13028 14:26:04.945000 mmap2(NULL, 103153, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb76ad000
13028 14:26:04.945040 close(3)          = 0
13028 14:26:04.945078 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
13028 14:26:04.945132 open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
13028 14:26:04.945174 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\234\1\0004\0\0\0\204\334\32\0\0\0\0\0004\0 \0\n\0(\0C\0B\0\6\0\0\0004\0\0\0004\0\0\0004\0\0\0@\1\0\0@\1\0\0\5\0\0\0\4\0\0\0\3\0\0\0D\331\26\0D\331\26\0D\331\26\0\23\0\0\0\23\0\0\0\4\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\237\32\0d\237\32\0\5\0\0\0\0\20\0\0\1\0\0\0\320\241\32\0\320\241\32\0\320\241\32\0\354,\0\0\254X\0\0\6\0\0\0\0\20\0\0\2\0\0\0\250\275\32\0\250\275\32\0\250\275\32\0\360\0\0\0\360\0\0\0\6\0\0\0\4\0\0\0\4\0\0\0t\1\0\0t\1\0\0t\1\0\0D\0\0\0D\0\0\0\4\0\0\0\4\0\0\0\7\0\0\0\320\241\32\0\320\241\32\0\320\241\32\0\10\0\0\0L\0\0\0\4\0\0\0\4\0\0\0P\345tdX\331\26\0X\331\26\0X\331\26\0\334t\0\0\334t\0\0\4\0\0\0\4\0\0\0Q\345td\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\20\0\0\0R\345td\320\241\32\0\320\241\32\0\320\241\32\0000\36\0\0000\36\0\0\4\0\0\0\1\0\0\0\4\0\0\0\24\0\0\0\3\0\0\0GNU\0:\202Q\2374\323\221\37\2\27Cm\305\255\216\312c\372\265\370\4\0\0\0\20\0\0\0\1\0\0\0GNU\0\0\0\0\0\2\0\0\0\6\0\0\0\30\0\0\0\363\3\0\0\n\0\0\0\0\2\0\0\16\0\0\0\2400\20D\200 \2\1\214\3\346\220AE\210\0\204\0\10\0E\200\0`\300\200\0\f\212\f\0\0010\0\10@2\10\256\4\210H6l\240\0360\0&\204\200\216\4\10B$", 512) = 512
13028 14:26:04.945858 fstat64(3, {st_mode=S_IFREG|0755, st_size=1763068, ...}) = 0
13028 14:26:04.945903 mmap2(NULL, 1768060, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb74fd000
13028 14:26:04.945939 mmap2(0xb76a7000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1aa000) = 0xb76a7000
こんな感じの延々と出力されます。

これはマクロのデバッグには情報が多すぎますね。

ということでこのレベルのログの取得でやってみたのはこれだけです。

Pythonコンポーネントローダーのログを取得する


Debugging Python components in LibreOfficeに解説があります。

まずはLibreOffice(5)PythonでLibreOfficeが動く仕組み:UNOの3つ目のUNOコンポーネントのログを取得する方法です。

/opt/libreoffice5.4/programフォルダにあるpythonloader.pyのDEBUG=0をDEBUG=1に変更しました。
pq@pq-VirtualBox:/opt/libreoffice5.4/program$ ./scalc
Listening for transport dt_socket at address: 8000
pythonloader.Loader ctor
pythonloader.Loader.activate
pythonloader: interpreting url vnd.openoffice.pymodule:pythonscript
pythonloader: after expansion vnd.openoffice.pymodule:pythonscript
Fetched ImplHelper as <unohelper.ImplementationHelper object at 0x75fa0cec>
pythonloader.Loader ctor
pythonloader.Loader.activate
pythonloader: interpreting url file:///opt/libreoffice5.4/share/extensions/dict-en/Lightproof.py
pythonloader: after expansion file:///opt/libreoffice5.4/share/extensions/dict-en/Lightproof.py
b'checking for existence of /opt/libreoffice5.4/share/extensions/dict-en/pythonpath.zip'
b'adding /opt/libreoffice5.4/share/extensions/dict-en/pythonpath to sys.path'
Fetched ImplHelper as <unohelper.ImplementationHelper object at 0x75fdb34c>
TerminalからCalcを起動するとFetched ImplHelper as <unohelper.ImplementationHelper object at 0x75fa0cec>までが出力されました。

続いてCalc(4)SDKのJavaの例を実行してみるのGeneralTableSample.pyをマクロセレクターから実行してそのあとCalcを終了して元のプロンプトに戻っています。

Calcを終了するときに出力されるログはありませんでした。

シェルに結果を出力できないWindowsの場合はどうすればよいのかはわかりませんでした。

Python Script Providerでログを取得する

    NONE = 0   # production level
    ERROR = 1  # for script developers
    DEBUG = 2  # for script framework developers
/opt/libreoffice5.4/programフォルダにあるpythonscript.pyにはPYSCRIPT_LOG_LEVELの3つのレベルが書いてあります。

PYSCRIPT_LOG_LEVELは環境変数で、デフォルトでは設定されていないので、NONE = 0   # production levelということになります。

export PYSCRIPT_LOG_LEVEL=DEBUG
pq@pq-VirtualBox:/opt/libreoffice5.4/program$ export PYSCRIPT_LOG_LEVEL=DEBUG
pq@pq-VirtualBox:/opt/libreoffice5.4/program$ ./soffice
LinuxBean14.04ではこれでDEBUG = 2  # for script framework developersのログがTerminalに出力されました。

シェル変数ではPython Script Providerに変数が引き継げないのでexportで環境変数にしないといけません。
Sun Feb 25 13:52:10 2018 [DEBUG] pythonscript loading
Sun Feb 25 13:52:10 2018 [DEBUG] pythonscript finished initializing
Sun Feb 25 13:52:10 2018 [DEBUG] Entering PythonScriptProvider.ctoruser:uno_packages
Sun Feb 25 13:52:10 2018 [DEBUG] initialized urihelper with baseUri=file:///home/pq/.config/libreoffice/4/user/uno_packages/cache/uno_packages,m_scriptUriLocation=user:uno_packages
Sun Feb 25 13:52:10 2018 [DEBUG] got urlHelper <pythonscript.MyUriHelper object at 0x75e9bfec>
Sun Feb 25 13:52:10 2018 [DEBUG] user:uno_packages transformed to file:///home/pq/.config/libreoffice/4/user/uno_packages/cache/uno_packages
Sun Feb 25 13:52:10 2018 [DEBUG] pythonscript: getPackageName2PathMap start getDeployedPackages
こんな感じでログが出力され、拡張機能やマクロファイルが読み込まれる経過についてよくわかります。
Sun Feb 25 13:54:22 2018 [DEBUG]  got mod <module 'ooo_script_framework' from 'file:///home/pq/.config/libreoffice/4/user/Scripts/python/GridControl/GridControl/published/gridcontrol3.py'>
Sun Feb 25 13:54:22 2018 [DEBUG] got func <function macro at 0x75bd7fa4>
Sun Feb 25 13:54:22 2018 [DEBUG] PythonScript.invoke ()
Sun Feb 25 13:54:23 2018 [DEBUG] PythonScript.invoke ret = None
しかし、このログはマクロファイルを読み込んで実行するところで終わってしまいました。

ERROR = 1  # for script developersではさらに情報は少なく、PYSCRIPT_LOG_LEVEL=DEBUGのログのうち、[ERROR]だけが出力されます。

Windows10ではシェルに結果を出力できないので結果をファイルに出力するようにPYSCRIPT_LOG_STDOUTも設定しないといけません。

エクスプローラでLibreOfficeのインストールフォルダを開き、何もファイルを選択しない状態で、Shiftキーを押しながら右クリック→PowerShellウィンドウをここに開く。

$env:PYSCRIPT_LOG_LEVEL="DEBUG"
$env:PYSCRIPT_LOG_STDOUT=0
PS C:\Program Files\LibreOffice 5\program> $env:PYSCRIPT_LOG_LEVEL="DEBUG"
PS C:\Program Files\LibreOffice 5\program> $env:PYSCRIPT_LOG_STDOUT=0
PS C:\Program Files\LibreOffice 5\program> .\scalc
これでログを出力する状態でCalcが起動します。

PYSCRIPT_LOG_STDOUT=0とするとマイマクロフォルダにlog.txtが作られそこにログが出力されます。
Sun Feb 25 17:12:20 2018 [DEBUG]  got mod <module 'ooo_script_framework' from 'vnd.sun.star.tdoc:/2/Scripts/python/gridcontrol3.py'>
Sun Feb 25 17:12:20 2018 [DEBUG] got func <function macro at 0x0000021C32379B70>
Sun Feb 25 17:12:20 2018 [DEBUG] PythonScript.invoke ((com.sun.star.document.DocumentEvent){ (com.sun.star.lang.EventObject){ Source = (com.sun.star.uno.XInterface)0x21c307ea5b0{implementationName=ScModelObj, supportedServices={com.sun.star.sheet.SpreadsheetDocument,com.sun.star.sheet.SpreadsheetDocumentSettings,com.sun.star.document.OfficeDocument}, supportedInterfaces={com.sun.star.container.XChild,com.sun.star.document.XDocumentPropertiesSupplier,com.sun.star.document.XCmisDocument,com.sun.star.rdf.XDocumentMetadataAccess,com.sun.star.document.XDocumentRecovery,com.sun.star.document.XUndoManagerSupplier,com.sun.star.document.XEventBroadcaster,com.sun.star.document.XDocumentEventBroadcaster,com.sun.star.lang.XEventListener,com.sun.star.document.XEventsSupplier,com.sun.star.document.XEmbeddedScripts,com.sun.star.document.XScriptInvocationContext,com.sun.star.frame.XModel2,com.sun.star.util.XModifiable2,com.sun.star.view.XPrintable,com.sun.star.view.XPrintJobBroadcaster,com.sun.star.frame.XStorable2,com.sun.star.frame.XLoadable,com.sun.star.script.XStarBasicAccess,com.sun.star.document.XViewDataSupplier,com.sun.star.util.XCloseable,com.sun.star.datatransfer.XTransferable,com.sun.star.document.XDocumentSubStorageSupplier,com.sun.star.document.XStorageBasedDocument,com.sun.star.script.provider.XScriptProviderSupplier,com.sun.star.ui.XUIConfigurationManagerSupplier,com.sun.star.embed.XVisualObject,com.sun.star.lang.XUnoTunnel,com.sun.star.frame.XModule,com.sun.star.frame.XTitle,com.sun.star.frame.XTitleChangeBroadcaster,com.sun.star.frame.XUntitledNumbers,com.sun.star.lang.XTypeProvider,com.sun.star.uno.XWeak,com.sun.star.sheet.XSpreadsheetDocument,com.sun.star.document.XActionLockable,com.sun.star.sheet.XCalculatable,com.sun.star.util.XProtectable,com.sun.star.drawing.XDrawPagesSupplier,com.sun.star.sheet.XGoalSeek,com.sun.star.sheet.XConsolidatable,com.sun.star.sheet.XDocumentAuditing,com.sun.star.style.XStyleFamiliesSupplier,com.sun.star.view.XRenderable,com.sun.star.document.XLinkTargetSupplier,com.sun.star.beans.XPropertySet,com.sun.star.lang.XMultiServiceFactory,com.sun.star.lang.XServiceInfo,com.sun.star.util.XChangesNotifier,com.sun.star.sheet.opencl.XOpenCLSelection,com.sun.star.util.XNumberFormatsSupplier,com.sun.star.lang.XUnoTunnel,com.sun.star.lang.XTypeProvider,com.sun.star.uno.XWeak,com.sun.star.uno.XAggregation}} }, EventName = (string)"OnLoad", ViewController = (com.sun.star.frame.XController2)0x0{}, Supplement = (any){ void } },)
Sun Feb 25 17:12:20 2018 [DEBUG] PythonScript.invoke ret = None
埋め込みマクロを実行するとログはこのように終わっていました。

マクロをロードするところまでのログなのでマクロのデバッグのためには不十分です。

Python/UNO bridgeのメソッドコールのログを取得する


export PYUNO_LOGLEVEL=ARGS
pq@pq-VirtualBox:/opt/libreoffice5.4/program$ export PYUNO_LOGLEVEL=ARGS
pq@pq-VirtualBox:/opt/libreoffice5.4/program$ ./scalc
環境変数のPYUNO_LOGLEVELにARGSを渡してCalcを実行しています。

Python-UNO bridgeに解説があります。

Pythonマクロを実行すると逐一ログが出力されます。
2018-02-25 14:37:56,855 [CALL,tid 1]: try     py->uno[0x-5eaac838].getPropertyValue((string)"GridDataModel")
2018-02-25 14:37:56,855 [CALL,tid 1]: success py->uno[0x-5eaac838].getPropertyValue()=(com.sun.star.awt.grid.XGridDataModel)0x-5eb70c7c
2018-02-25 14:37:56,855 [CALL,tid 1]: try     py->uno[0x-5eaa2324].getRowData((byte)0x-2)
2018-02-25 14:37:56,855 [CALL,tid 1]: except  py->uno[0x-5eaa2324].getRowData = (com.sun.star.lang.IndexOutOfBoundsException){ (com.sun.star.uno.Exception){ Message = (string)"", Context = (com.sun.star.uno.XInterface)0x-5eb70c7c } }
2018-02-25 14:37:56,856 [CALL,tid 1]: except  uno->py[0x75e661ec].selectionChanged = (com.sun.star.lang.IndexOutOfBoundsException){ (com.sun.star.uno.Exception){ Message = (string)"", Context = (com.sun.star.uno.XInterface)0x-5eb70c7c } }
呼び出したメソッド名もわかりますし、Linuxではマクロを実行しながらTerminalでログを逐一みれるので、自分で書いたマクロならどこのログなのかわかるはずです。

メソッドに与えた引数の中身やその戻り値もわかるのでデバッグするときにかなり便利です。

ちなみのこの部分でexceptがでていてLibreOfficeがクラッシュしています。

tryでコマンドを送り、エラーがなければsuccessで戻り値が表示されます。

tryの行で引数の中身が、successやexceptの行でその戻り値がわかります。

PYUNO_LOGLEVEL=CALLにするとsuccessのときの=の右辺が表示されなくなりました。

Linuxと違ってWindowsではTerminalに出力できないので、ログファイルへのパスを指定しないといけません。

Windows10では先ほどと同様にPowerShellウィンドウで以下のようにしてログファイルが取得できました。

$env:PYUNO_LOGLEVEL="ARGS"
$env:PYUNO_LOGTARGET="file:///c:/_tmp/mylogfile"
PS C:\Program Files\LibreOffice 5\program> $env:PYUNO_LOGLEVEL="ARGS"
PS C:\Program Files\LibreOffice 5\program> $env:PYUNO_LOGTARGET="file:///c:/_tmp/mylogfile"
ログファイルへのパスはfileurlで指定します。

ログファイル名にはmylogfile.4744といったようにドットとPID(プロセス番号)がついてきます。

このレベルのログであればLibreOfficeだけでマクロのデバッグができないことはないので便利に使えそうです。

(2018.7.31追記。Windows7のコマンドラインでは次のコマンドでログの取得ができました。)

set PYUNO_LOGLEVEL=ARGS
set PYUNO_LOGTARGET=file:///c:/_tmp/mylogfile

エラーをもれなく表示するには、この方法しかないようです。

エラーがあるとトレースバッグが表示されますが、いずれの環境でも、日本語のコメントが文字化けしてしまいます。

参考にしたサイト


LibreOfficeのバグ報告方法 - The Document Foundation Wiki
「開発者に追加の情報を提供する - 上級編」にバグ報告用のログ取得方法の解説があります。

openSUSE:Bugreport LO - openSUSE
openSUSEでのLibreOfficeのバグ報告用のログ取得方法。

Debugging Python components in LibreOffice
Pythonスクリプトのログ取得方法の解説。

Python-UNO bridge
PYUNO_LOGLEVELとPYUNO_LOGTARGETの解説。

次の関連記事:LibreOffice5(145)コントロールコンテナのサービスとインターフェイスの一覧

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ