【问题标题】:Best Practices for Error Logging and/or reporting for iPhoneiPhone 错误记录和/或报告的最佳实践
【发布时间】:2009-11-03 15:22:50
【问题描述】:

当我进行 Web 开发时,我使用定制的记录器来捕获致命错误并将跟踪附加到文件并向用户显示消息。我偶尔可以浏览一下文件是否更改,这意味着某些用户遇到了错误,我可以深入了解他们遇到了什么。

我想在 iphone 上有类似的东西,但有一些注意事项:

  • 在开发过程中,重置错误列表或关闭通知应该很简单。
  • 在开发过程中,错误消息也应该出现在一些明显的地方,比如控制台的屏幕上
  • 部署后,应礼貌地将错误发送到母舰进行分析(以便在下一次更新中修复错误)
  • 在开发过程中尝试跟踪问题时打开跟踪/信息日志记录
  • 关闭“发布”的控制台日志记录以加快用户处理速度
  • 应自行清理,以便在电话中成为一个好公民

一些相关链接

似乎有一个通用工具包可以执行此操作 - 您如何处理?

[2011 年 10 月更新] 已经有一些发展,成熟度各不相同......

  • PLCrashReporter
  • Quincy 位于 PLC 之上。
  • Bugsense商业崩溃记者。
  • Crittercism 崩溃和错误报告(一些免费包,一些付费)。
  • Test flight 现在有一个捕捉崩溃的 SDK(但还没有用于应用商店应用,只是开发应用)。
  • 与试飞一样,Hockey 旨在将临时分发与崩溃报告相结合。

【问题讨论】:

  • 我试图弄清楚为什么我接受的答案只获得了 50 代表奖金。似乎 Stackoverflow 自动接受了我的回答并给了我一半的赏金:meta.stackexchange.com/questions/26510/…
  • 无赖 - 作为作者,我会接受你的回答,但是当我回来检查时,Stackoverflow 已经代表我接受了答案,我认为这有点粗鲁.才几天。好的 - 我刚刚对你的答案投了赞成票!谢谢。
  • GSLog 依赖于看似私有框架的 GraphicsServices。

标签: iphone error-handling error-logging bug-reporting hockeyapp


【解决方案1】:

这是我们的工作:

  • 让 iPhone 通过existing App Store mechanisms 处理自己的故障转储。 更新:发现 iTunes Connect 在提供崩溃报告方面不可靠,我建议使用Fabric/Crashlytics,或者像CrittercismRollbar 这样的竞争对手。
  • 我们发布的产品没有任何痕迹,这似乎与大多数其他 iPhone 应用程序的做法一致。
  • 如果报告了错误,我们会使用跟踪的构建来重现它。

更详细:

  • 我们在许多不同的粒度级别定义宏到 NSLog 跟踪。
  • 使用 Xcode 构建设置更改跟踪级别,该级别控制将多少跟踪编译到产品中,例如有发布和调试构建配置。
  • 如果没有定义跟踪级别,我们会在模拟器中显示完整的跟踪,而在真实设备上运行时不会显示跟踪。

我在下面包含了示例代码,展示了我们是如何编写的,以及输出的样子。

我们定义了多个不同的跟踪级别,以便开发人员可以识别哪些跟踪行是重要的,并且可以根据需要过滤掉较低级别的细节。

示例代码:

- (void)myMethod:(NSObject *)xiObj
{
  TRC_ENTRY;
  TRC_DBG(@"Boring low level stuff");
  TRC_NRM(@"Higher level trace for more important info");
  TRC_ALT(@"Really important trace, something bad is happening");
  TRC_ERR(@"Error, this indicates a coding bug or unexpected condition");
  TRC_EXIT;
}

示例跟踪输出:

2009-09-11 14:22:48.051 MyApp[3122:207] ENTRY:+[MyClass myMethod:]
2009-09-11 14:22:48.063 MyApp[3122:207] DEBUG:+[MyClass myMethod:]:Boring low level stuff
2009-09-11 14:22:48.063 MyApp[3122:207] NORMAL:+[MyClass myMethod:]:Higher level trace for more important info
2009-09-11 14:22:48.063 MyApp[3122:207] ALERT:+[MyClass myMethod:]:Really important trace, something bad is happening
2009-09-11 14:22:48.063 MyApp[3122:207] ERROR:+[MyClass myMethod:]:Error, this indicates a coding bug or unexpected condition
2009-09-11 14:22:48.073 MyApp[3122:207] EXIT:+[MyClass myMethod:]

我们的跟踪定义:

#ifndef TRC_LEVEL
#if TARGET_IPHONE_SIMULATOR != 0
#define TRC_LEVEL 0
#else
#define TRC_LEVEL 5
#endif
#endif

/*****************************************************************************/
/* Entry/exit trace macros                                                   */
/*****************************************************************************/
#if TRC_LEVEL == 0
#define TRC_ENTRY    NSLog(@"ENTRY: %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#define TRC_EXIT     NSLog(@"EXIT:  %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#else
#define TRC_ENTRY
#define TRC_EXIT
#endif

/*****************************************************************************/
/* Debug trace macros                                                        */
/*****************************************************************************/
#if (TRC_LEVEL <= 1)
#define TRC_DBG(A, ...) NSLog(@"DEBUG: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_DBG(A, ...)
#endif

#if (TRC_LEVEL <= 2)
#define TRC_NRM(A, ...) NSLog(@"NORMAL:%s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_NRM(A, ...)
#endif

#if (TRC_LEVEL <= 3)
#define TRC_ALT(A, ...) NSLog(@"ALERT: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ALT(A, ...)
#endif

#if (TRC_LEVEL <= 4)
#define TRC_ERR(A, ...) NSLog(@"ERROR: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ERR(A, ...)
#endif

Xcode 设置:

在 Xcode 构建设置中,选择“添加用户定义的设置”(通过单击构建配置屏幕左下角的小齿轮),然后定义一个名为 GCC_PREPROCESSOR_DEFINITIONS 的新设置并将其值指定为 @987654329 @。

唯一的微妙之处是,如果您更改此设置,Xcode 不知道执行干净构建,因此请记住,如果您更改它,请手动执行清理。

【讨论】:

  • 为什么不通过创建新的构建配置来控制跟踪级别?
  • 是的,我已经在我的回答中提出了这一点(第二组要点,第二个要点)。 “调试”构建配置设置 TRC_LEVEL=0 和“发布”构建设置 TRC_LEVEL=5。
  • 这在谷歌搜索结果中仍然很高。你能用 crashlytics 之类的工具和 SwiftyBeaver 之类的快速框架进行更新吗? (我提到这两个是因为我个人使用它们,但无论哪个)
【解决方案2】:

Apple 会自动为您收集用户的崩溃日志,您可以从 iTunes Connect 下载它们。

如果这对您来说还不够,我不知道工具包,但我个人不想自己推出一些东西。开发健壮的东西似乎付出了太多努力,可能会引发隐私问题,最终,应用商店中有 100,000K 的应用,有多少用户会在发现它有漏洞后再次使用您的应用?

【讨论】:

  • 真的吗?我是否需要开始密切关注那些“此版本中的新增功能”文件?
  • 处理一些基本的堆栈和报告。
  • :) 我认为他们今年早些时候开始这样做了。找到它有点痛苦 - 在“管理您的应用程序”中单击“应用程序详细信息”,然后......哦等等,我的应用程序的最新版本今天刚刚发布,所以我无法查看任何崩溃日志。所以这是负面的 - Apple 似乎只提供当前版本的应用程序的日志。
  • 好的,我看到了,甚至隐约记得以前也看到过。但是,是这样吗?所以,假设我有一个 if-then-else-logicerror,当然最好通知用户发生了不好的事情并将一些额外的信息记录到日志中,而不是简单地“崩溃”?您能否以某种方式强制崩溃,但以某种方式向核心转储中添加一些有助于调试的额外信息?也许答案是——“这里的最先进技术还很不成熟,除了 Apple 的内置崩溃上传”我真的希望有更多的东西......聪明。
  • 作为开发人员和 Iphone 用户,我很高兴应用程序崩溃,因为我很少关心它为什么崩溃。如果它是一个实用程序,那么只要它不丢失我的数据,我也不在乎。我想我必须同意 bpapa。
【解决方案3】:

你知道CrashReporter for iPhone存在吗?

在 github 上有一个 repository 用于演示该代码。

它有一些很酷的功能,例如将堆栈跟踪映射到您的代码,并管理一些特定于 git 的东西,例如版本哈希。

【讨论】:

  • 酷 - 这看起来很有用。
【解决方案4】:

我强烈推荐 Robbie Hanson 的 CocoaLumberJack:https://github.com/robbiehanson/CocoaLumberjack

它非常灵活和强大,如果被滥用甚至可能有点过分。支持不同级别的日志记录。只需几行代码就可以打开文件日志记录,甚至可以通过网络发送。

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 2020-11-02
    • 1970-01-01
    • 2018-03-27
    • 2012-05-22
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多