iOS 调试大法
本文转载至 http://www.jianshu.com/p/d19e19a91071
0.笨办法
看变量、对象?NSLog+重新编译运行;
改某对象?改源码+重新编译运行;
隔离某个方法?在方法中写 return 跳出+重新编译运行;
慢!!!
1.LLDB
改源码+重新编译的方式要等待时间太长,并且看起来特别不高端。试试程序员最喜欢的命令行模式——LLDB。
1.1 基本常用命令
- help 查询帮助
print\p\po 打印对象
高级一点:十六进制p/x 16,二进制p/t 16 完整格式清单
po [[UIWindow keyWindow] recursiveDescription] 来检查层次结构,以文本形式打印出完整的视图层次结构
po [[[UIWindow keyWindow] rootViewController] _printHierarchy] 来检查视图控制器expression\e 更改变量值
- bt 打印栈帧信息,貌似用途不大?可以直接去看 xcode 的栈帧信息。
- thread return 在函数
开头thread return,可以隔离函数,伪造返回值,若非开头用这个语句,可能造成内存泄露。
注意
1)在 LLDB 中使用变量要加$符号
p (char)[[$array objectAtIndex:$a] characterAtIndex:0]
2)唯一的缺点就是不能创建新函数... 这意味着不能创建新的类,block,函数,有虚拟函数的 C++ 类等等。
1.2 chisel 下载地址
【常用命令】
1)为了调试 view
- border \ unborder: 画边界
- mask \ unmask:给某个 view 加红色遮罩,便于查找
- show \ hide : 显示、隐藏 view\layer
2)为了看结构
- pclass:打印某对象的类的继承关系
pinternals: 打印某个对象的内部结构和数据
pca: 打印 layer tree
- pvc \ pviews : 打印 vc\view 的层级树
presponder: 打印从某个对象开始的响应链
ptv :打印最高层级的 tableview
- pcells: 打印结构中最高层级的 tableview 的可见 cell
3)查找
- fv \ fvc:用正则查找 view\vc
- vs :遍历查找某个 view
4)刷新
- caflush : 更新 UI
【待挖掘的命令】
- wivar:给对象设置观察点
- bmessage:非重写方法的符号断点
- fa11y
- flicker : 通过闪动查找某个 view
- panim :判断当前代码是否在 uiview 动画 block 中
- pinvocation :打印当前调用的栈帧、接受者、参数(只支持 x86)
- pivar
- taplog:Log tapped view to the console.
- visualize :Open a UIImage, CGImageRef, UIView, or CALayer in Preview.app on your Mac.
查看帮助 (lldb) help
查看某语句帮助 (lldb) help border
2.断点
1)控制台中的 step into\step over\step out按钮
2)xcode-symbolic breakpoint
设置条件、函数和 action(断点行为,每次断点到此处时运行的命令)
3)exception breakpoint
3. 工具
反编译:http://www.hopperapp.com/
Runtime:Aspects:http://github.com/steipete/Aspects
DTrace 框架:苹果新发布的活动追踪 API
4. 总结
步骤:
复现问题-断点+lldb+method swizzling 缩小范围(探查手段,包括 Instruments)-分析如何发生-解决方案
向苹果反馈 bug: http://www.quickradar.com/
与调试器共舞 - LLDB 的华尔兹
1.一篇很赞的ios视图bug调试案例,技术和方法都值得借鉴~http://www.cocoachina.com/ios/20150330/11435.html
2.ios ui调试 http://www.cocoachina.com/ios/20141224/10748.html
3.ios中的crash日志捕获原理及实现详解http://www.cnblogs.com/alario/archive/2012/03/28/2421574.html
4.ios应用崩溃日志分析http://www.cocoachina.com/applenews/devnews/2013/0725/6677.html
5.高级技巧:【iOS/Mac OS】程序崩在objc_msgSend(),怎么办?http://blog.csdn.net/horkychen/article/details/8015109
- pony debugger 待尝试http://blog.csdn.net/ysy441088327/article/details/8797095
7.xcode断点相关高级设置(待实践!!!)http://www.cocoachina.com/applenews/devnews/2013/0701/6514.html
iOS 调试大法的更多相关文章
- iOS调试
iOS高效调试 写代码难免出现bug.储备些调试技能绝对能够提高你的工作效率,让bug无所遁形.下面就和大家分享一些我在工作中常用的iOS调试小技能. 1. 打印 最简单,基础的调试方法就是打印日志了 ...
- Xamarin.iOS调试提示需要iOS SDK
Xamarin.iOS调试提示需要iOS SDK 错误信息:The version of Xamarin.iOS requires th iOS 9.3 SDK (shipped with Xco ...
- iOS 调试心得
修复 bug 占用我们日常开发的大部分时间,熟练的使用调试工具可以给我们节约大部分的时间. LLDB 的常用命令 expression expresion 是一个非常常用的命令,我们可以通过这个命令来 ...
- iOS 调试 crash breakpoint EXC_BAD_ACCESS SIGABRT
原文地址:iOS 调试 crash breakpoint EXC_BAD_ACCESS SIGABRT作者:流年若离殇 在调试程序的时候,总是碰到crash的bug,而且一追踪就是一些汇编的代码,让人 ...
- 提高Android和iOS调试编译速度
http://www.cnblogs.com/findumars/p/7841252.html 提高Android和iOS调试编译速度 如果您使用Delphi开发App,就会遇到:Android和 ...
- Android调试大法 自定义IDE默认签名文件==>微信支付、微信登录、微信分享,debug时调试通过,release时调不起微信
转载地址:http://blog.yanzhenjie.com Android调试大法之自定义IDE默认签名文件,你是否为调试第三方SDK时debug签名和release签名发生冲突而烦恼?你是否在d ...
- uniapp - 关于ios调试
[ios调试] 1.一台windows电脑.一根apple数据线(一旦连接以后,apple设备就会自动识别itunes软件,如果没有安装会提示) 2.安装itunes (爱思助手) 3.官方教程:ht ...
- Java调试大法,来了~
很多同学经常问我:彤哥,你的源码为什么讲的那么好那么细,有没有什么方法? 此时,我一般回复四个字:调试大法. 然后,他们就会很懵逼:调试我也会呀,但是,我就做不到你那么细(像是在夸我),难道调试还有我 ...
- [转] iOS SDK:iOS调试技巧
原文: http://www.cocoachina.com/ios/20130517/6225.html 为什么你的数组包含3个项目而不是5个?为什么你的游戏运行缓慢?这些都跟调试有关,调试是开发过 ...
随机推荐
- jquery 学习 总结
OM = Document Object Model(文档对象模型) 一.基础 1. <script src="http://cdn.static.runoob.com/libs ...
- GPS信号不足情况下,如何用GPRS模块根据基站进行定位
AT+CREG=2 //设置参数,2为返回详细信息,包含基站的地区区域码和基站码 注意:GPRS命令后面都要有回车 AT+CREG? 下面为返回值 ...
- JAVA自学笔记21
JAVA自学笔记21 1.转换流 由于字节流操作中文不是非常方便,因此java提供了转换流 字符流=字节流+编码表 1)编码表 由字符及其对应的数值组成的一张表 图解: 2)String类的编码和解码 ...
- 利用百度OCR实现验证码自动识别
在爬取网站的时候都遇到过验证码,那么我们有什么方法让程序自动的识别验证码呢?其实网上已有很多打码平台,但是这些都是需要money.但对于仅仅爬取点数据而接入打码平台实属浪费.所以百度免费ocr正好可以 ...
- 挖矿病毒 qW3xT.2 最终解决方案
转自:https://blog.csdn.net/hgx13467479678/article/details/82347473 1,cpu 100%, 用top 查看cpu100 2,删掉此进程 c ...
- Linux命令行烧录树莓派镜像至SD卡
首先下载镜像压缩包 验证压缩包的未被串改 1 sha1sum 2013-09-25-wheezy-raspbian.zip 对此命令的输出结果和官网给出的SHA-1 Checksum进行比对,如果一致 ...
- Docker入门 - 001 CentOS Docker 安装
Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发行版本中的内核支持 Docker. ...
- linux下 彻底修改python的包/模块导入路径
python模式下,有时候需要导入 import某些模块或者包.明明这个模块/包是存在的,却提示导入错误,比如,“ImportError: No module named lxml”. 但是当你在命 ...
- Python 爬虫实例(9)—— 搜索 爬取 淘宝
# coding:utf- import json import redis import time import requests session = requests.session() impo ...
- Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc dtS312 s2018 s3f doc compc\Atitit PathUtil 工具新特性新版本 v8 s312.docx s2018 s3f doc compc\Atitit 操作日
Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc ...