在使用Python 自定义LLDB之前,先了解一下LLDB的一些类型
一般情况下,我们取到SBFrame就可以进行方法调用来打印关键信息
在写Python前,先使用Xcode断点执行一下
自定义类MyClass
.h文件
@interface MyClass : NSObject
+ (NSString *)lldbTest;
@end
.m文件
@implementation MyClass
+ (NSString *)lldbTest {
return @"lldb test successed";
}
@end
下面就开始写lldb的命令
预期目标,打印出[MyClass lldbTest]的返回值
输入script
(lldb) script
Python Interactive Interpreter. To exit, type 'quit()', 'exit()'.
>>>
定义变量test接收MyClass lldbTest]的返回值
>>> test = lldb.frame.EvaluateExpression('(NSString *)[MyClass lldbTest]').GetObjectDescription()
打印变量test
>>> print(test)
至此,直接在Xcode中使用lldb打印出[MyClass lldbTest]的返回值就完成了
如果想把这个功能打包起来,使用一句命令调用,就需要使用Python来扩展我们的lldb命令
这里将Python文件命名问lldbtest.py
import lldb
def __lldb_init_module(debugger, internal_dict):
debugger.HandleCommand()
在HandleCommand中添加命令:
'command script add lldb_test -f lldbtest.test'
lldb_test表示命令名称,lldbtest是Python文件名,test是自定义方法名
初始化函数最终
def __lldb_init_module(debugger, internal_dict):
debugger.HandleCommand('command script add lldb_test -f lldbtest.test')
获取当前的frame栈帧
target = debugger.GetSelectedTarget()
process = target.GetProcess()
thread = process.GetSelectedThread()
currentFrame = thread.GetSelectedFrame()
调用方法
def test(debugger, command, result, internal_dict):
target = debugger.GetSelectedTarget()
process = target.GetProcess()
thread = process.GetSelectedThread()
currentFrame = thread.GetSelectedFrame()
test = currentFrame.EvaluateExpression('(NSString *)[Person lldbTest]').GetObjectDescription()
print("result:%s" % test)
整个Python文件
#自定义lldb命令
import lldb
def test(debugger, command, result, internal_dict):
target = debugger.GetSelectedTarget()
process = target.GetProcess()
thread = process.GetSelectedThread()
currentFrame = thread.GetSelectedFrame()
test = currentFrame.EvaluateExpression('(NSString *)[Person lldbTest]').GetObjectDescription()
print("result:%s" % test)
def __lldb_init_module(debugger, internal_dict):
debugger.HandleCommand('command script add lldb_test -f lldbtest.test')
原理:xcode启动的时候会读取一个默认文件:~/.lldbinit
只需要将命令command script import /Users/xx/Desktop/lldbtest.py 写入这个文件即可。
/Users/xx/Desktop/lldbtest.py是Python文件路径