XcodeのLLDBに、Pythonで作った独自コマンドを読み込ませます。
Xcodeは起動時に以下のふたつのうちどちらかを読み込むようです。
- ~/.lldbinit
- ~/.lldbinit-Xcode
基本的には.lldbinit-Xcode
が読み込まれるようです。
ただ、コマンドラインからなどでは上記が読み込まれるので、基本的な設定は.lldbinit
に記述し、.lldbinit-Xcode
には以下のように.lldbinit
を読み込む処理を入れておくといいでしょう。
command source ~/.lldbinit
起動時に独自コマンド用ファイルを読み込む
上記のように設定したら、.lldbinit
にPythonファイルを読み込む設定をしておくことで自動的にコマンドが読み込まれます。
command script import ~/.lldb/hoge.py
ファイルで定義する
上で書いた読み込み設定をしたら、実際に読み込ませる内容を定義します。
主な書式と必要な記述は以下の通りです。
#!/usr/bin/env python
#coding: utf-8
import lldb
import commands
import os
def command_function(debugger, command, result, internal_dict):
cmd = "po self"
debugger.HandleCommand(cmd)
def __lldb_init_module(debugger, internal_dict):
debugger.HandleCommand("command script add -f new-command:command_function commandname")
print "commandname has been installed."
定義したら以下のように読み込みます。
(lldb) command script import /path/to/command.py
break中にインラインで設定する
ちょっとした動作テストなどはインラインで設定して実行してみると動作が確認しやすいです。
以下のようにするとpythonのインタープリタが起動します。
(lldb) script⏎
そして以下のように定義し、インタープリタを抜けます。
(lldb) script⏎
Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.
>>> def hoge_function(debugger, command, result, internal_dict):
... cmd = "po self"
... debugger.HandleCommand(cmd)
...
>>> quit⏎
(lldb) command script add hoge -f hoge_func
(lldb) hoge
<UIView...
文字列のプレースホルダ
以下のように書くことでプレースホルダを利用することができます。
コマンドで指定された文字列を元に処理をする場合に便利です。
val = "This is %s %s" % ("a", "pen")
# --- or ---
val = "This is %(unit)s %(msg)s" % {"unit": "a", "msg": "pen"}
# --- or ---
val = """This is
%s %s""" % ("a", "pen")
コマンドを分割する
コマンドはひとつなぎの文字列として渡されるので、shlex.split
を使って分割します。
command_list = shlex.split(command)
ダミーのビューをコピーしてaddSubview:
するコマンド
今回やりたかったのは、指定されたビューのサイズを使ってビューを複製し、それをaddSubview:
して思った位置にちゃんとビューが生成されているか、を確認するコマンドを作ることでした。
だいぶ冗長な感じな気はしますが、とりあえず以下のようにしたら動いたので記載しておきます。
#!/usr/bin/env python
# -*- coding: utf-8
import lldb
import commands
import os
import shlex
def dmy_func(debugger, command, result, internal_dict):
commands = shlex.split(command)
count = len(commands)
if count < 2:
return
cmd = "po CGRect $frame = (CGRect)[%s frame]" % commands[0]
print(cmd)
debugger.HandleCommand(cmd)
cmd = "po UIView *$view = [[UIView alloc] initWithFrame:(CGRect)$frame]"
print(cmd)
debugger.HandleCommand(cmd)
cmd = "po [$view setBackgroundColor:(UIColor*)[UIColor redColor]]"
print(cmd)
debugger.HandleCommand(cmd)
cmd = "po [%s addSubview:(UIView*)$view]" % commands[1]
print(cmd)
debugger.HandleCommand(cmd)
def __lldb_init_module(debugger, internal_dict):
debugger.HandleCommand("command script add -f dmy.dmy_func dmy")
print "dmy command has been installed."
使い方
(lldb) dmy self.hogeView self.view
self.hogeView
のframeを使ってUIViewを生成し、それをself.view
にaddSubview:
する、というものです。