15

我们正在使用 TestFlight 来发送我们应用程序的飞行员。

应用程序的一部分崩溃了,我们在重现崩溃时遇到了很多麻烦。他们的代码相当简单。

事实证明,通过 TestFlight 获得应用程序的用户会崩溃,而如果您构建应用程序并使用 IDE 安装它,它不会崩溃!

有人对可能导致这种情况的原因有任何想法吗?

任何解决方法的想法?我们不想停止使用 TestFlight。

4

3 回答 3

12

确保在发布模式而不是调试中构建您的应用程序。该应用程序可能仅在发布时崩溃。

于 2012-08-30T08:45:26.810 回答
5

我要尝试的第一件事是将崩溃堆栈跟踪映射到应用程序中的函数名称。这可能会对崩溃的性质产生有用的洞察:

  1. 一旦报告崩溃请求崩溃日志。这可以通过 Xcode 的管理器获得,或者如果这不是一个选项,则可以从 iPhone 的设置 -> 常规 -> 关于 -> 诊断和使用 -> 诊断和使用数据中截屏。滚动到应用名称或LatestCrash-AppName.plist 部分。
  2. 虽然理论上你可以象征崩溃,但我发现下面描述的过程是从堆栈中获取符号的万无一失的方法。将崩溃线程的所有堆栈地址转换为方法名称。
  3. (可选)请求 iDevice 系统日志。这可能包括同样非常宝贵的断言失败消息。请注意,这应该尽快完成,因为系统日志在它们被删除之前只保存了这么多条目。您可以使用 Organizer 或 cmd 行 idevicesyslog 来获取它。

手动符号化:只要您的构建有调试信息,这将起作用。

  1. 获取崩溃的_exact_same_ .ipa。如果您没有保存它,您可以使用 iFunBox 或 cmd 行 ideviceinstaller 实用程序从设备下载它。
  2. 解压 .ipa
  3. 对可执行文件 (Payload/AppName.app/AppName) 运行以下命令:

    otool -tv AppName.app | c++filt>listing.asm

  4. 等待上一步完成(可能需要一段时间)。生成的listing.asm 文件将有几兆字节长。

  5. 使用可以处理大文件的编辑器搜索listing.asm 以查找堆栈跟踪中列出的地址。请注意,地址可能相差几个字节(通常指向前面 3 个左右的字节)。此外,listing.asm 中未找到的地址表示 iOS 库中的地址。暂时忽略那些。

当然,如果你能够符号化,你可以跳过这个过程。

祝调试顺利!

于 2012-08-30T05:48:28.387 回答
0

我们遇到了类似的问题。我们的问题是静态库。当我们从头开始构建应用程序并进入 testflight 时,它正在崩溃,但从 IDE 中却没有。崩溃是因为在构建时没有包含静态库,但是如果我直接连接 iPad 并使用 XCode 安装,就会被包含在内。

一个简单的测试将证明这一点:-

1.) 不要从 IDE 构建,而是创建一个 .app 文件,然后通过 iTunes 加载它并检查您是否遇到崩溃。

我们通过手动创建 .iPA 来解决这个问题,即创建 .app 然后创建一个 Payload 文件夹并将 .app 与 info.plist 一起放入其中。

然后事情也开始在 Testflight 中发挥作用。

于 2012-08-30T08:35:41.493 回答