如何调试从后台返回时发生的崩溃问题

6

从应用程序图标返回后发生了崩溃。

但是,我在控制台日志中看不到任何详细信息。有一个终止信号,但我们找不到信号编号。

<FBApplicationProcess: 0x117bcb930; Maixxxx; pid: 1762> exited abnormally via signal.

Process exited: <FBApplicationProcess: 0x117bcb930; Maixxx; pid: -1> -> <FBApplicationProcessExitContext: 0x17103f820; exitReason: signal; terminationReason: (none)>

控制台日志

我遇到的崩溃现象可以按照以下步骤重现:

  1. 通过点击应用图标启动应用程序。
  2. 像普通用户一样使用该应用程序。
  3. 按 Home 键将其放入后台。
  4. 等待几分钟。
  5. 在主屏幕上点击应用程序图标以再次使用它。
  6. 应用程序崩溃并退出。

由于崩溃仅在从后台返回时发生,并且需要进入后台一段时间,因此无法在带有lldb附加的调试模式下运行。

我没有使用任何后台功能。

另外,在 Fabric 的 Crashlytics 中也没有看到任何崩溃报告。所以我认为信号处理程序也不能被调用了吧?

如何调查这种问题呢?


澄清一下:你有在设备上自己检查崩溃报告吗?(Xcode - 窗口 - 设备和模拟器 - 查看设备日志)也许它被列为“未知”(这就解释了为什么Crashlytics找不到它),那么我猜你可能得自己进行符号化,但这总比什么都没有要好。 - Gero
@Gero 是的,我再次检查了设备,没有相关的崩溃日志。 - xi.lin
5个回答

3
这些事情可能很棘手,我从类似的经历中就知道了这一点。在不了解您的应用程序更多信息的情况下,我只能提供提示而没有确定性答案,但也许这可以帮助您。
尽管备选方案和使用 print 等直接记录日志的繁琐方法存在,但还有两种方法可以尝试“捕捉”进程。
然而,首先让我强调一点,“后台”并不总是相同的,人们经常随意使用术语,这取决于导致崩溃的状态转换,您可能运气不佳,只能通过手动记录来进行实验。应用程序可以处于后台状态,即未在前台运行,但仍在运行。这通常是调试器附加时的情况,否则它无法发挥作用。或者它们可能会被操作系统暂停(甚至终止)。调试器可以防止这种情况发生,您可能已经想到这一点了。
可能有帮助的两件事是:
1. 如果您正在使用后台获取功能,即如您所描述的“从后台模式返回”,则可以在构建方案的“运行”配置部分激活“由于后台获取事件而启动”选项。 2. 从主屏幕运行您的应用程序,使用主页按钮将其置于后台并等待一段时间(您可能已经在过去这样做,以了解崩溃发生的时间)。您的应用程序最终应该进入暂停状态(但我不知道是否有任何实际可见的方式来查看它)。而不是通过多任务 UI 将其恢复到前台,请通过“调试 - 附加到进程”菜单再次附加调试器。这应该将您的应用程序从暂停状态恢复到后台状态,在那里崩溃可能会真正发生(如果它在从后台到前台的过程中崩溃,您可能已经像平常一样进行了调试)。希望调试器已经及时附加到它,否则我就没办法了。
我个人没有遇到过这个具体问题,但我知道后台操作可能很棘手。也许这个讨论也可以帮助您(我也从那里获得了部分信息)。

感谢您的详细建议。"由于后台获取事件而启动"不是我的情况。我现在将尝试使用附加方法。 - xi.lin
通过附加调试器,我在Xcode的控制台里得到了这个信息:“来自调试器的消息:由于信号13而终止”。 我认为这不是崩溃信息,而是一个信号调用调试器退出,因为目标已经崩溃,所以调试器的通道被中断了。 - xi.lin
1
是的,那可能就是发生的事情。我很担心你会遇到这种情况。:( 看起来崩溃发生在从挂起状态恢复的过程中的某个地方,这非常奇怪。我不知道你能用什么方法来进入那个过程(我假设你已经在applicationWillEnterForeground方法(和相关方法)中设置了断点)。我的唯一建议就是使用日志记录,并重新评估你在applicationDidEnterBackground等方法中所做的操作。也许你在其中留下了一些奇怪的状态?尝试逐步减少逻辑以缩小范围。 - Gero
谢谢。我最近没有在applicationDidEnterBackground中引入新的逻辑。我会再次尝试使用git bisect来查找引入此问题的提交。但这确实是一项耗时的任务。 - xi.lin
1
我了解并感同身受。我曾经遇到过类似的情况(如果有人建议你在网络环境不良的越狱iPhone上构建基于WiFi的位置服务,而且这个网络会默默地吞噬数据包,请立即撤退...)。祝你好运! - Gero

0

在真实设备上以调试模式运行应用程序。按Home按钮将应用程序发送到后台并继续调试。然后,您可以将应用程序带到前台并继续调试,或者在applicationWillEnterForeground处设置断点。


我没有描述清楚,如果lldb被附加,我的应用程序就不会崩溃。 - xi.lin

0

你无法在真实设备上调试此问题。当调试器连接时,您的应用程序将永远不会进入真实设备的后台模式。

您可以尝试在模拟器上调试此问题。 无论如何,请检查您的类属性并将属性设置为强引用,以确保不会因为缺少属性而发生此问题。

我已经阅读了几个 StackOverflow 的问题,其中涉及到 FBApplicationProcess。通常情况下,这是由于在应用程序启动时缺少数组或其他内容导致的。

最好的问候。


谢谢您的建议。但是我从未在模拟器中复现过这种崩溃。 - xi.lin

0

我已经浏览了以上所有答案,都给出了正确的答案。虽然,我想分享一下我的观点。

  1. 如果应用程序在任何带有调试模式和线插件的iOS真实设备上运行,甚至在模拟器上运行,应用程序将永远不会进入后台。

  2. 如果应用程序没有线插件运行或者没有在Xcode中运行(直接在iPhone中启动应用程序),然后将应用程序放到后台,应用程序将在下一个3分钟内在后台运行。3分钟后,应用程序将自动暂停并从主线程中删除。现在,当我们再次打开应用程序时,它将被视为全新启动。

  3. 如果您的应用程序具有任何后台功能,则即使在后台也可以保持活动状态,但是在此期间无法进行任何UI更改。

  4. 为了使应用程序在后台保持活动状态,必须正确处理后台功能。即,如果在应用程序中使用位置与“应用程序在前台时”条件,应用程序在后台不会运行超过3分钟。因此,如果您想在后台连续运行应用程序,必须在Info.plist文件中表示适当的原因,并包含电池耗尽字样,否则,苹果将拒绝它。

  5. 如需了解更多问题的详细信息,请与我联系。

谢谢。


谢谢您的回复。我没有开启“后台功能”,所以我认为这与此无关。 - xi.lin

0

您的测试设备上仍然有崩溃日志。

获取崩溃日志,请按照以下步骤操作:

  • 通过USB将您的测试设备连接到Mac上。
  • 启动Xcode。 转到“Windows”>“设备和模拟器”。
  • 从屏幕左侧的设备部分选择您的设备。
  • 选择“查看设备日志”按钮。
  • 识别和选择崩溃日志以查看其内容。

嗨,我已经仔细检查了设备日志列表,没有我的应用程序或未知日志。 - xi.lin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接