30

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

我想在 iphone 上有类似的东西,但有一些警告:

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

一些相关链接

似乎有一个通用的工具包可以做到这一点 - 你如何处理这个?

[2011 年 10 月更新] 有一些发展,成熟度不一...

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

4 回答 4

38

这是我们所做的:

  • 让 iPhone 通过现有的 App Store 机制处理自己的故障转储。 更新:发现 iTunes Connect 在提供崩溃报告方面不可靠,我建议使用Fabric/CrashlyticsCrittercismRollbar等竞争对手。
  • 我们发布的产品没有任何痕迹,这似乎与大多数其他 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并为其赋值TRC_LEVEL=0

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

于 2009-11-10T21:18:29.253 回答
4

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

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

于 2009-11-03T15:40:04.307 回答
4

你知道iPhone 的 CrashReporter存在吗?

github 上有一个存储库,用于演示该代码。

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

于 2009-11-11T23:48:33.517 回答
2

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

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

于 2013-04-23T16:16:23.080 回答