【发布时间】:2017-02-20 16:54:00
【问题描述】:
多年来,我一直在用 Objective-C/iOS 编写典型的随机代码。
今天,与我打交道的一位客户提出了这个看似无辜的 Crashlytics 崩溃:
Fatal Exception: NSInvalidArgumentException
0 CoreFoundation 0x193b0e1c0 \__exceptionPreprocess
1 libobjc.A.dylib 0x19254855c objc_exception_throw
2 CoreFoundation 0x193b15278 \__methodDescriptionForSelector
3 CoreFoundation 0x193b12278 \___forwarding___
4 CoreFoundation 0x193a0c59c _CF_forwarding_prep_0
5 MyProjectTargetName 0x100087518 -[BannerContainer pressed:] (BannerContainer.m:105)
6 UIKit 0x199f3059c -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:]
7 UIKit 0x199f33ca4 _UIGestureRecognizerSendTargetActions
8 UIKit 0x199af52e8 _UIGestureRecognizerSendActions
9 UIKit 0x199993828 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:]
10 UIKit 0x199f23ce8 _UIGestureEnvironmentUpdate
...
问题是,在第 105 行,在 BannerContainer.m “Bannercontainerpressed:”IBAction 内部,有一个显然很简单的分配:
if(self.banners==nil || [self.banners count]==0)
{
return;
}
NSInteger position=self.currentPosition; // both NSIntegers
if(IS_IPAD) // Macro working perfectly as of today
{
position=((UIButton *)sender).tag; // this is offending line 105
}
根据 Crahslytics 的说法,NSInvalidArgumentException 在第 105 行崩溃......但我无法在那里识别任何“无效参数”。相反,我会说它只是一个按钮,它的 (NSInteger) 标签属性被分配给一个 NSInteger 变量(发送者总是一个按钮,因为这个函数链接到 .xib 文件中的 5 个 UIButtons)。这 5 个按钮有 5 个不同的标签(0、1、2、3 和 4)。如果 sender 为 nil,则该行甚至不会崩溃(我在 5 分钟前手动将 sender 设置为 nil 以检查此声明)。
无论如何,问题是我从来没有让我的应用程序在这条线上崩溃,显然 crashlytics 说一些现场人员已经能够做到。
我有点不知所措。有什么提示吗?有人可以指导我完成任何橡皮鸭调试吗?为什么 Crashlytics 能够找到我在开发环境中找不到的崩溃条件?
您好。
编辑:我无权访问该 Crashlytics 帐户。我发布的这个崩溃只是我的客户通过电子邮件发送给我们的 .txt 转储。我的客户 iTunes Connect 帐户既没有也没有访问此应用程序生产环境服务器的权限。我只是将我的代码交付给我的客户,然后他使用他的帐户编译、签名和上传所有内容。
【问题讨论】:
-
@Issac 你确定总是发件人是 UIButton 吗?
-
此 IBAction 仅链接到 xib 内的 5 个 UIButton。我看不出发件人如何/为什么不应该是 UIButton。我的问题是我不能让这条线崩溃(!!)我想(显然 Crashlytics 说有时可以)
-
你能检查发件人是否是 UIButton 然后进行分配吗?这必须修复你的崩溃,如果不是 UIButton 则发送 crashlytics 错误,以检查发生了什么
-
我没有崩溃,这是我的问题。我真的很想在我的开发机器上安装一个,但崩溃只出现在产品的生产版本中,在现场,在我客户的 Crashlytics 帐户中(我无法访问的帐户,他只给我这个我在上面发布的 .txt 转储)。
-
是的,我知道我可以在 UIButton.tag 分配之前放置一个“如果”,但我不能说我的客户:“我认为我已经修复了一些东西”,而没有检查是否真的我实际上已经修复了它,因为对我来说它并没有崩溃。 “我需要让它崩溃”。作为测试,我在标签分配上方输入了“sender = [[UIColor alloc] init];”,然后它崩溃了,但是使用“无法识别的选择器”,而不是 Crashlytics “NSInvalidArgumentException”...跨度>
标签: ios objective-c debugging crashlytics