iPhone - 当你找不到崩溃点时如何调试崩溃问题

7
我的应用程序Crash Pad Drums出现了崩溃报告。在iPod 4上,某些铙钹声会导致应用程序崩溃。问题是,我找不到iPod touch 2上的崩溃情况,而且我也没有iTouch 4。
我该怎么办?
另外,我的应用程序今天免费。如果有人能下载并找到崩溃的原因,我将感激不尽。
编辑:
澄清一下,我无法在新设备上测试并引发崩溃。我怀疑这是iOS 5的问题,现在正在调查。但是,如果我很抠门不想购买新的iTouch,以后该怎么办呢?
Console log:
2011-10-14 23:08:25.797 Crash Pad[794:12203] -[NSConcreteValue doubleValue]: unrecognized selector sent to instance 0xec9e2e0
2011-10-14 23:08:25.798 Crash Pad[794:12203] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteValue doubleValue]: unrecognized selector sent to instance 0xec9e2e0'
*** First throw call stack:
(0x1c49052 0x21fdd0a 0x1c4aced 0x1baff00 0x1bafce2 0x16f4f0 0x15d99e 0x14e0d8 0x168d42 0x15ace2 0x5c28c7 0x5c2a31 0x5c2d45 0x1be0f4a 0x1bac665 0x1bac056 0x5c2c43 0x249c8 0x24a58 0x8a72 0x1c4aec9 0x67a299 0x67a306 0x1c4aec9 0x67a299 0x67a306 0x5b6a30 0x5b6c56 0x59d384 0x590aa9 0x28c3fa9 0x1c1d1c5 0x1b82022 0x1b8090a 0x1b7fdb4 0x1b7fccb 0x28c2879 0x28c293e 0x58ea9b 0x1f0d 0x1e85)
terminate called throwing an exceptionCurrent language:  auto; currently objective-c

4
也许改个应用名称?抱歉,我忍不住了... - Jean-Denis Muys
1
笑。你说得有道理,这是一个潜在的危险名称。在垫子上发现了与撞击鼓碰撞的崩溃... 笑。 - Daniel G. Wilson
还有,这个问题有什么不好的地方吗?-1? - Daniel G. Wilson
4个回答

14
你发现的是一个苹果系统的错误。你可以通过对任何视图进行动画处理来轻松重现这个问题,例如:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
anim.duration = 0.2;
anim.repeatDuration = HUGE_VALF;
anim.autoreverses = YES;
anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 0.0)];
[view.layer addAnimation:anim forKey:@"throb"]; // if this isn't nil we crash on tap

运行项目。点击跳动的视图。崩溃了。这段代码在iOS 3和iOS 4上完全正常。目前的解决方法是将forKey:设置为nil,但这可能是不可接受的,因为这个参数可能很重要 - 非nil键意味着如果您稍后添加具有相同键的另一个动画,则会删除此动画,这可能正是您想做的事情。
我已向苹果提交了错误报告,并建议您也这样做。
编辑(2/3/12):好的,苹果说这是我的错误,而不是他们的错误。由于我提供了一个变换,所以需要使用@"transform"而不是@"transform.scale"作为键。此外,我的三维缩放变换的z值应该是1,而不是0。

@bbum - 那将是10642040。感谢您的关注! - matt
这正是我遇到的问题,自动反转CATransform和一切。很高兴不仅是我一个人出现了这个问题,但我希望在将整个东西更改为动画块之前尝试将forKey设置为nil。 - Daniel G. Wilson
给你打钩,因为你的答案实际上展示了崩溃背后的原因。 - Daniel G. Wilson
1
很酷,谢谢。我碰巧遇到了同样的错误,并且能够简洁地表达它(碰巧我尝试了我能想到的所有东西,发现了一种变通方法,也是碰巧)。我通过搜索错误消息“-[NSConcreteValue doubleValue]:unrecognized selector sent to instance…”找到了你的帖子,这正好说明了,总是要查看崩溃日志! - matt
@matt -- 啊,明白了。我一直在纠结将转换包装成NSValue和动画属性(类型“id”)接受对象赋值。回顾CAPG,我发现“scale”是“scale.x”,“scale.y”和“scale.z”的平均值,因此是一个标量,而不是一个结构。 - jstevenco
显示剩余2条评论

8

在调试器中设置NSZombieEnabledMallocStackLoggingguard malloc。然后,当您的应用程序崩溃时,在gdb控制台中输入以下内容:

(gdb) info malloc-history 0x543216

将0x543216替换为导致崩溃的对象的地址,您将获得更有用的堆栈跟踪,并且这应该帮助您精确定位导致问题的代码行。


4

你能发布一两个崩溃日志吗?这将非常有帮助。

考虑到它在较新的硬件上而不是旧的硬件上崩溃,很可能不是与内存相关的问题。最可能是与线程相关的时间问题;更快的设备会更早地完成某些操作并在其他操作完成之前触碰到数据结构。由于在不同设备上声音播放的持续时间相同,这进一步支持了这个理论。


添加了崩溃时的gdb输出 - Daniel G. Wilson
@bbum - 这是iOS 5引入的一个苹果bug。我已经提交了一个错误报告。请查看我的回答以回应OP的问题。 - matt

0

最终问题出在iOS 5上。 我通过注释掉各种代码段来缩小崩溃的原因。当有疑问时,请注释掉。


2
你能详细说明一下你的答案吗?你是如何修改你的代码的?我在iOS 5上遇到了同样的问题。 - matt
我认为原因相当随意 - 在iOS 5中,一些东西似乎存在冲突 - 但我所做的是将一些CAKeyframeAnimation内容更改为动画块。 - Daniel G. Wilson
1
是的,我的崩溃也涉及CAAnimation。但在之前的系统中没有崩溃。我确实发现可以通过使用动画块来解决它,但我不想那样做。奇怪的是,解决方案是在addAnimation:forKey:中使用空键。- 感谢您确认这一点。 - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接