说到debug,可以说到的东西就太多了,一个程序员,即使逻辑非常出色,也会出现bug问题,那么debug是每个程序员必备的技巧,尤其是Xcode开发,
苹果公司的开发的Xcode真的是十分强大,debug可以通过控制台,友盟,问题的异常抛出,等很多方法找出,发现bug那么开始我们的debug。
   
调试技巧一、po命令
    不要说你不会po命令,假如不会,那就太菜了。
    在卡住断点的时候可以利用po来输出你想看到的东西,大程哥要截图了

如上所述,po的含义为print object-c的意思,为显示对象的文本描述,显示对象的description
    图片中的<nil>就是变量rowindex的值。
 
    调试技巧二、help命令
     当你忘记某条gbd命令的语法时,可以使用help命令来获取帮助信息。如:help show 显示show命令语法。

    (gdb) help show
    Generic command for showing things about the debugger.
     
    List of show subcommands:
     
    show annotate -- Show annotation_level
    show architecture -- Show architecture of target
    show args -- Show argument list to give program being debugged when it is started
    show arm -- Various ARM-specific commands
    show auto-raise-load-levels -- Show if GDB should raise the symbol loading level on all frames found in backtraces
    show auto-solib-add -- Show autoloading of shared library symbols
    show backtrace -- Show backtrace specific variables
    show breakpoint -- Breakpoint specific settings
    show can-use-hw-watchpoints -- Show debugger's willingness to use watchpoint hardware


    show case-sensitive -- Show case sensitivity in name search

调试技巧三、print命令
    类似于格式化输出
    (gdb) print (int)[str retainCount]  

$1 = 2


    
    调试技巧四、断点设置异常抛出
     有时候我们的程序不知道跑到哪个地方就 crash 了,而 crash 又很难重现。保守的做法是在系统抛出异常之前设置断点,具体来说是在 objc_exception_throw处设置断点。设置步骤为:首先在 XCode 按 CMD + 6,进入断点管理窗口;然后点击右下方的 +,增加新的 Symbolic Breakpoint,在 Symbol 一栏输入:objc_exception_throw,然后点击 done,完成。 这样在 Debug 模式下,如果程序即将抛出异常,就能在抛出异常处中断了。比如在前面的代码中,我让 [firstObjctcrashTest]; 抛出异常。在 objc_exception_throw 处设置断点之后,程序就能在该代码处中断了,我们从而知道代码在什么地方出问题了。
     

调试技巧5、程序调试时忽然崩溃,而找不到崩溃的代码,如何解决?
 在Edit-->Scheme里面 找到Arguments把下面3个值设置成YES
NSAutoreleaseFreedObjectCheckEnabled 
NSZombleEnabled
NSDebugEnabled 
一个很不错的方法,建议在建立工程的时候,加入此设置  

出现 EXC_BAD_ACCESS  错误,给你的错误提示就这个,如何根本没法知道哪里错误了,其实还是有方法知道的,

做如下设置:
Project -> Edit active executable ->Argument 
添加如下四个参数
NSDebugEnabled
NSZombieEnabled
MallocStackLogging 
MallocStackLoggingNoCompact
并都设置为YES。具体如下图:


 
 

这个时候,如果有如下一段代码:
 //重复释放一个变量 
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
  NSData* data = [NSData dataWithBytes:"asklaskdxjgr" length:12];
  [data release];
  [pool release];
再Debug窗口会有如下的提示
 
 


 虽然也能大致判断是哪种类型的变量重复释放了,但信息还不够多,当项目大,源码比较多的时候,也不太方便定位,

在console窗口运行如下命令可以得到更多信息:shell malloc_history <pid> <address>"
 输入命令:shell malloc_history3939 0xa4e10
 就会出现更多的信息:
  [dave@host193 Frameworks]$ malloc_history 3939 0xa4e10
  Call [2] [arg=32]: thread_a0000dec |0x1000 | start | _start | main |
  +[NSData dataWithBytes:length:] | NSAllocateObject | object_getIndexedIvars |
  malloc_zone_calloc  
这个时候就知道具体哪个函数出先问题了,从这里可以看到main里NSData出现问题了。 
 
2. NSArray等集合类的实用问题。
      如下面的代码    
        ReleaseTest* rt = [[alloc] init];
NSMutableArray *array = [[NSMutableArray alloc] init] ;
[array addObject: rt];
ReleaseTest *rt2 = [array objectAtIndex:0];
      [rt2 release];   
[array release];
[rt release]; 
     就会导致重复释放内存问题,因为rt2,获取的是一个对象的指针,如果已经释放了的话,rt在释放的话,就重复了,为了遵循谁Init谁Release的原则,rt2就不应该Release。
 
3. init 和 Release 的问题。
    凡是对象通过Init的方法生成的对象,都需要自己负责Release。
    凡不是通过Init的方法生成的对象,不需要负责Release.如[NSString StringWithFormat]方法生成的对象就不需要自己Release,因此自己定义函数,返回一个类的时候,一定要设置为autoRelease 。这样调用的人就不用操心是否需要释放对象了。
 4. AutoReleasePool里最好不要将AutoRelease对象赋值给其它对象,否则离开这个作用域后,对象将会Release掉。

