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个?为什么你的游戏运行缓慢?这些都跟调试有关,调试是开发过 ...
随机推荐
- HashMap实现原理(jdk1.7/jdk1.8)
HashMap的底层实现: 1.简单回答 JDK1.7:HashMap的底层实现是:数组+链表 JDK1.8:HashMap的底层实现是:数组+链表/红黑树 为什么要红黑树? 红黑树:一个 ...
- 分析java内存情况
使用pmap查看进程内存 运行命令 使用pmap可以查看某一个进程(非java的也可以)的内存使用使用情况, 命令格式: pmap 进程id 示例说明 例如运行: pmap 12358 显示结果如下图 ...
- jQuery 学习03——HTML:捕获、设置、添加元素、删除元素、CSS类、CSS()方法、尺寸
jQuery - 获取内容text().html() 以及 val()和属性attr() jQuery 中非常重要的部分,就是操作 DOM 的能力. DOM = Document Object Mod ...
- Lua模块的加载与内存释放
今天早上听说一件事情让我觉得很诡异的事情:公司线上的一款游戏,加载一份配置资源后,内存涨了几十M,然后内存再也下不来了.因为好奇,所以要来了最大的一个配置文件(4.5M,去除空格与换行后的大小),进行 ...
- Compiler Error: Function call with parameters that may be unsafe
如下的代码: #include <stdio.h> #include <string> #include <algorithm> #include <cass ...
- SSH + Google Authenticator 安全加固
1. SSH连接 Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境.SSH通过在网络中创建安全隧道来实现SSH客户端与服务器 ...
- Win7 32位下cocos2dx android开发调试环境
1.使用环境 win7 32位 + vs2010 2.软件准备(下方绿色文字带链接) cocos2dx-v2.2.2 jdk7 android sdk android ndk adt bundle a ...
- 关于海康威视与Unity3d集成冲突问题解决
一.集成 1.1 了解什么是ANSI系列与GNU系列 https://baike.baidu.com/item/ANSI%20C/7657277?fr=aladdin https://ww ...
- unbuntu系统( PC机 )中安装360wifi步骤
少说废话,每一步都经过验证: 1. 首先查看一下当前使用的linux版本: gxjun@gxjun:~$ uname -r 4.8.0-59-generic 2. 将360wifi插入PC的USB中 ...
- 关于dede后台登陆后一片空白以及去除版权
今天家里的电脑上新装DEDE5.7后台登陆后竟然一片空白,装PHPCMS却没有问题.百度了好久,也没找到一个像样的答案,晕死! 看了源码后发现在源码里的类库中很多都是PHP4的语法,var这个函数在P ...