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

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 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')

四、自动加载python脚本

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

测试:


http://www.kler.cn/a/105668.html

相关文章:

  • mysql8.4+mysql router读写分离
  • Android 源码编译资料集
  • 生数科技发布 Vidu 1.5 新版本,引领视频大模型新潮流
  • python学习_2.去除字符strip方法
  • Android 使用Retrofit 以纯二进制文件流上传文件
  • React Native 全栈开发实战班 - 数据管理与状态之Zustand应用
  • 关于癌细胞MR的几种类型,T1,T2,DCE,DWI,ADC
  • 【开源】基于SpringBoot的高校学院网站的设计和实现
  • vue使用.filter方法检索数组中指定时间段内的数据
  • 超全面测评!2023年最常用的15款原型设计工具
  • C++并发与多线程(7) | 创建多个线程时数据共享的问题
  • 【API篇】九、Flink的水位线
  • DC电源模块高功率元器件的散热问题
  • PyTorch 与 TensorFlow:机器学习框架之战
  • HarmonyOS 音频通话开发指导
  • C++数据结构X篇_23_快速排序(最快、不稳定的排序)
  • 用 Rust 和 cURL 库制作一个有趣的爬虫
  • MYSQL8-sql语句使用集合。MYCAT-sql语法使用集合
  • Java后端开发——实现登录验证程序
  • 计算机网络——理论知识总结(下)
  • 个人记账理财软件 Money Pro mac中文版软件介绍
  • Fabric.js 讲解官方demo:Stickman
  • 单链表新增删除节点操作
  • COSCon'23媒体和社区合作伙伴正式公布!百川相聚,潮汇大海,邀您天府之城共话开源!...
  • 私有云:【1】ESXI的安装
  • vue项目中定制化音频展示,wavesurfer.js基本使用