iOS调试

摘要:
在iOS高效调试和代码编写中,很难避免错误。现在,让我们分享我在工作中使用的一些常见iOS调试技巧。Xcode嵌入式LLDB调试窗口。3.expr可以在调试期间动态执行指定的表达式并打印结果。它通常用于在调试期间修改变量的值。命令命令集合英语不好的学生可以阅读https://blog.cnbluebox.com/blog/2015/03/05/chisel/5.界面调试利器:RevealReveal绝对是iOS界面调试利器。效果6.调试工具集:FLEXFLEX是一系列Flipboard开源工具集,用于在应用程序中进行调试。

iOS高效调试

写代码难免出现bug储备些调试技能绝对能够提高你的工作效率,让bug无所遁形。下面就和大家分享一些我在工作中常用的iOS调试小技能。

1. 打印

最简单,基础的调试方法就是打印日志了。贴出封装好的日志打印代码:

#ifdef DEBUG

     #define DLog(fmt, ...) NSLog((@"<%s : %d> %s  " fmt), [[[NSString stringWithUTF8String:__FILE__] lastPathComponent]   UTF8String], __LINE__, __PRETTY_FUNCTION__,  ##__VA_ARGS__);

#else

    #define DLog(...)

#endif

eg:

//在AppDelegate.m中调用下面的方法

- (void)applicationDidFinishLaunching:(UIApplication *)application{

    DLog(@"hello world");

}

//打印结果: 2016-09-18 17:19:27.931 DateCell[2901:1622220] <AppDelegate.m : 54> -[AppDelegate applicationDidFinishLaunching:]  hello world

2. 断点

(1)普通断点

普通断点是调试中最常使用的。当程序运行到断点处就会暂停运行。其设置方法非常简单:在需要设置断点的代码行的左侧单击即可。

1748276-5021b617725d6d14.png

普通断点

(2)条件断点(为断点添加条件和其他属性,暂且就称它条件断点)

条件断点是在普通断点的基础上添加了判断条件。当程序执行到断点处,并且满足设置的条件时断点才会有效。设置方法如下:

1748276-4757cfd4456badd3.png

打开断点编辑框

1748276-ec4305f11074063b.png

这里写图片描述

在上面的设置中,条件断点的条件是 i==3那么在整个循环中只有在i=3时程序才会在断点处停止执行。

Edit Breakpoint...窗口中有下面四个输入项:

  • Condition 设置的条件。
  • Ignore 表示忽略多少次之后断点有效。例如:不设置条件,Ignore设置为4,则i=4时程序在断点处停止。
  • Action 在程序断点处执行的操作(执行完这个操作后代码停止运行,此时设置断点处的代码还没有执行)。这里的操作是LLDB语句,关于LLDB会在下面介绍。
  • Options 当选中时,执行完Action的操作后代码不会停止,就像没有设置断点一样。

(3)异常断点Exception BreakPoint

在设置异常断点的情况下当程序crash Xcode会帮我们定位到crash产生的位置。

1748276-7514ce072dccf274.png

没有异常断点的情况

1748276-f413a7763c107d88.png

设置异常断点的情况

设置异常断点步骤:

1748276-22fb1c126677fe1f.png

这里写图片描述

(4)符号断点Symbolic Breakpoint

符号断点能够为某一个方法或者某一个类的某一个方法设置断点。实现的功能如下图:

1748276-3bb5df3ff9ce5050.png

某一个类的某一个方法设置断点

1748276-3ec9d23c4ebd9791.png

在某个方法中执行断点

设置步骤如下:

1748276-9a5c360602e90df0.png

符号断点设置步骤

3. LLDB

LLDBXcode默认的调试器,我们通过执行LLDB命令使调试过程更加的灵活。

Xcode内嵌LLDB调试窗口。在程序执行到断点后你可以输入LLDB命令操作调试过程。

1748276-a5c0ddd5ca09e37b.png

LLDB调试窗口

LLDB常用命令如下:

1 po (print object)输出对象, po [self view];

2 p print)用于输出基本类型, p (int)[[[self view] subviews] count] 输出子视图个数。

3 expr (expression) 可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。例如上图所示,程序第一次执行到断点时

执行下面的指令:expr i=4

你会看到如下的输出: (int) $0 = 4

继续运行程序,程序输出的信息是:value:4 i==4

4 call call即是调用的意思。其实上述的pop也有调用的功能。因此一般只在不需要显示输出,或是方法无返回值时使用call。我们可以在viewDidLoad:里面设置断点,然后在程序中断的时候输入下面的命令: call [self.view setBackgroundColor:[UIColor redColor]] 此时view的背景颜色变为红色。

5, bt 打印调用堆栈,加all可打印所有thread的堆栈。不详细举例说明,感兴趣的朋友可以自己试试。

6 fr v -R 命令来打印出变量的未加工过时的信息

如果想了解更详细的内容,http://lldb.llvm.org/tutorial.html

4. Chisel

Chisel facebook开源的用于界面调试的lldb命令。

安装

Chisel 使用 homebrew 来安装,如果你没有安装homebrew, 参考http://brew.sh

brew update

brew install chisel

安装完成后,在~/.lldbinit 中添加如下内容,没有~/.lldbinit则新建。

# ~/.lldbinit

...

command script import /path/to/fblldb.py

重启Xcode, 此时Chisel就可以使用了。

命令

1748276-721e732ee27627fc.png

命令集合

英语不好的同学可以看https://blog.cnbluebox.com/blog/2015/03/05/chisel/

