しおメモ

雑多な技術系ブログです。ニッチな内容が多いです。

LLDBからRxSwiftのdebugを仕込む

毎回ソースコードいじってRxSwiftのdebug仕込むのってめんどいですよね。
そこで、スクリプトを使ってLLDBから仕込めるようにしました。

流れてくるイベントを簡単にチェックするのに役に立つかもしれません。

スクリプト

Pythonスクリプトを適当な場所においておきます。

#!/usr/bin/env python3

import lldb

def debugo(debugger, name, result, dict):
    lldb.debugger.HandleCommand('e %s.debug("::%s").subscribe()' % (name, name))

def __lldb_init_module(debugger, internal_dict):
    debugger.HandleCommand('command script add -f debugo.debugo deo')

これを.lldbinit.lldbinit-Xcodeで読み込みます。
今回は~/dotfiles/lldb/debugo.pyというパスで置いたことにします。

command script import ~/dotfiles/lldb/debugo.py

使い方

上記のコマンドをdeoという名前で登録したので、breakしたタイミングでdeo (変数名)debugできます。
例えば、addButton.rx.tapdebugしたい場合はこんな感じです。

(lldb) deo addButton.rx.tap.asObservable()
2019-09-28 00:27:08.215: ::addButton.rx.tap.asObservable() -> subscribed
(lldb) c
2019-09-28 00:27:11.430: ::addButton.rx.tap.asObservable() -> Event next(())
2019-09-28 00:27:12.439: ::addButton.rx.tap.asObservable() -> Event next(())

例のごとく、Edit Breakpointで編集すれば、勝手に実行してくれます。

f:id:scior:20190928010121p:plain

解説

引数で指定した変数に対して、.debug().subscribe()を仕込んでいます。
disposeしないことによって、その場でsubscribeが切れるのを防いでいます。

この方法では普通にdebugするのと異なり、間に挟むということができません。
RxSwiftはメソッドチェーンで書いていくので、LLDBでは文の間で切ることができず、新たにsubscribeする方式をとっています。

したがって、hotとcoldの具合によっては都合が悪いかもしれません。

おまけ

command regexを使っても書けます。

command regex deo 's/(.+)/e %1.debug().subscribe()/'