15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[LLDB] Pythonで独自コマンドを作ってみる

Last updated at Posted at 2015-04-01

XcodeのLLDBに、Pythonで作った独自コマンドを読み込ませます。

Xcodeは起動時に以下のふたつのうちどちらかを読み込むようです。

  • ~/.lldbinit
  • ~/.lldbinit-Xcode

基本的には.lldbinit-Xcodeが読み込まれるようです。
ただ、コマンドラインからなどでは上記が読み込まれるので、基本的な設定は.lldbinitに記述し、.lldbinit-Xcodeには以下のように.lldbinitを読み込む処理を入れておくといいでしょう。

command source ~/.lldbinit

起動時に独自コマンド用ファイルを読み込む

上記のように設定したら、.lldbinitにPythonファイルを読み込む設定をしておくことで自動的にコマンドが読み込まれます。

command script import ~/.lldb/hoge.py

ファイルで定義する

上で書いた読み込み設定をしたら、実際に読み込ませる内容を定義します。
主な書式と必要な記述は以下の通りです。

new-command.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.viewaddSubview:する、というものです。

15
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?