当前位置: 首页 > 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() {// 创建路由引…...

身份证OCR识别接口接入实战:Python/Java/PHP/C#四语言代码示例与踩坑指南

#身份证OCR, #OCR接口, #API接入, #Python示例, #Java示例, #PHP示例, #踩坑指南, #石榴智能, #实名认证, #图片识别 身份证OCR识别接口接入实战&#xff1a;Python/Java/PHP/C#四语言代码示例与踩坑指南 作者&#xff1a;石榴智能技术团队 一、前言 身份证OCR识别已经不是什…...

一次搞懂内存取证:用Volatility3和Cobalt Strike分析工具复现VNCTF‘来一把紧张刺激的CS’

实战内存取证&#xff1a;从Volatility3到Cobalt Strike信标分析全解析 在网络安全事件响应中&#xff0c;内存取证往往是发现高级威胁的最后一道防线。当攻击者使用文件无落地的技术时&#xff0c;传统的磁盘取证可能一无所获&#xff0c;而内存中却保留着攻击行为的完整痕迹。…...

从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题

从安装到排错&#xff1a;手把手解决Linux服务器上Nacos启动失败的十大常见问题当你在Linux服务器上部署Nacos时&#xff0c;是否遇到过启动失败却无从下手的困境&#xff1f;作为阿里巴巴开源的服务发现和配置管理平台&#xff0c;Nacos在微服务架构中扮演着重要角色。然而&am…...

Windows开机自动全屏打开指定网页?一个快捷方式参数就搞定(Chrome/Edge/Firefox教程)

Windows开机自动全屏展示网页的终极方案每次开机都要手动打开浏览器、输入网址、切换全屏模式&#xff1f;这种重复操作不仅浪费时间&#xff0c;还容易在重要演示时手忙脚乱。想象一下&#xff1a;电脑启动后自动全屏显示你的仪表盘、会议日程或是监控大屏&#xff0c;整个过程…...

DeepSeek安全测试辅助Prompt工程白皮书(含17个CVE靶场验证指令模板)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek安全测试辅助 DeepSeek系列大模型在代码生成、漏洞模式识别与安全上下文理解方面展现出独特优势&#xff0c;可作为安全测试工程师的智能协作者。其对OWASP Top 10、CWE分类体系及常见PoC结构具…...

Lovable电商网站搭建,为什么92%的初创团队在第3周就遭遇性能雪崩?

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Lovable电商网站搭建 Lovable 是一个面向中小商户的轻量级电商解决方案&#xff0c;采用现代 Web 技术栈构建&#xff0c;强调可扩展性、用户体验与快速部署。其核心基于 Vue 3&#xff08;Composition API&a…...

计算机视觉的实战项目:从0到1搭建属于自己的图像识别系统

作为软件测试从业者&#xff0c;我们每天都在和各类功能验证、兼容性测试、自动化测试框架打交道&#xff0c;对AI领域的实战项目往往觉得“门槛高”“和日常工作不沾边”。但随着AI技术在互联网产品中的落地越来越深入&#xff0c;图像识别功能已经成为很多APP、智能硬件的核心…...

别再只会用--nogpgcheck了!手把手教你安全修复PostgreSQL yum源的GPG密钥问题

企业级PostgreSQL部署&#xff1a;安全解决GPG密钥验证的完整方案 当你在生产环境中部署PostgreSQL时&#xff0c;遇到GPG签名验证错误直接使用--nogpgcheck绕过检查&#xff0c;就像因为门锁打不开就直接把门拆掉一样危险。本文将带你深入理解GPG验证机制&#xff0c;并提供一…...

终极音乐解锁指南:3步让加密音乐在任何设备自由播放

终极音乐解锁指南&#xff1a;3步让加密音乐在任何设备自由播放 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https:/…...

Actor Framework里的“多米诺骨牌”:一个错误如何让整个嵌套操作者链崩溃?

Actor Framework中的“多米诺效应”&#xff1a;如何避免嵌套操作者链的崩溃 在分布式系统设计中&#xff0c;Actor模型因其天然的并发处理能力而备受青睐。LabVIEW的Actor Framework(AF)通过操作者(actor)的嵌套结构&#xff0c;为复杂系统提供了模块化解决方案。然而&#x…...