如何调试从后台返回时发生的崩溃
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 > 设备和模拟器。 从屏幕左侧的设备部分选择您的设备。 选择查看设备日志按钮。 识别并选择崩溃日志以查看内容。【讨论】:
您好,我仔细检查过,设备日志列表中没有我的应用或未知日志。以上是关于如何调试从后台返回时发生的崩溃的主要内容,如果未能解决你的问题,请参考以下文章