本文转载至 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. HashMap实现原理(jdk1.7/jdk1.8)

    HashMap的底层实现: 1.简单回答 JDK1.7:HashMap的底层实现是:数组+链表  JDK1.8:HashMap的底层实现是:数组+链表/红黑树     为什么要红黑树?  红黑树:一个 ...

  2. 分析java内存情况

    使用pmap查看进程内存 运行命令 使用pmap可以查看某一个进程(非java的也可以)的内存使用使用情况, 命令格式: pmap 进程id 示例说明 例如运行: pmap 12358 显示结果如下图 ...

  3. jQuery 学习03——HTML:捕获、设置、添加元素、删除元素、CSS类、CSS()方法、尺寸

    jQuery - 获取内容text().html() 以及 val()和属性attr() jQuery 中非常重要的部分,就是操作 DOM 的能力. DOM = Document Object Mod ...

  4. Lua模块的加载与内存释放

    今天早上听说一件事情让我觉得很诡异的事情:公司线上的一款游戏,加载一份配置资源后,内存涨了几十M,然后内存再也下不来了.因为好奇,所以要来了最大的一个配置文件(4.5M,去除空格与换行后的大小),进行 ...

  5. Compiler Error: Function call with parameters that may be unsafe

    如下的代码: #include <stdio.h> #include <string> #include <algorithm> #include <cass ...

  6. SSH + Google Authenticator 安全加固

    1. SSH连接 Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境.SSH通过在网络中创建安全隧道来实现SSH客户端与服务器 ...

  7. Win7 32位下cocos2dx android开发调试环境

    1.使用环境 win7 32位 + vs2010 2.软件准备(下方绿色文字带链接) cocos2dx-v2.2.2 jdk7 android sdk android ndk adt bundle a ...

  8. 关于海康威视与Unity3d集成冲突问题解决

    一.集成 1.1 了解什么是ANSI系列与GNU系列    https://baike.baidu.com/item/ANSI%20C/7657277?fr=aladdin    https://ww ...

  9. unbuntu系统( PC机 )中安装360wifi步骤

    少说废话,每一步都经过验证: 1.  首先查看一下当前使用的linux版本: gxjun@gxjun:~$ uname -r 4.8.0-59-generic 2. 将360wifi插入PC的USB中 ...

  10. 关于dede后台登陆后一片空白以及去除版权

    今天家里的电脑上新装DEDE5.7后台登陆后竟然一片空白,装PHPCMS却没有问题.百度了好久,也没找到一个像样的答案,晕死! 看了源码后发现在源码里的类库中很多都是PHP4的语法,var这个函数在P ...