`
xumingrencai
  • 浏览: 1179637 次
文章分类
社区版块
存档分类
最新评论

XCode Debug 模式断言擒 bug 记

 
阅读更多

认识到debug模式和断言带来的方便,我迫不及待地便将项目的schema重新设置回了debug模式

以前不懂,认为程序在发布的时候用的是release模式,为了降低发布时出现bug的几率,

便很早前就将程序设置为debug模式。

现在看来真是愚蠢之极。

不知道有多少次,我在调试bug的时候,判断空指针用了如下的代码

if(var == nil) {

NSLog(@"var==nil,fuck!");

}

浪费了多少书写时间,bug调试完毕我又得注释或者删除之。

这都是我流过的汗水,花过我的时间,证明过我曾为程序的健壮性而努力过。

删除过后,别人对我的辛劳付出一无所知。

这自然是由我不知道使用“好用的工具”所致,是一种愚蠢的行为,但这毕竟。。。

是有菜鸟进步为老鸟所必须经历的路程,不能一棒子将我打死吧?

拉回!

用了debug模式,我知道下面的方法来暴力调试更加有效率

NSAsser(var!=nil, NSLog(@"var==nil,fuck!"));

代码量不见得少了多少,或许还多了,但使用完毕之后不用再回头来擦屁股,

而且燕过有痕。。。这便是效率的提升。

而且让别人知晓,我不仅仅只是做出了功能,而且,我的功能还很健壮~


拉回,again!

ok,已经认识到debug模式和NSAssert带来的好处。

话说我已将release模式改为debug模式,原本能够正常运行的程序便卡住。

看控制台输出:

2012-03-14 14:14:11.600 GameSceneEx[26517:707] *** Assertion failure in -[CCLayer addChild:z:tag:], /Users/user/Documents/GameScene/libs/cocos2d/CCNode.m:383

2012-03-14 14:14:11.605 GameSceneEx[26517:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'child already added. It can't be added again'

意思很明了,有一个断言失败了。

find selected text in workspace,发现断言的相关代码为CCNode 的

-(void) addChild: (CCNode*) child z:(NSInteger)z tag:(NSInteger) aTag

{

NSAssert( child !=nil,@"Argument must be non-nil");

NSAssert( child.parent ==nil,@"child already added. It can't be added again");

if( !children_)

[selfchildrenAlloc];

[selfinsertChild:childz:z];

child.tag= aTag;

[childsetParent:self];

if(isRunning_) {

[childonEnter];

[childonEnterTransitionDidFinish];

}

}

也就是说,有一个节点在被添加的时候,他的parent成员变量已经不为 nil 了(说明他已经被添加过一次了)~

开始我没有暴力调,在上述方法里面下了个断点。

我的想法是在爆出错误的时候,在 By Thread 里面走回错误报出的上一级方法。

我如愿以偿,找到了错误抛出的上一级方法。

但是,很不幸的是xcode所提示的代码行数总会有一些出入,我被暗算好几次了~

这次我有了经验,没有在让我想不通的地方多做停留

(实际上有时候xcode所定位到出的bug抛出行数非常的不准确,稍作检查发现并无问题之后千万不要再多浪费时间)

很果断的便在bug可能出现的方法里面加了10数句 NSLog,直接便进入 暴力调试的环节了


暴力调虽然有点机械,显得蠢,但目前对我来说还是相当有效的。。

2012-03-14 14:14:11.322 GameSceneEx[26517:707] cocos2d: surface size: 960x640

2012-03-14 14:14:11.362 GameSceneEx[26517:707] 11

2012-03-14 14:14:11.366 GameSceneEx[26517:707] 22

2012-03-14 14:14:11.369 GameSceneEx[26517:707] 33

2012-03-14 14:14:11.378 GameSceneEx[26517:707] 44

2012-03-14 14:14:11.399 GameSceneEx[26517:707] 55

2012-03-14 14:14:11.414 GameSceneEx[26517:707] 66

2012-03-14 14:14:11.453 GameSceneEx[26517:707] 77

2012-03-14 14:14:11.456 GameSceneEx[26517:707] 88

2012-03-14 14:14:11.473 GameSceneEx[26517:707] 99

2012-03-14 14:14:11.476 GameSceneEx[26517:707] 10

2012-03-14 14:14:11.573 GameSceneEx[26517:707] 11

2012-03-14 14:14:11.595 GameSceneEx[26517:707] 12

2012-03-14 14:14:11.600 GameSceneEx[26517:707] *** Assertion failure in -[CCLayer addChild:z:tag:], /Users/user/Documents/GameScene/libs/cocos2d/CCNode.m:383

2012-03-14 14:14:11.605 GameSceneEx[26517:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'child already added. It can't be added again'

果不其然,很快我便定位到 bug 抛出的准确位置了,以下贴出 bug出现的那个方法:


ok,收工!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics