iOS 调试大法
2016-09-03 14:53
260 查看
本文转载至 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.
chisel commands
查看帮助 (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
相关文章推荐
- SQL 2005 的存储过程和触发器调试大法
- 板子上的调试--点灯大法
- 【iOS开发必备指南合集二】申请IDP/真机调试/GameCenter 指南/OpenFeint指南
- IOS开发 如何联机调试和发布程序(99$) -转载
- iOS app官方开发,调试,发布流程
- iOS利用CoreLocation获取地理位置以及如何在模拟器进行调试
- IOS真机调试error launching remote program failed to get the task 解决方案
- iOS 开发者账户,联机调试,发布应用事宜
- ios如何联机调试和发布程序
- 使用IOS工具调试基本的重分布路由
- ios在真机上调试时出现“Error launching remote program: failed to get the task for process xxx"解决办法(转)
- IOS 设备 通过HTML页面在线安装APP配置(面向越狱设备或者有开发者账号调试APP)
- 【iOS开发必备指南合集一】申请IDP/真机调试/GameCenter 指南/OpenFeint指南 推荐
- Xcode 4.1/4.2/4.3/4.4 + iOS 5.1.1免证书(iDP)开发+真机调试+生成IPA全攻略
- SQL 2005 的存储过程和触发器调试大法(转)
- Google App Engine调试大法
- iOS:调试时在XCode中添加异常断点
- ios 开发中 coredump 调试技巧 [1]
- iOS真机调试 for Xcode 5
- IOS开发 如何联机调试和发布程序(99$)