这是一篇简单的debug的文章,细心的同学可能发现,大橙哥的Xcode怎么是5.1.1的开发环境,系统貌似也是10.9.2 一下的,本人比较懒,公司的电脑是Xcode6.1的,家里的pro和air都没有升级,回来就是看看书学学习什么的,也就没有升级,但是开发的同学要注意了~!!!苹果今年8月分的审核会是大规模的,要求全部的软件必须兼容iOS8,否则就给你产品下架,那么说明了什么~你的操作系统必须是最新的,Xcode必须时6.1以上的,并且最近的Xcode废掉了一些老的sdk,还有很多新的东西,希望大家多多学习。
    下面一篇debug文章我加密了,同事大哥写的,感觉太好了~!!!(真心赞~

iOS调试技巧(debug)的更多相关文章

  1. iOS SDK:iOS调试技巧

    感谢原创 在程序中,无论是你想弄清楚为什么数组中有3个对象而不是5个,或者为什么一个新的玩家开始之后,游戏在倒退——调试在这些处理过程中是比较重要的一部分.通过本文的学习,我们将知道在程序中,可以使用 ...

  2. ios调试技巧

    一.概述1.掌握调试技巧,调试技术最基本,最重要的调试手段包括:单步跟踪,断点,变量观察等.单步跟踪(Step)所谓单步跟踪是指一行一行地执行程序,每执行一行语句后就停下来等待指示,这样你就能够仔细了 ...

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

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

  4. [ios-必看] IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS

    from:http://article.ityran.com/archives/1143 有这样一种情形:当我们正在快乐的致力于我们的app时,并且什么看都是无比顺利,但是突然,坑爹啊,它崩溃了.(悲 ...

  5. IOS调试技巧:当程序崩溃的时候怎么办 xcode调试

    转自:http://www.ityran.com/archives/1143 ------------------------------------------------ 欢迎回到当程序崩溃的时候 ...

  6. 转 iOS 调试技巧

    调度技巧一: 程序在崩溃的时候,xcode经常没有给出准确的堆栈信息,而是定位在了main方法里,这个让人很是头疼,又怀念起了vs, 其实xcode只要装简单设置一下,就能准确给出堆栈信息了,  打开 ...

  7. win10 pycharm调试技巧 Debug

    1.设置断点 2.调试方法对比 step into:单步执行,遇到子函数就进入并且继续单步执行(简而言之,进入子函数): step over:在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行 ...

  8. iOS开发之Xcode常用调试(Debug)技巧总结

    一.Xcode调试技巧之:NSLog 上面也提到了,在我们日常的开发过程中最常见的Debug方式就是打Log.而在OC语言中,打Log是采用NSLog方法.但是NSLog效率低下,具体原因可以看这篇博 ...

  9. iOS各种调试技巧豪华套餐

    转载自http://www.cnblogs.com/daiweilai/p/4421340.html 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Global Break ...

随机推荐

  1. JsonResponse对象浅析

    JsonResponse   JsonResponse 对象: class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_ ...

  2. 我的Android进阶之旅------>解决Error:Could not find property 'compile' on org.gradle.api.internal.artifacts.

    1错误描述 解决方法 1错误原因 2解决方法 1.错误描述 刚刚,Android Studio突然编译不了了,报了如下错误: Error:Could not find property 'compil ...

  3. 我的Android进阶之旅------>Android【设置】-【语言和输入法】-【语言】列表中找到相应语言所对应的列表项

    今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.所以首先我得把系统的语言切换到波兰语,问题是哪个是波兰语呢? 我还真的不认识哪个列表项代表着 ...

  4. 运行hadoop自带的wordcount例子程序

    1.准备文件 [root@master ~]# cat input.txt hello java hello python hello c hello java hello js hello html ...

  5. Android开发中string.xml文件的使用

    为什么需要把应用中出现的文字单独存放在string.xml文中呢? 一:是为了国际化,Android建议将在屏幕上显示的文字定义在strings.xml中,如果今后需要进行国际化,比如我们开发的应用本 ...

  6. XMPP环境搭建 (mac环境下 安装自己独立的mysql与服务器(openfire),实现即时聊天功能)

    1简单概览 [一]XMPP简介 http://xmpp.org 即时通讯技术 IM - Instant Messaging ⽀支持⽤用户在线实时交谈.交谈双⽅方都需要⼀一个聊天窗⼝口,其中⼀一个⽤用户 ...

  7. s5_day11作业

    # 1 文件内容如下,标题为:姓名,性别,年纪,薪资 # # egon male 18 3000 # alex male 38 30000 # wupeiqi female 28 20000 # yu ...

  8. ES集群重启

    操作步骤: 1. Disable shard allocation curl -XPUT 'localhost:9200/_cluster/settings?pretty' -d '{  " ...

  9. Unity,自带Random函数,上下限注意的地方

    Random.Range() 该函数有两个重载,分别是 float和 int 的,这两者还是有差别的,具体是: float型,随机值涵盖: 最小和最大值 Random.Range(0f,1f) 是有可 ...

  10. js小技巧(收集的)

    一.事件源对象 event.srcElement.tagName //IE浏览器 event.srcElement.type event.target.tagName //dom浏览器 event.t ...