【问题标题】:Fixing unpredictable crashes修复不可预知的崩溃
【发布时间】:2016-02-20 17:00:49
【问题描述】:

我知道这个问题会很模糊,对不起。

我们在 Android 和 iOS 上开发了一个原生 C++ 应用程序,这两个平台共享大部分代码(只有很少,特定于平台的东西)。我们的 QA 报告了相当多的 Android 上相对随机的崩溃,这些崩溃要么完全隐藏在 libc++、libc 或我们正在使用的一些第三方代码中。
它在 iOS 上运行良好。

实际上,如何处理这种情况并修复这些崩溃?不幸的是,Android 在原生开发方面非常糟糕,在三星设备上附加调试器是绝对不可能的,而且获得有意义的堆栈跟踪也是不可能的。

【问题讨论】:

  • 有很多关于如何使用'gdb'在设备上调试android应用程序的教程,例如:mhandroid.wordpress.com/2011/01/25/…。这有什么不好?
  • @Ctx 三星设备自 Android 2.3 以来存在一个错误,该错误至今仍未修复,不允许 gdb 调试。大多数(如果不是全部)崩溃都发生在三星设备上。
  • 我对 Android 开发不是很熟悉,但是如何获取核心转储或使用类似 Google Breakpad 的东西从设备中提取一些数据?
  • 真的很奇怪的显式日志文件,但如果应用程序在客户端手中,这将是有问题的。我认为核心逻辑在模拟中被滥用时可以正常工作?
  • 您可能想尝试使用 valgrind 和/或 llvm 的 address-santizer。让事情运行起来可能需要一些工作,但这当然是可能的(我都使用过)。您可能需要 root 设备,但这通常并不难。

标签: java android c++ java-native-interface cocos2d-x


【解决方案1】:

创建您自己的日志系统。每条记录都应该有日期和时间戳以及一些描述。

在我的嵌入式系统上,我们保存:文件名、函数名、行号、事件 ID 和每个系统故障的描述。在下一代,我们会将这些条目备份到 SDCard。

这是允许我们在设备崩溃时执行“取证”的众多日志之一。测试团队或取证团队提取日志并将其附加到缺陷报告中。

编辑 1:表征行为
日志记录的另一个方面是在代码中的不同位置放置日志记录函数调用。这将向您显示崩溃前最后知道的位置,并为您提供设备行为的特征。

【讨论】:

    猜你喜欢
    • 2015-05-21
    • 1970-01-01
    • 2017-03-08
    • 2015-09-15
    • 2019-10-07
    • 2018-01-18
    • 2022-01-10
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多