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

Chisel-xcode 下的调试神器

LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。

安装

1、brew update

2、brew install chisel

3、touch ~/.lldbinit,创建文件 .lldbinit,并将下面内容复制到文件中,保存退出。

command script import /usr/local/opt/chisel/libexec/fblldb.py

4、 重启xcode,插件即可生效

使用

Chisel是一个 facebook 开源的 lldb 插件,为lldb提供了新增的便捷命令,能够帮助快速 debug,是非常实用的命令。

为了跟踪demo UI与底层源码的关联,借助该插件中的强大的指令集可以帮助我们快速了解新接触的 demo。

首先,xcode 控制台输入”help” ,可以看到当前可用的一些指令集。如下图所示:

在平时的测试工作中,当拿到一个新的工程,面对demo 的各种控件,要查看当前控件对象的类的继承关系,可以通过pclass来查看,比如UIViewController处设置断点,呼出lldb控制台,然后再这里输入pclass这个命令,其中参数0x10400ba00为 tableView 对象的地址。如下图所示:

接下来,针对每个对象,使用pviews命令的输出中可以查看控件的属性,根据属性可以初步查看当前控件的位置及大小。如下图所示:

对于 demo 引用的到素材,visualize命令,可以使用mac下的预览app打开我们demo的图片UIImage, CGImageRef格式的图片,甚至view和layer的图片 ,如图所示:

当然,在测试 demo 的功能逻辑实现时是否正确时,简单的 UI层面还不够,需要深入到底层,了解每个对象的职责。pinternal可以查看一个控件类型的内部结构,包括自定义的控件的类型,比如查看控件 tableView 的内部结构,如下图所示:

除了需要对对象有一个纵向的认识外,要了解到对象之间的横向关系,使用presponder指令,如图五所示,列出了集成于tableView控件的消息传递链,方便我们查看消息是如何传递的。

这里只对常用的几个封装的命令进行了举例说明,其他常用的命令还有很多(详情见文末),都是使用python封装了一下函数然后调用的。凡是这些封装的命令,你都可以通过多个lldb命令打出来,Chisel插件帮我们集成了一些常用的指令集,如果你会使用python的话,那么你可以根据自己的使用习惯封装一些常用的lldb命令。

其他常用命令参考

Print

在LLDB中,我们执行的最多的可能就是打印操作了,chisel专门为这类操作封装了一些打印命令。

1、pviews 递归打印所有的view,并能标示层级

2、pvc 递归打印层级viewController

3、ptv 打印屏幕中显示的tableView,主要是与pcells联合使用。如果有多个tableView,打印View层级中

最上面的一个。

4、pcells 打印tableView中当前可见的cell,如果有多个tableView,打印View层级中最上面的tableView

的可见cell。

5、pdata 对编码过的NSData进行解码打印,等效于调用-[NSString initWithData:encoding:]

6、po 以对象的方式打印结果

Find

1、fvc 根据类名搜索内存中与之匹配的 view

usage:Syntax: fvc [--name=classNameRegex] [--view=view]

--name/-n: string类型参数,根据viewController的Class名字查找viewController

--view/-v: UIView类型参数,根据viewController拥有的view查找viewController

Note:上面2个option不能同时使用,只能使用某一

2、fv 通过类名搜索当前内存中存在的viewController实例的命令,支持正则搜索。

3、taplog 将点击的view打印出来,这个命令对于查找哪个view非常有帮助。

usage:我们需要先将程序暂停,输入taplog,程序会自己运行,这时候点击你需要查看的view,控制台上就会显示出你刚刚点击的view相关信息。

Note:要查看的view必须能接收点击事件,也就是他的userInteractionEnabled必须为YES才能被找到,UILabel和UIImageView默认userInteractionEnabled为NO。

4、vs 在view层级中搜索view,并显示出来

Note:相比fv,vs主要用于显示view在屏幕上的位置

Display

1、caflush 一般我们用LLDB命令改变UI,UI并不会立即更新,我们需要使用caflush刷新界面

2、border 给View或者layer加上border

usage:

Syntax: border [--color=color] [--width=width]

<viewOrLayer>

--color/-c: 边框颜色,string类型

--width/-w: 边框宽度

<viewOrLayer>: 需要设置边框的view或者layer

3、mask 给view添加一个半透明的矩形mask,用来查看view的位置

usage:Syntax: mask [--color=color] [--alpha=alpha] <viewOrLayer>

--color/-c: mask的颜色,string类型

--alpha/-a: mask的透明度

<viewOrLayer>: 需要添加mask的view或者layer

4、show 显示一个view或者layer,相当于执行

view.hidden = NO

Preview

1、visualize 用预览App打开UIImage, CGImageRef, UIView, CALayer等对象

usage:

Syntax: visualize <target>

<target>: 需要预览的对象,id类型

Debug

