欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

iOS调试技巧使用Python 自定义LLDB

终极管理员 知识笔记 85阅读
一、类介绍

在使用Python 自定义LLDB之前先了解一下LLDB的一些类型

SBTarget 正在被调试的程序SBProcess 和程序关联的具体的进程SBThread 执行的线程SBFrame 和线程关联的一个栈帧SBVariable 变量寄存器或是一个表达式

一般情况下我们取到SBFrame就可以进行方法调用来打印关键信息

二、断点调试示例

在写Python前先使用Xcode断点执行一下

自定义类MyClass
.h文件

interface MyClass : NSObject (NSString *)lldbTest;end

.m文件

implementation MyClass (NSString *)lldbTest {    return lldb test successed;}end

中断程序

打开lldb控制台

下面就开始写lldb的命令
预期目标打印出[MyClass lldbTest]的返回值

输入script

(lldb) scriptPython 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

如果想把这个功能打包起来使用一句命令调用就需要使用Python来扩展我们的lldb命令

1、新建Python文件

这里将Python文件命名问lldbtest.py

1、引入lldb头文件
import lldb
2、初始化函数
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)
3、自定义Python方法

获取当前的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 lldbdef 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)
四、自动加载python脚本

原理xcode启动的时候会读取一个默认文件:~/.lldbinit
只需要将命令command script import /Users/xx/Desktop/lldbtest.py 写入这个文件即可。
/Users/xx/Desktop/lldbtest.py是Python文件路径

测试

标签:
声明:无特别说明,转载请标明本文来源!