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

Posted

技术标签:

【中文标题】如何调试从后台返回时发生的崩溃【英文标题】:How to debug a crash which happened when come back from background 【发布时间】:2019-11-14 16:55:46 【问题描述】:

通过应用图标从后台返回时发生崩溃。

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

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

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

重现我的崩溃的过程如下:

    通过点击应用图标启动应用。 以普通用户身份使用该应用。 按主页将其置于后台。 等待几分钟。 单击跳板屏幕上的应用程序图标以再次使用它。 应用崩溃&退出。

由于崩溃仅在从后台返回时发生,并且需要进入后台几分钟,所以我无法在附加 lldb 的调试模式下运行。

我没有使用任何背景功能。

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

如何调查此类问题?

【问题讨论】:

澄清一下:您自己在设备上检查过崩溃报告吗? (Xcode - 窗口 - 设备和模拟器 - 查看设备日志)也许它被列为“未知”(这可以解释为什么 Crashlytics 没有找到它),那么我猜你可能必须自己符号化它,但这总比没有好. @Gero 是的,我再次检查了设备,没有相关的崩溃日志。 【参考方案1】:

这些事情可能很艰难,我从类似的经历中知道这一点。在不了解您的应用的情况下,我只能提供提示而没有明确的答案,但也许这会对您有所帮助。

使用print 等的直接日志记录的回退和乏味的方法,尽管有两种方法可以尝试“捕获”进程。

但是,首先让我强调一下,“背景”并不总是相同的,不幸的是人们经常松散地使用这个词。根据导致崩溃的状态转换,您可能会运气不佳,只能尝试使用手动日志记录。应用程序可以在后台,即不在前台,但仍在运行。附加调试器时通常会出现这种情况,否则它无法完成工作。或者,它们可以被操作系统暂停(甚至终止)。调试器可以防止这种情况发生,您可能已经发现了这一点。

可能对您有帮助的两件事是:

    如果您使用后台获取,即您所描述的“从后台模式返回”自动发生,您可以在构建方案的“运行”配置中激活“由于后台获取事件而启动”选项部分。

    从主屏幕运行您的应用程序,使用 Home 按钮将其置于后台并稍等片刻(您过去可能已经这样做了,以了解崩溃何时发生)。您的应用程序最终应该进入挂起状态(但您无法在任何地方实际看到 AFAIK)。无需通过多任务 UI 再次将其置于前台,只需通过“调试 - 附加到进程”菜单再次附加调试器即可。这应该让您的应用从挂起状态回到后台状态,崩溃可能真的发生(如果它发生在从后台到前台时,您可能已经能够将其调试为通常)。希望调试器及时完成附加,否则我没有想法。 :(

我个人还没有遇到过这个具体问题,但我知道背景资料可能很棘手。也许this 讨论也对你有帮助(我也从那里获取了我的部分信息)。

【讨论】:

感谢您的详细建议。 “由于后台获取事件而启动”不是我的情况。我现在试试 attach 方法。 通过附加调试器,我在 xcode 的控制台中得到了这个:'来自调试器的消息:由于信号 13 而终止'。我认为这不是崩溃信息,而是自目标崩溃以来调用调试器退出的信号,因此调试器的管道已损坏。 是的,可能就是这样。我怕你会变成这样。 :( 似乎崩溃发生在进程中的某个地方,实际上从挂起状态中被拉回,这很奇怪。我不知道你可以用什么方法来进入它(我假设你确实在你的@987654323 中设置了断点@方法(和相关方法))。我唯一的提示是使用日志记录并重新评估你在applicationDidEnterBackground等中所做的事情。也许你在其中留下了一些奇怪的状态?尝试逐步减少逻辑缩小范围。 谢谢。我最近没有在applicationDidEnterBackground 中引入新的逻辑。将再次尝试使用 git bisect 来查找引入此问题的提交。但这确实是一项耗时的任务。 我知道,我对你有感觉。我也遇到过类似的情况(如果有人建议你在一个有损/有故障的网络环境中为越狱的 iPhone 构建一个基于 wifi 的定位服务,它会默默地吞下数据包,运行......)。祝你好运!【参考方案2】:

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

【讨论】:

我没有描述清楚,如果附加lldb,我的应用程序不会崩溃。【参考方案3】:

您无法在真实设备上进行调试。附加调试器后,您的应用将永远不会在真实设备中进入后台模式。

您可以尝试在模拟器上进行调试。 无论如何,请检查您的类属性并将属性设置为强,以确保不会因缺少属性而发生这种情况。

我已经阅读了几个具有 FBApplicationProcess 的 *** 问题。通常,这是由于在应用启动时缺少数组或其他原因而发生的。

最好的问候。

【讨论】:

感谢您的建议。但我从未在模拟器中重现过这种崩溃。【参考方案4】:

我已经阅读了上述所有答案,并且都给出了正确的答案。不过,我想分享一下我的观点。

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

    如果应用程序在没有wire插件的情况下运行或在没有Xcode的情况下运行(直接在iPhone中启动应用程序)然后将应用程序置于后台,应用程序将在接下来的3分钟内运行在后台。 3分钟后,App会自动挂起并从主线程中移除。现在,当我们再次打开应用程序时,它会被视为全新发布。

    如果您的应用开启了任何后台功能,那么您的应用即使在后台也将处于活动状态,但在此期间您无法进行任何 UI 更改。

    要让应用程序在后台保持活动状态,必须正确处理后台功能。 IE。如果在您的应用中使用“当应用处于前台”状态时使用位置,则应用在后台运行的时间不会超过 3 分钟。所以,如果你想在后台连续运行你的应用程序,你必须在Info.plist文件中用Battery drain word表示正确的原因,否则Apple会拒绝它。

    联系我以获取有关您问题的更多详细信息。

谢谢。

【讨论】:

感谢您的回复。我没有Background Capabilities ON,所以我认为这与此无关。【参考方案5】:

您的测试设备上仍然可以查看崩溃日志。

要获取崩溃日志,请尝试以下步骤:

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

【讨论】:

您好,我仔细检查过,设备日志列表中没有我的应用或未知日志。

以上是关于如何调试从后台返回时发生的崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Swift3 - 调试时后台获取崩溃

切换后台任务时SIGPIPE崩溃

是啥导致应用程序在后台长时间运行后在恢复时崩溃?

Firebase 云消息在后台崩溃

MPMoviePlayerController 在后台播放airPlay,双击主页按钮时崩溃

为啥这个应用程序在后台崩溃?