当前位置: 首页 > news >正文

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

一、类介绍

在使用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) 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

如果想把这个功能打包起来,使用一句命令调用,就需要使用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文件路径

测试:

http://www.lryc.cn/news/208642.html

相关文章:

  • 经典卷积神经网络 - ResNet
  • 一、高效构建Java应用:Maven入门和进阶
  • 【Pytorch】Pytorch学习笔记02 - 单变量时间序列 LSTM
  • C# 压缩图片
  • Linux: sysctl: rp_filter; 包到了内核,没有到socket,火星包martia
  • Liunx两台服务器实现相互SSH免密登录
  • 刷题笔记day03-链表
  • Lua入门使用与基础语法
  • RDMA概览
  • 设计模式(15)组合模式
  • 小黑子—spring:第一章
  • 【面向对象】理解面向对象编程中的封装性
  • ES修改字段类型详解
  • C++基础:函数模板
  • Facebook账号被封?那是因为没做对这些事
  • 虚拟机kafka
  • 软考 系统架构设计师系列知识点之设计模式(3)
  • 217. 存在重复元素、Leetcode的Python实现
  • 49.Redis缓存设计与性能优化
  • IDEA常用的一些插件
  • 基于定容积法标准容器容积标定中的电动针阀自动化解决方案
  • 26 行为型模式-命令模式
  • 一个Entity Framework Core的性能优化案例
  • 【Python 千题 —— 基础篇】列表排序
  • leetcode26:删除有序数组中的重复项
  • [FSCTF 2023] web题解
  • linux查看内存的方式
  • Python 编写 Flink 应用程序经验记录(Flink1.17.1)
  • 如何 通过使用优先级提示,来控制所有网页资源加载顺序
  • 10月25日,每日信息差