1、bmessage 在类方法或实例方法中设置符号断点,而且不用担心层次结构中具体是哪个类实现了该方法。

usage:Syntax: bmessage <expression>

<expression>: 设置断点的方法名

2、wivar 在对象的实例上设置观察点(watchpoint)

usage:

Syntax: wivar <object> <ivarName>

<object>: 需要为成员变量设置watchpoint的对象。id类型

<ivarName>: 成员变量的名字,注意一般属性对应的成员变量带有_前缀

Autolayout

autolayout中有一种bug叫Ambiguous Layouts,意思是你设置的约束不足以确定view的位置或大小。比如你只设置了X轴的位置,没有设置Y轴的位置。

autolayout提供了专门判断和查找这类问题的方法:

1、hasAmbiguousLayout用于判断是否存在Ambiguous Layouts

2、_autolayoutTrace用于查找存在的Ambiguous Layouts

alamborder

即使有上述查找的方法,真正去做这个事儿也比较费时费力的, alamborder给存在Ambiguous Layouts的view加上border,方便查找哪些View存在问题。

usage:

Syntax: alamborder [--color=color] [--width=width]

1、--color/-c: border的颜色,参数为string类型,比如’red’, ‘green’, ‘magenta’等,不设置默认为红色。

--width/-w: border的宽度,参数为CGFloat类型,不设置默认宽度为2。

alamunborder

去掉alamborder设置的border。

usage:Syntax: alamunborder

e.g: 针对上面设置的border,在lldb控制台输入alamunborder即可去掉边框。

paltrace

打印某个View的autolayout详细信息,相当于调用_autolayoutTrace

usage:Syntax: paltrace <view>

其中<view>: 需要打印详细信息的view,不传参数默认为keyWindow。

eg: 查看一下keyWindow上有哪个view存在Ambiguous Layouts。

这篇文章是为了想你展示 LLDB 中Chisel插件的强大之处,鼓励我们避开繁琐的 NSlog, 尝试并探索在控制台使用命令的便捷性。

当然Chisel的命令很多,在这里只对常用的一些命令进行了总结,若有其他需求,请大家移至Chisel参考文档:github.com/facebook/ch…

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

相关文章:

Chisel-xcode 下的调试神器

LLDB 是一个有着 REPL 的特性和 C ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部&#xff0c;存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它&#xff0c;你可以查看变量的值&#xff0c;执行自定的指令&#xff0c;并且按照你所认为合适的步骤来操作…...

C语言运算符优先级一览表

优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式) 函数名(形参表) . 成员选择&#xff08;对象&#xff09; 对象.成员名 -> 成员选择&#xff08;指针&#xff09; 对象指针->成…...

C#在.NET Windows窗体应用中使用LINQtoSQL

目录 一、新建Windows窗体应用并添加LINQtoSQL类 二、错误信息CS0234 三、添加扩展包让Windows窗体应用支持LINQtoSQL类 默认安装的背景下&#xff0c;新建的Windows窗体应用是不支持LINQtoSQL类的。现象是资源管理器里的依赖项中默认的安装不能自动生成支持system.data.lin…...

Unity json反序列化为 字典存储

当在Unity游戏中需要加载和管理游戏数据&#xff0c;通常使用JSON文件是一种常见的方法。在本篇博客中&#xff0c;我们将深入探讨如何使用C#和Unity的JSON反序列化功能来实现这一目标。我们可以使用Unity的JsonUtility来反序列化JSON数据并将其映射到自定义的C#数据结构中。 …...

助力青少年学习,亚马逊云科技2024年全球人工智能和机器学习奖学金计划正式启动

云未来将以何种方式发展&#xff1f;方向握在意气风发的少年们手中。近日&#xff0c;亚马逊云科技全球人工智能和机器学习&#xff08;AI和ML&#xff09;奖学金计划在中国区的首次颁奖以及2024年启动仪式在北京中学正式举行&#xff0c;有45名学子凭借杰出的学业成绩、对人工…...

华为机试练习题:HJ13 句子逆序

1、完整题目 HJ13 句子逆序 描述 将一个英文语句以单词为单位逆序排放。例如“I am a boy”&#xff0c;逆序排放后为“boy a am I” 所有单词之间用一个空格隔开&#xff0c;语句中除了英文字母外&#xff0c;不再包含其他字符 数据范围&#xff1a;输入的字符串长度满足…...

windows环境下安装Java过程(免登录Oracle官网下载java)

下载路径 oracle官网&#xff1a; java下载路径 Oracle共享账号可下载JDK&#xff1a; 指路 安装流程 执行下载后的jdk的可执行文件一路next下去&#xff0c; 可以自定义安装路径添加环境变量&#xff0c; 两个地方需要添加 在cmd中输入java -version 进行验证&#xff0c;…...

openssl交叉编译 (ubuntu+arm)

