你的位置:首页 > 操作系统

[操作系统]iOS断点及打印日志


首先,最简单的断点就是在Xcode项目文件中任意一行行号那点一下,就是加了一个断点

再次点击会变成浅蓝色,表示disable掉了

disable掉的断点不会起作用,但会在左上角蓝色的标签那留下记录,这里记录下了你设置的所有断点,然后在这你可以点一下浅蓝色的位置enable一些断点。

删除断点只要在断点位置右键点击Delete Breakpoint就行了;也可以左键点住断点往外拖再松掉,会出现一个灰尘气泡;还可以在标签那边的断点右键delete。

设置了一个断点后,再执行程序,程序编译到断点处时会停止,并出现这样的画面,在这里我们可以看到一些参数,self代表当前对象,其他的则是执行到当前语句时这个方法或者说这个栈里面分配的对象

如果想查看更多对象的话,点击左下角选择all。

在右边lldb这是一个debug的工具,可以输入一些命令来打印一些信息,左边的信息可以通过这里打印出来

可以输入po(pring project)来打印对象以及p(pring)来打印一些基本类型或者结构体

如果不喜欢命令行,也可以在左边选择一行右键选择Pring Description

这样在右边也会像命令行一样在lldb这打印出来

lldb还有很多功能,可以在苹果官方文档中输入lldb查看。

在上方Debug里面还有很多命令。continue表示继续运行;continue to current line表示继续运行到当前行;step over表示不进入当前方法,直接进行下一个方法;step into表示进入到方法中的方法;step out则和step into正好相反的操作。还有step over instruction和step into instruction,instruction表示指令的意思,CPU的指令,如果想单步CPU的指令,可以点击它们,它们是指令级的step;至于step over thread和step into thread表示只在当前线程当中执行,其它线程都停止执行,这个主要在debug多线程时使用,为了防止其它线程的干扰。

接下来介绍一些断点高级一些的用法。

找到一个循环,比如for循环,在其中设置一个断点,再右键选择edit breakpoint,对这个断点进行一些定制,这里有一些参数,condition表示一个条件,当满足该条件时程序断住;ignore表示ignore多少次后断住;action可以添加一个动作,比如debugger command,可以输入一个lldb的命令,当程序断住时执行这个动作;最后一个options选中的话表示不断住,程序满足条件执行动作后并不断住。

有时候我们想要知道某件事情发生的时候断住,但并不能确定在哪一行代码,这时候就需要一些更加高级的断点。在断点这个界面左下角有个+号,点击它选择add exception breakpoint,exception表示异常的意思

然后便出现了一个all exceptions,设置它会出来一些选项,第一个exception可以选择object-c或c++还有all,一般选择all就ok了;break可以选择在抛出异常或处理异常时断住,默认是抛出;action和options就和前面提到的一样了。最好在项目中添加一个这样的断点以备用。

接下来讲一下另一种断点,在断点那个界面左下角+号那选择add symbolic breakpoint,基于符号的断点

设置它也会出来一些选项,symbol中可以写一个方法,表示当程序执行到该方法的时候断住;module表示在类库或可执行的程序里;下面的就和前面讲的都一样了。

以上讲的Debug版的断点,还有release版的断点,在中选择edit scheme

然后在这里选择release,在release版中设置断点运行程序时会进行优化,信息可能不是很有用,顺序有时也会和原来不一样,Debug版则会忠实的按照顺序运行,因此release执行速度会比较快,但平常我们开发都使用Debug版,当你的程序要发布时使用release版,保证用户使用的是你的release版,因为它的性能要优于Debug版,它跑的更快,运行的文件更小。

有些情况下不适合使用断点,比如有些bug只在release版里出现,Debug中正常;多任务,多线程的程序;实时性要求比较高的,比如依赖时间的;客户端和服务器架构的;还有进程之间,某个进程依赖你要设置断点的进程时。这时就要使用另外一种手段,打印log(日志)。

原生的打印有NSLog,在Debug版和release版都可以打印,Cocoas2d中有一个CCLog在Debug版中能正常打印,在release版中则会执行一个空语句,因为打印是件麻烦事儿,release版得保证性能。

打印时间戳工具函数:

static double gBaseTime = 0.0;

void logCurTimeStamp(NSString * comment)

{

  double cur_time = [[NSDate date] timeIntervalSince1970];

  double time_past = cur_time - gBaseTime;

  gBaseTime = cur_time;

  NSLog(@"[%@] cur time = %.4f", comment, time_past);

}

以上内容来自丁群的视频,网址是http://www.maiziedu.com/course/cocos2d/246-2161/。