本文转载至 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

    1. pony debugger 待尝试http://blog.csdn.net/ysy441088327/article/details/8797095
      7.xcode断点相关高级设置(待实践!!!)http://www.cocoachina.com/applenews/devnews/2013/0701/6514.html

iOS 调试大法的更多相关文章

  1. iOS调试

    iOS高效调试 写代码难免出现bug.储备些调试技能绝对能够提高你的工作效率,让bug无所遁形.下面就和大家分享一些我在工作中常用的iOS调试小技能. 1. 打印 最简单,基础的调试方法就是打印日志了 ...

  2. Xamarin.iOS调试提示需要iOS SDK

    Xamarin.iOS调试提示需要iOS SDK   错误信息:The version of Xamarin.iOS requires th iOS 9.3 SDK (shipped with Xco ...

  3. iOS 调试心得

    修复 bug 占用我们日常开发的大部分时间,熟练的使用调试工具可以给我们节约大部分的时间. LLDB 的常用命令 expression expresion 是一个非常常用的命令,我们可以通过这个命令来 ...

  4. iOS 调试 crash breakpoint EXC_BAD_ACCESS SIGABRT

    原文地址:iOS 调试 crash breakpoint EXC_BAD_ACCESS SIGABRT作者:流年若离殇 在调试程序的时候,总是碰到crash的bug,而且一追踪就是一些汇编的代码,让人 ...

  5. 提高Android和iOS调试编译速度

    http://www.cnblogs.com/findumars/p/7841252.html 提高Android和iOS调试编译速度   如果您使用Delphi开发App,就会遇到:Android和 ...

  6. Android调试大法 自定义IDE默认签名文件==>微信支付、微信登录、微信分享,debug时调试通过,release时调不起微信

    转载地址:http://blog.yanzhenjie.com Android调试大法之自定义IDE默认签名文件,你是否为调试第三方SDK时debug签名和release签名发生冲突而烦恼?你是否在d ...

  7. uniapp - 关于ios调试

    [ios调试] 1.一台windows电脑.一根apple数据线(一旦连接以后,apple设备就会自动识别itunes软件,如果没有安装会提示) 2.安装itunes (爱思助手) 3.官方教程:ht ...

  8. Java调试大法,来了~

    很多同学经常问我:彤哥,你的源码为什么讲的那么好那么细,有没有什么方法? 此时,我一般回复四个字:调试大法. 然后,他们就会很懵逼:调试我也会呀,但是,我就做不到你那么细(像是在夸我),难道调试还有我 ...

  9. [转] iOS SDK:iOS调试技巧

    原文:  http://www.cocoachina.com/ios/20130517/6225.html 为什么你的数组包含3个项目而不是5个?为什么你的游戏运行缓慢?这些都跟调试有关,调试是开发过 ...

随机推荐

  1. selenium 3+java 配置全

    之前有配置过java+selenium的环境,感觉将的不够详细,这里重新写一篇,以便日后复习,和大家共享. 一.准备工作. 首先在配置之前需要准备以下:   JDK    Eclipse    Sel ...

  2. JS_高程2.在HTML中使用Javascript(1)

    1.使用<script>元素向HTML页面中插入Javascript HTML4.01中<script>标签有6个属性: (1)async:可选.表示立即下载脚本,不影响页面中 ...

  3. 中国地图(Highmaps)

    1.中国地图省份和市 调用的包( <script src="https://img.hcharts.cn/jquery/jquery-1.8.3.min.js">< ...

  4. Hibernate关系映射时出现的问题

    在学习Hibernate框架的关系映射时,遇到了一个问题: INFO: HHH000422: Disabling contextual LOB creation as connection was n ...

  5. How to do conditional auto-wiring in Spring?

    ou can implement simple factory bean to do the conditional wiring. Such factory bean can contain com ...

  6. 更新 app 操作过期提示

    增加的操作过期提示,再让用户选择是否登录,登录成功后自动返回上一次操作的面页

  7. ssh 多次登录禁用账号

    vi /etc/pam.d/sshd #%PAM-1.0auth required pam_tally2.so deny=3 unlock_time=600 even_deny_root root_u ...

  8. vim8.0模式详解

    pattern pattern.txt For Vim version 8.0. 最近更新: 2017年8月 VIM 参考手册 by Bram Moolenaar 译者: lang2 http://v ...

  9. vue-cli配置多入口多出口,实现一个项目两个访问地址,区分不同上线环境

    最近工作中需要把项目分割成两块,一块需要跑在微信中,通过微信jdk获取用户资料默认登录,一部分需要给原生app做webview的内嵌页面,当然这部分内容是不跑在微信中的. 所以我想到了把项目分成两部分 ...

  10. spring boot swagger-ui.html 404

    很奇怪的问题,找了好久. 因为spring boot+swagger实现起来很简单.看下面三部曲: 1.pom添加两个swagger依赖. <!-- Swagger依赖包 --> < ...