当前位置: 首页 > 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文件路径

测试:

相关文章:

  • Cannot connect to the Docker
  • Linux网卡
  • 如何防范AI诈骗:从了解到保护
  • 【MySQL】C语言连接数据库
  • 分类预测 | Matlab实现KOA-CNN-BiGRU-selfAttention多特征分类预测(自注意力机制)
  • Scala基本数据类型和运算符
  • 【计算机网络】浏览器的通信能力
  • dbeaver配置es连接org.elasticsearch.xpack.sql.jdbc.EsDriver
  • C++(20):constexpr函数中可以成对的使用new/delete
  • Lua脚本语言
  • GPT实战系列-如何用自己数据微调ChatGLM2模型训练
  • 图片去除水印文字怎么去除?这几个方法快来收藏
  • redis加入window服务及删除
  • HTML常用标签、CSS基础
  • 了解Docker的文件系统网络模式的基本原理
  • [PHP内核探索]PHP中的哈希表
  • echarts花样作死的坑
  • Electron入门介绍
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • PHP 的 SAPI 是个什么东西
  • 阿里云应用高可用服务公测发布
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 技术发展面试
  • 解决iview多表头动态更改列元素发生的错误
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 聊聊redis的数据结构的应用
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 什么软件可以剪辑音乐?
  • 实现简单的正则表达式引擎
  • 微信小程序设置上一页数据
  • mysql面试题分组并合并列
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • (09)Hive——CTE 公共表达式
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (轉)JSON.stringify 语法实例讲解
  • .Net 应用中使用dot trace进行性能诊断
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • .sdf和.msp文件读取
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @angular/cli项目构建--Dynamic.Form
  • @property @synthesize @dynamic 及相关属性作用探究
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [C++] sqlite3_get_table 的使用
  • [Codeforces] number theory (R1600) Part.11
  • [C语言]——分支和循环(4)
  • [hdu 4405] Aeroplane chess [概率DP 期望]