5. 界面调试利器:Reveal

Reveal 绝对是iOS界面调试利器。只要用上一次你就会离不开它。对于Reveal的介绍可以去官网了解。

安装

Reveal是收费的,提倡正版。下面的破解版只供教学使用,不可用于生产环境。

1https://revealapp.com下载Reveal并安装;

2, 下载破解文件https://pan.baidu.com/share/init?shareid=3490432084&uk=2620796126提取密码:7x48

3,破解步骤见破解文件中的使用说明。

4打开Reveal,开始使用。Reveal的新版本可能修改验证逻辑,如果没有破解成功那就使用正版的吧。

在项目中配置

在使用Reveal之前需要对iOS项目进行简单配置,配置步骤如下:

1使用Xcode打开你想要查看UI的工程;

2打开Reveal,点击 Help Show Reveal Library in Finder

1748276-f145753f454213df.png

这里写图片描述

3,将Reveal.framework 拖入打开的Xcode工程.并点击完成;

1748276-dd2689f49cc20e61.png

这里写图片描述

4,点击Build Phases 然后从Link Binary With Libraries 删除Reveal.framework

1748276-2d8be2c9531c590b.png

Link Binary With Libraries 删除Reveal.framework

5然后选中Build Settings 在搜索栏中输入 Other Linker Flags。选中Other Linker Flags

Other Linker Flags中输入下面代码-ObjC -lz -framework Reveal

1748276-04d19960011bf0a4.png

配置 Other Linker Flags

6,运行模拟器,打开Reveal,链接模拟器。

1748276-46c3f28630ba2225.png

链接模拟器

到此大功告成。接下来你就可以通过Reveal 对你的界面进行debug了。

1748276-47c29c38c8b1f28a.png

效果

6. 调试工具集:FLEX

FLEXFlipboard开源的一系列在应用中调试的工具集。FLEX以第三方库的形式集成在应用中,使用时将类库加到工程中,然后通过调用[[FLEXManager sharedManager] showExplorer];就可显示出用于调试的工具栏进行调试。

它提供的功能如下:

  • 查看、修改views
  • 查看任何对象的属性
  • 动态的修改属性
  • 动态的调用实例方法和类方法
  • 查看网络请求过程
  • 添加模拟的键盘快捷键
  • 查看系统日志
  • 从堆中获取任何对象
  • 查看沙盒中的文件
  • 查看文件系统中的SQLite/Realm数据库
  • 在模拟器中触发3D touch
  • 查看你应用中所有的类
  • 快速获取常用的类,例如[UIApplication sharedApplication], the app delegate, the root view controller on the key window, and more.
  • 动态的查看NSUserDefaults里面的值

简直吊炸天。当你将FLEX集成到你项目中时就会认识到它的威力。

结语

上面介绍了六种调试方法,开发时可以根据具体情况选用最合适的调试方法。如果本博文对你有帮助就送个喜欢吧。

 

免责声明:文章转载自《iOS调试》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Centos7下安装.bin格式[微信小程序] 微信小程序下拉滚动选择器picker绑定数据的两种方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android调试工具及方法

转自:http://www.cnblogs.com/feisky/archive/2010/01/01/1637566.html Logcat Dump一份系统消息的日志。这些消息包括模拟器抛出错误时的堆栈跟踪。 Android Log 一个记录日志的类,用来将消息写入模拟器上的日志文件中。如果你在DDMS上运行logcat的话你可以就实时查看消息。在你的...

Xamarin 跨移动端开发系列(01) -- 搭建环境、编译、调试、部署、运行

   (本文是基于老版本的VS和Xamarin,而VS2017已经集成了Xamarin,所以,本文已经过时,最新的Xamarin开发介绍请参见 使用 Xamarin开发手机聊天程序 。)    如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的...

[WPF] 如何调试Data Binding

前言 在WPF开发中,将ViewModel中对象绑定到UI上时,会出现明明已经将数据对象Binding到UI,但是UI上就是不显示等等的问题。这篇博客将介绍WPF Data Binding调试相关的内容。 场景一(Binding的属性不存在) ViewModel: public partial classMainWindow : Window {...

Linux内核调试方法总结之backtrace

backtrace 【用途】用户态或者内核态程序异常退出时回溯堆栈信息 【原理】通过对当前堆栈的分析,回溯上层函数在当前栈中的帧地址,直至顶层函数。帧地址是指在栈中存在局部变量、上一级函数返回地址、寄存器值的内存空间。由于不同处理器堆栈实现不同(向上增长和向下增长),此功能的具体实现是编译器内建的__buildin_frame_address及__buil...

Xcode的控制台调试命令

XCode4.0以后,编译器换成了LLVM 编译器 2.0 与以前相比,更加强大:1.LLVM 编译器是下一带开源的编译技术.完全支持C, Objective-C, 和 C++.2.LLVM 速度比 GCC快两倍,建立的程序也会运行的更快. 因为它更好的利用现代的芯片的结构.3.LLVM和Xcode 4完全的整合在一起.包括关键字高亮,代码完整性等全都是由...

java jdb命令详解

jdb - Java debugger 功能描述: 通过简单的命令行程序,对本地或远程jvm进程进行调试。 开启jdb会话:有多种方式可以开启jdb会话. (1)常见的方式是采用Jdb命令打开一个新的jvm进程进行调试. 通过将jvm进程启动命令的java替换成jdb就可以了。 通过此方式启动jdb会话,将开启一个jvm进程,加载指定的class, 并停在...