しおメモ

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

LLDBのcommand regexを使って動的なaliasを作る

LLDBのcommand regexを使うと、zshのanonymous functionのaliasみたいな感じで、 引数に置換かけながらLLDBコマンドを実行するaliasが作れます。

これを利用することで、簡単なコマンドならば、Pythonスクリプトを用意する手間が省けます。

やりかた

構文はシンプルで、

command regex <cmd-name> [s/<regex>/<subst>/ ...]

で、置換パターンはsedのようにs///で書けば問題ないです。(複数可)

これを.lldbinitに記載しておけば、毎回LLDBが立ち上がるたびに、コマンドがセットされます。

scior.hatenablog.com

一例として、XcodeのunsafeBitCast(:to)のaliasを紹介します。

command regex cast 's/(.+) (.+)/expr -l swift -- let $casted = unsafeBitCast(%1, to: %2.self)/'

一般にある置換のように、()で囲んだ部分は%1, %2...で利用できます。

この場合、第1引数のインスタンスやアドレスを、第2引数のタイプにキャストして、$castedに格納します。
上の一行を、~/.lldbinitなどに記載しておけば、castというコマンドが登録されます。

(lldb) cast view.subviews[0] UIButton
(lldb) po $casted.frame
▿ (134.5, 305.0, 106.0, 57.0)
  ▿ origin : (134.5, 305.0)
    - x : 134.5
    - y : 305.0
  ▿ size : (106.0, 57.0)
    - width : 106.0
    - height : 57.0

この書き方の場合、letを利用していて書き換えが効かないため、何度もキャストしたい場合は別途工夫がいるかも知れません。