1.下载安装包 wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz 2.解压安装包 tar -zxvf openssl-1.1.1l.tar.gz 3.进入源码文件夹-修改编译器 CCarm-linux-gnueabihf-gcc 4.配置编译参数 ./config no-asm -shared --prefix/home/alientek/sp_test/openssl/sp…...

Python 海龟绘图基础教学教案(十七)

Python 海龟绘图——第 34 题 题目&#xff1a;绘制下面的图形 解析&#xff1a; 使用循环绘制楼梯形。 答案&#xff1a; Python 海龟绘图——第 35 题 题目&#xff1a;绘制下面的图形 解析&#xff1a; 使用二重循环绘制四个方块。 答案&#xff1a;...

element ui多选框(Checkbox 多选框、Select多选框)编辑时无法选中的解决办法

1. Checkbox 多选框无法选中的解决办法: <!--v-model绑定的值必须是[],不能是字符串--><el-form-item label="配布对象" prop="reptGroupArray" > <!--多选--><el-checkbox-group v-model="form.reptGroupArray" size=&q…...

TCP/IP--七层通信

文章目录 TCP/IP--七层通信先来看一下会话层以上的处理再来看一下传输层以下的处理 TCP/IP–七层通信 下面举例说明7层网络模型的功能。假设使用主机A的用户A要给使用主机B的用户B发送一封电子邮件。 在七层OSI模型中&#xff0c;如何模块化通信传输&#xff1f; 先来看一下七…...

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)

1 数据对象的创建 CtrlH打开Model Explorer&#xff0c;在Base workspace中点击工具栏add&#xff0c;出现如下界面&#xff0c; 可以看到Simulink提供了多种数据类型 Matlab Variable&#xff1a;Simulink.Parameter&#xff1a;使用该数据对象表示工程应用中的标定量Simuli…...

重启某个节点、重启电脑服务器后,kubernetes无法运行,k8s无法运行

问题描述 环境&#xff1a;ubuntu18.04 LTS 现象&#xff1a;按步骤安装kubernetes后&#xff0c;正常启动&#xff0c;各个命令均可正常使用。服务器重启后&#xff0c;执行命令错误信息如下&#xff1a; sudo kubectl get nodesThe connection to the server 127.0.0.1:644…...

【ARMv8 SIMD和浮点指令编程】浮点加减乘除指令——四则运算

浮点指令有专门的加减乘除四则运算指令,比如 FADD、FSUB、FMUL、FDIV 等。 1 FADD (scalar) 浮点加法(标量)。该指令将两个源 SIMD&FP 寄存器的浮点值相加,并将结果写入目标 SIMD&FP 寄存器。 该指令可以产生浮点异常。根据 FPCR 中的设置,异常会导致在 FPSR 中…...

JDBC SQL Server Source Connector: 一览与实践

在快速发展的数据驱动业务环境中&#xff0c;确保数据在各个系统间高效、准确地同步至关重要。为了进一步的数据处理和分析&#xff0c;经常需要将这些数据同步到其他数据处理系统。Apache SeaTunnel 提供了一个强大而灵活的数据集成框架&#xff0c;使得从 SQL Server 到其他系…...

WebDAV之π-Disk派盘 + Keepass2Android

推荐一款密码管理器,允许人们使用复杂的组合进行登录,而不必记住所有的组合。 Keepass2Android可以支持大多数安卓互联网浏览器, Android设备上同步软件,还支持通过WebDAV添加葫芦儿派盘。 Keepass2Android 目前安全方面最大的问题之一是大多数人几乎在任何地方都使用通用…...

AspectJX - Android开发平台的AOP框架

官网 GitHub - HujiangTechnology/gradle_plugin_android_aspectjx: A Android gradle plugin that effects AspectJ on Android project and can hook methods in Kotlin, aar and jar file. 项目简介 一个基于AspectJ并在此基础上扩展出来可应用于Android开发平台的AOP框架…...

【TDK 电容 】介电质 代码 对应温度及变化率

JB 电解质是什么&#xff1f;没找到&#xff0c;只有TDK有&#xff0c;也只有这个温度的区别&#xff0c;并且已经停产在售。 对比发现是mouser网站关于电容的描述错误。下图显示正确的&#xff0c;再然后是错误的。 在TDK官网&#xff0c;这样的描述 温度特性 分类标准代码温…...

随笔--解决ubuntu虚拟环境的依赖问题

文章目录 问题一&#xff1a;在conda虚拟环境中报错ImportError: libcupti.so.11.7:cannot open shared object file: No such file or directory解决步骤问题二&#xff1a; RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling cublasSgemmStridedBatched( …...

Gin学习笔记

Gin学习笔记 Gin文档&#xff1a;https://pkg.go.dev/github.com/gin-gonic/gin 1、快速入门 1.1、安装Gin go get -u github.com/gin-gonic/gin1.2、main.go package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {// 创建路由引…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...