调试运行时问题

编辑

了解可用于调试您的 Expo 项目的不同技术。


无论您是在本地开发应用、将其发送给选定的测试者,还是将应用上线到应用商店,您总会遇到调试问题。将错误分为两类是很有用的:

  • 在开发过程中遇到的错误
  • 您(或您的用户)在生产环境中遇到的错误

让我们看看在处理上述每种情况时的推荐做法。

开发错误

这些是您在开发应用时常见的错误。深入研究它们并不总是直接的。通常,在使用 Expo CLI 运行应用时调试就足够了。

调试这些问题的一种方法是查看 堆栈跟踪。但是,在某些情况下,查看堆栈跟踪并不足够,因为跟踪的错误消息可能有些模糊。对于此类错误,请按以下步骤操作:

  • 在 Google 和 Stack Overflow 中搜索错误消息,您很可能不是第一个遇到此问题的人。
  • 隔离抛出错误的代码。这一步是 至关重要的,用以修复模糊错误。为此:
    • 恢复到工作版本的代码。这甚至可以是一个完全空白的 npx create-expo-app 项目。
    • 一步一步应用您最近的更改,直到它崩溃。
    • 如果您在每一“片段”中添加的代码很复杂,您可能想简化您的操作。例如,如果您使用状态管理库如 Redux,您可以尝试完全移除它来查看问题是否出在您的状态管理上(这是 React 应用中常见的问题)。
    • 这样可以缩小错误的可能来源,并为您提供更多信息,以便在互联网上搜索其他遇到同样问题的人。
  • 使用断点(或 console.log)检查并确保某段代码在运行,或者某个变量具有特定值。使用 console.log 进行调试并不被视为最佳实践,然而,它快速、简单,且往往提供一些有启发性的信息。

尽可能简化代码以追踪错误源是一种很好的调试应用的方法,而且这个过程会变得越来越容易。这就是为什么许多开源代码库要求在您提交问题时提供 最小可重现示例。这确保您已经隔离了问题并确切找到了问题发生的位置。如果您的应用过于庞大和复杂无法做到这一点,尝试在一个空白的 npx create-expo-app 项目中提取您尝试添加的功能,然后从那里开始。

原生调试

您可以通过在本地生成源代码并从该源构建来使用 Android Studio 和 Xcode 进行完整的原生调试。

Android Studio

1

通过运行以下命令生成您的项目的原生代码:

Terminal
npx expo prebuild -p android

这将在您的项目根目录添加一个 android 目录。

2

通过运行命令在 Android Studio 中打开项目:

Terminal
open -a "/Applications/Android Studio.app" ./android

3

从 Android Studio 构建应用并连接调试器。有关更多信息,请参见 Google 的文档

完成此过程后,您可以删除 android 目录。这确保您的项目仍由 Expo CLI 管理。保留该目录并在 npx expo prebuild 之外手动修改它,意味着您需要手动升级和配置原生库。

Xcode

此功能仅适用于 macOS 用户,并要求安装 Xcode。

1

通过运行以下命令生成您的项目的原生代码:

Terminal
npx expo prebuild -p ios

这将在您的项目根目录添加一个 ios 目录。

2

通过运行命令打开 Xcode 中的项目,这是打开您项目的 ios 目录下 .xcworkspace 文件的快捷方式。

Terminal
xed ios

3

使用 Cmd ⌘ + r 或按下 Xcode 左上角的播放按钮来构建应用。

4

您现在可以利用 低级调试器 (LLDB) 及所有其他 Xcode 调试工具 来检查原生运行时。

完成此过程后,您可以删除 ios 目录。这确保您的项目仍由 Expo CLI 管理。保留该目录并在 npx expo prebuild 之外手动修改它,意味着您需要手动升级和配置原生库。

生产错误

您在生产应用中遇到的错误或漏洞可能更难解决,主要由于您对错误的上下文了解较少(即,错误发生的地点、方式和原因是什么?)。

解决生产错误的最佳第一步是本地重现它。 一旦您在本地重现了错误,您可以按照 开发调试过程 隔离并解决根本原因。

提示:有时,在本地以 生产模式 运行应用会显示通常不会抛出的错误。您可以通过运行 npx expo start --no-dev --minify 在本地按生产模式运行应用。 --no-dev 告诉服务器不要以开发模式运行,而 --minify 用于以与生产 JavaScript 包相同的方式压缩您的代码。

生产应用崩溃

当生产应用崩溃时,这可能是一个令人沮丧的情况。当发生崩溃时,几乎没有信息可以查看。重现这个问题很重要,即使您无法做到这一点,也要找到相关的崩溃报告。

首先使用您的生产应用重现崩溃,然后 找到相关的崩溃报告。对于 Android,您可以使用 adb logcat,对于 iOS,您可以使用 Xcode 中的控制台应用。

如何使用 Logcat 和 macOS 控制台进行调试
如何使用 Logcat 和 macOS 控制台进行调试

在本教程中,您将学习如何使用设备的本机日志记录功能,如 ADB Logcat 和 macOS 控制台,快速找到代码中的错误并修复它们。

使用 adb logcat 查看崩溃报告

如果您的 Android 应用在 Google Play 上,请查看 Google Play 控制台 的崩溃部分,或将 Android 设备连接到计算机并运行以下命令:

Terminal
adb logcat

Android 调试桥 (adb) 程序是 Android SDK 的一部分,允许您查看实时日志。避免安装 Android SDK 的替代方法是在 Chrome 中使用 WebADB

使用控制台应用查看崩溃报告

如果您的 iOS 应用在 TestFlight 或 App Store 上,您可以在 Xcode 中使用 崩溃组织者

如果没有,您可以通过将设备连接到您的 Mac,使用 Xcode 中的 控制台 应用。请按照以下步骤访问控制台应用:

1

打开 Xcode 应用,然后通过按 Shift + Cmd ⌘ + 2 打开 设备和模拟器 窗口。

2

如果您已连接实际设备,请在 设备 下选择它。否则,如果您使用的是模拟器,请在 模拟器 下选择它。

3

单击窗口中显示的 Open Console 按钮以打开控制台应用。

这将打开控制台应用,供您查看来自设备或模拟器的日志。

有关更多信息,请参见苹果的 使用崩溃报告和设备日志诊断问题 指南。

应用在特定(旧款)设备上崩溃

这可能表明存在性能问题。您可能需要通过分析器运行应用,以更好地了解哪些进程正在导致应用崩溃,且 React Native 为此提供了一些很好的文档。我们还建议使用 React Native 开发工具 和随附的 分析器,这使得识别应用中 JavaScript 性能瓶颈变得超级简单。

使用错误报告服务

在您的生产应用中实现崩溃和错误报告服务提供了若干好处,例如:

  • 提供有关生产部署的实时洞察,包括重现崩溃和错误的信息。
  • 设置警报系统,以便在发生致命 JavaScript 错误或您配置的任何其他事件时获得通知。
  • 使用网页仪表板查看关于异常的详细信息,例如堆栈跟踪、设备信息等。

使用 Expo,您可以集成像 SentryBugSnag 这样的报告服务,以实时获取更多洞察。

卡住了?

Expo 社区和 React 及 React Native 社区是您在遇到困难时寻求帮助的良好资源。很有可能其他人也遇到过与您相同的错误,所以请务必阅读文档,搜索 论坛GitHub 问题Stack Overflow