调试技巧1、po命令
不要说你不会po命令,假如不会,那就太菜了。
在卡住断点的时候能够利用po来输出你想看到的东西,大程哥要截图了


如上所述,po的含义为print object-c的意思,为显示对象的文本描述,显示对象的description
图片中的<nil>就是变量rowindex的值。
调试技巧2、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
调试技巧3、print命令
相似于格式化输出
(gdb) print (int)[str retainCount]
$1 = 2 程序员
调试技巧4、断点设置异常抛出
有时候咱们的程序不知道跑到哪一个地方就 crash 了,而 crash 又很难重现。保守的作法是在系统抛出异常以前设置断点,具体来讲是在 objc_exception_throw处设置断点。设置步骤为:首先在 XCode 按 CMD + 6,进入断点管理窗口;而后点击右下方的 +,增长新的 Symbolic Breakpoint,在 Symbol 一栏输入:objc_exception_throw,而后点击 done,完成。 这样在 Debug 模式下,若是程序即将抛出异常,就能在抛出异常处中断了。好比在前面的代码中,我让 [firstObjctcrashTest]; 抛出异常。在 objc_exception_throw 处设置断点以后,程序就能在该代码处中断了,咱们从而知道代码在什么地方出问题了。


调试技巧五、程序调试时突然崩溃,而找不到崩溃的代码,如何解决?
在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文章我加密了,同事大哥写的,感受太好了~!!!(真心赞~👍)想看的在qq上向我要密码吧~