Flutter iOS 崩溃并出现 EXC_BAD_ACCESS 错误

2024-01-06

我正在使用 Flutter 开发一个应用程序,并在物理 iOS 设备 (iPhone 7) 上测试该应用程序。

iOS版本是:15.3.1
Flutter版本是:2.10.3

当我测试我的应用程序时,偶尔会发生崩溃。崩溃给出以下错误。它并不总是在同一个地方崩溃,所以我不知道在这里分享什么代码。错误消息本身对我来说并没有说明太多,而且我在网上找不到有关此错误的任何有用信息。

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x443b8000443b8000)
    frame #0: 0x0000000198405048 libobjc.A.dylib`objc_msgSend + 8
libobjc.A.dylib`objc_msgSend:
->  0x198405048 <+8>:  ldr    x13, [x0]
    0x19840504c <+12>: and    x16, x13, #0xffffffff8
    0x198405050 <+16>: mov    x15, x16
    0x198405054 <+20>: ldr    x11, [x16, #0x10]
Target 0: (Runner) stopped.
Lost connection to device.
Exited (sigterm)

接下来我可以检查什么?

Addendum

我想知道我的 Stream Builder 是否做错了什么。这是我的代码的缩短版本:

class PrepareList extends StatefulWidget {
  final String place;
  const PrepareList({
    Key? key,
    required this.place,
  }) : super(key: key);

  @override
  State<PrepareList> createState() =>
      _PrepareListState();
}

class _PrepareListState
    extends State<PrepareList> {
  late final Stream? _listStream;

  @override
  void initState() {
    super.initState();

    String dbChild = "events/" + widget.place + "/";

    final db = FirebaseDatabase.instance
        .ref()
        .child(dbChild)
        .orderByKey()
        .limitToLast(1500);

    _listStream = db.onValue;
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: _listStream,
        builder: (context, AsyncSnapshot<dynamic> dbEvent) {
          if (dbEvent.hasError) {
            return CircularProgressIndicator();
          }
          else if (dbEvent.hasData) {
            DataSnapshot dataSnapshot = dbEvent.data!.snapshot;

            List<EventDetails> placeEventList = [];
            if (dataSnapshot.value != null) {
              (dataSnapshot.value as Map<dynamic, dynamic>)
                  .forEach((key, value) {
                placeEventList.add(EventDetails.fromRTDB(value));
              });
              placeEventList
                  .sort((a, b) => a.dateEST.compareTo(b.dateEST));

              return AttendeeList(placeEventList: placeEventList, place: place);
            } else {
              return PlaceDataNotAvailable(place: widget.place);
            }
          } else {
            return CircularProgressIndicator();
          }
        });
  }
}

class AttendeeList extends StatefulWidget {
  final List<EventDetails> placeEventList;
  final String place;
  const AttendeeList({
    Key? key,
    required this.placeEventList,
    required this.place,
  }) : super(key: key);

  @override
  State<AttendeeList> createState() =>
      _AttendeeListState();
}

class _AttendeeListState
    extends State<AttendeeList> {
  late final Stream? _attendeeListStream;

  @override
  void initState() {
    super.initState();

    String dbChild = "attendees/" + widget.place + "/";

    final db = FirebaseDatabase.instance
        .ref()
        .child(dbChild)
        .orderByKey()
        .limitToLast(1500);

    _listStream = db.onValue;
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: _attendeeListStream,
        builder: (context, AsyncSnapshot<dynamic> dbEvent) {
          if (dbEvent.hasError) {
            return CircularProgressIndicator();
          }
          else if (dbEvent.hasData) {
            DataSnapshot dataSnapshot = dbEvent.data!.snapshot;

            List<AttendeeDetails> attendeeList = [];
            if (dataSnapshot.value != null) {
              (dataSnapshot.value as Map<dynamic, dynamic>)
                  .forEach((key, value) {
                attendeeList.add(EventDetails.fromRTDB(value));
              });
              attendeeList
                  .sort((a, b) => a.dateEST.compareTo(b.dateEST));

              return Scaffold(
                body: ShowLists(placeEventList, attendeeList);
            } else {
              return PlaceDataNotAvailable(place: widget.place);
            }
          } else {
            return CircularProgressIndicator();
          }
        });
  }
}

上面的小部件可以在应用程序的生命周期中多次调用。用户通过选择一个来进入此屏幕place在初始屏幕上,它执行中的代码PrepareList有状态的小部件,它又调用AttendeeList有状态的小部件。

我想强调的是,两者PrepareList and AttendeeList使用流。每次执行这些小部件中的代码时,都会从数据库下载大量节点(每个小部件 1500 个)。

一次执行可能如下所示:

PrepareList("London");

另一个执行可能如下所示,在同一屏幕上显示新的项目列表:

PrepareList("Manhattan");

我观察到的是:

当我跑步时PrepareList("London");第一次,需要一些时间(3到4秒)才能看到屏幕上的内容。然后我运行PrepareList("Manhattan");,也需要大约 3 到 4 秒的时间来显示内容。但当我跑步时PrepareList("London");同样,内容很快就会出现在屏幕上,大约 1 秒。

为了能够打电话PrepareList(),我需要转到另一个屏幕,这意味着 - 根据我的理解 - 我的流订阅每次我离开与上面 2 个小部件关联的屏幕时都会被取消。但这是不是这样流本身没有被取消并且数据保留在内存中?

我怀疑的是:使用该应用程序时,正如我所说PrepareList(...)对于多个位置(多次),它会在内存上加载越来越多的数据,并且永远不会清理它。一段时间后,该应用程序消耗了所有可用内存并通过给出上述错误而崩溃,这告诉我没有任何意义。

And as PrepareList(...)当使用该应用程序时执行得越来越多,Iphone 7 就会发热,这是我很容易感觉到的。我什至用 iPhone 12 进行了测试,它不像 iPhone 7 那样发热,但也会崩溃。

我什至尝试将 dispose 添加到这两个类中:

 @override
  void dispose() {
    super.dispose();
  }

......但仍然没有帮助。

我的流实现是真的吗?我怀疑这可能是这次崩溃的根本问题吗?

附录2

我一直在努力。我以这样的方式使用该应用程序PrepareList("...");被触发多次。我也在开发工具中观察了内存使用情况。我可以观察到内存使用量随着时间的推移而增加。这次我遇到了一个新错误,说了一些更具体的内容:

[ServicesDaemonManager] interruptionHandler is called. -[FontServicesDaemonManager connection]_block_invoke
[tcp] tcp_input [C17.1.1:3] flags=[R] seq=3749683210, ack=0, win=0 state=LAST_ACK rcv_nxt=3749683210, snd_una=3584722489
[tcp] tcp_input [C17.1.1:3] flags=[R] seq=3749683210, ack=0, win=0 state=CLOSED rcv_nxt=3749683210, snd_una=3584722489
* thread #46, name = 'DartWorker', stop reason = EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=1450 MB, unused=0x0)
    frame #0: 0x0000000108ef4d0c Flutter`dart::CompilerPass_TypePropagation::DoBody(dart::CompilerPassState*) const + 1644
Flutter`dart::CompilerPass_TypePropagation::DoBody:
->  0x108ef4d0c <+1644>: str    xzr, [x20, x28, lsl #3]
    0x108ef4d10 <+1648>: ldr    x8, [x22, #0x48]
    0x108ef4d14 <+1652>: cmp    x24, x8
    0x108ef4d18 <+1656>: b.ge   0x108ef4d84               ; <+1764>
Target 0: (Runner) stopped.
Lost connection to device.

这次,它说EXC_RESOURCE RESOURCE_TYPE_MEMORY (limit=1450 MB, unused=0x0)。看起来,内存使用量随着时间的推移而增加。为什么当用户离开手机屏幕时内存没有释放? (我通过怀疑即使用户移动到另一个屏幕后流仍然占用内存来问这个问题......)


关于永久增加内存使用量的一些想法,因为如果没有完整的示例,实际上不可能回答您的问题。

  1. Firebase 缓存对象,这就是为什么它第二次更快。这不会影响您的内存使用量而导致应用程序崩溃。

  2. I ask this question by suspecting that the stream still occupies the memory even after the user moves to another screen...

也许你正在使用Navigator.push*并且永远不会弹出任何以前的 路线,之前路线中的所有列表都保存在内存中。

  1. 跟踪 dispose 调用,查看小部件是否被清理。通过使用日志记录、断点,甚至使用 DevTools 内存视图更好地跟踪小部件计数:https://docs.flutter.dev/development/tools/devtools/memory https://docs.flutter.dev/development/tools/devtools/memory内存快照可以准确地告诉您内存的使用情况。

  2. 一般来说,最好将排序移出build功能。但这更多的是性能提示而不是问题。

  3. 您的记忆问题可能与以下问题无关EXC_BAD_ACCESS崩溃,但你应该先尝试解决它们。如果有的话,这将使您更容易找到根本原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter iOS 崩溃并出现 EXC_BAD_ACCESS 错误 的相关文章

  • Dart - 何时在集合上使用 Collection-For-In 与 .Map()

    collection for in 操作和 map 方法都可以返回对先前集合中的元素的一些操作 是否有任何理由更喜欢使用其中一种而不是另一种 var myList 1 2 3 var alteredList1 for int i in my
  • 使用不包含 Bloc 的上下文调用 BlocProvider.of() - 即使它包含

    首先 我确实知道 BLoC 是如何运作的 它背后的想法 我知道两者之间的区别BlocProvider and BlocProvider value 构造函数 为简单起见 我的应用程序有 3 个页面 其中有一个小部件树 如下所示 App gt
  • 颤动:所选值不显示在下拉列表中

    我正在从 SQLite 数据库填充城市名称并尝试显示为下拉列表 我通过遵循教程使其工作 但遇到了一个小问题 所选值不会显示在下拉列表中 它继续显示默认提示值 但是 我能够分配和检索正确的选定值 这是我的代码 cities dart clas
  • 无法使用 CLI Firebase auth:import 命令导入用户帐户

    我需要在 Firebase 中导入用户列表以及电子邮件和密码 我正在尝试使用 CLI auth import 命令在 Firebase 中导入用户 https firebase google com docs cli auth import
  • 扑。是否可以更改 TextFormField errorText 填充?

    我在用着TextFormField with OutlineInputBorder 我需要里面的文本在右侧和左侧有填充 为此 我正在使用 contentPadding const EdgeInsets symmetric vertical
  • Firebase Storage - 如何授权文件下载?

    使用 Firebase Storage 时 您可以设置安全规则来授权获取文件的 url 例如使用getDownloadURL 但是 一旦用户拥有该 URL 什么才能阻止黑客众包该 URL 我知道在Google Cloud Storage中
  • 错误:找不到 com.google.firebase.storage.UploadTask.TaskSnapshot 类型的符号方法 getDownloadUrl()

    在 gradle update 之前一切正常 但后来弹出了这个错误 我参考了官方文档 它提供了相同的代码 不接受 getDownloadUrl 方法 https i stack imgur com YLC2x png 我已经添加了最新的正确
  • 从后台恢复后,Flutter GoogleMap 为空白

    我遇到以下问题 我的 Flutter 应用程序使用 GoogleMap 地图最初加载得很好 但是 如果我将应用程序置于后台并稍后恢复 地图将保持空白 Google 徽标仍然显示 就像未指定 API 密钥时发生的情况一样 我的多边形叠加层也不
  • Flutter:如何使用 AnimatedContainer 和扩展列?

    假设我们有 3 个孩子Column Flexible flex 1 child Container color Colors red Flexible flex 3 child Container color Colors yellow F
  • 使用 Flutter 3.10 / Dart 3.0 进行 VS Code 调试<优化>

    在最新的 颤振 升级 之后 我在 VS Code 调试期间查看某些变量时遇到问题 如何在悬停时查看变量的内容而不是获取此内容 Screenshot of hovering variable 这仅发生在某些变量上 其他变量我可以正常查看内容
  • 确定是否向 Firebase 实时数据库添加或删除数据

    每当添加新帖子时 我都会尝试将通知推送到 Android 应用程序 但是 只要数据 更改 即即使帖子被删除 我不需要 通知也会到达 我如何设置一个条件 以便 FCM 仅在添加帖子时才发送通知 这是我的 index js 文件 const f
  • Flutter - 选择 TextFormField 时键盘不显示

    我目前遇到一个问题 当我选择任何一个时 键盘不会出现TextFormFielda 内的小部件Form小部件 这是表单的代码 位于我的内部CreateAccountForm有状态的小部件 import package flutter mate
  • firebase createUser 无需登录[重复]

    这个问题在这里已经有答案了 我的管理员用户可以创建其他用户 但每次创建用户时 我的管理员用户都会注销 新用户会自动登录 有什么方法可以在不登录的情况下创建用户吗 None
  • 如何设置 Firebase 用户的显示名称?

    根据Firebase网站上的JS Auth文档 它只展示了如何获取 displayName 以及如何更新 displayName 所以我尝试更新它 但这有点不合逻辑 因为你怎么能在不创建某些东西的情况下更新它呢 所以我的问题是 如何设置注册
  • 不使用 BuildContext 预加载图像

    有没有办法在函数中加载 Flutter 中的图像而无需访问 BuildContext Flutter 可以预加载图像precacheImage 需要BuildContext 使用起来不方便 我想加载图像initState StatefulW
  • 更改项目名称

    Flutter项目的项目名称可以修改吗 项目名称是指您在创建 flutter 项目时提供的名称flutter create name 这取决于您想要实现的目标 如果您想更改手机菜单中显示的应用程序名称以及应用程序图标 则必须更改androi
  • Flutter 中有预填充数据库使用的示例吗?

    Flutter 中有预填充数据库使用的示例吗 我不需要 CRUD 示例 此时我只需要从数据库读取数据即可 我是 Flutter 新手 所以一步一步的教程会很好 您可以将您的应用程序与预填充的 sqlite 数据库捆绑在一起assets文件夹
  • 向上滚动时固定项目

    所以我有以下屏幕 我正在寻找一种方法 使得当用户向上滚动时 包含进度条和这 4 个数据字段 ItemHeader 的小部件将向上滚动 但搜索容器 SearchTextField 将被固定 到顶部 当然 当用户向下滚动时 它应该重新出现 我找
  • firebase :: 无法读取 null 的属性“props”

    你好 我正在尝试将react router与firebase一起使用 但它给了我这个错误 无法读取 null 的属性 props 这正是代码 我正在其中使用我的反应路由器 向下代码位于作为登录面板组件的组件上 else if this em
  • 无效字符错误:“fred”

    我确信他一定是一个新手问题 简单来说 我想定义我的第一个 Polymer dart 组件 只是我一直在同一个减速带上踢脚趾 为了使事情变得非常简单 我将其简化为一个非常简单的示例 我做了一个简单的rename示例 跑表 来自 Dart 组件

随机推荐

  • XAML / cs - 更新包后成员名称不能与其封闭类型 (CS0542) 相同

    我刚刚更新了应用程序中的软件包 并且收到了许多我不理解的此类新错误 Users alan Downloads Japanese 31 Japanese obj Debug Views Help GettingStarted xaml g c
  • SQL在删除子表行时锁定父表

    TLDR 当尝试通过 子 表上的主键删除包含另一个 父 表的外键的行时 它会在子事务的持续时间内锁定父表 如何使用外键 子删除来防止发生锁定 示例场景 Setup IF SELECT OBJECT ID dbo Child IS NOT N
  • 处理序列化框架的不兼容版本更改

    问题描述 我们有一个 Hadoop 集群 在该集群上存储使用以下命令序列化为字节的数据Kryo http code google com p kryo 序列化框架 我们用来执行此操作的 Kryo 版本是从官方版本 2 21 分叉出来的 以便
  • Kotlin 和 Android 中“没有足够的信息来推断参数 T”

    我正在尝试使用 Kotlin 在我的 Android 应用程序中复制以下 ListView https github com bidrohi KotlinListView https github com bidrohi KotlinLis
  • 准确确定 Python 多处理期间腌制的内容

    正如线程中所解释的当我调用 multiprocessing Process 时正在腌制什么 https stackoverflow com questions 26025878 what is being pickled when i ca
  • 将数据分组为模糊间隙和孤岛

    这本质上是一个间隙和岛屿问题 但它是非典型的 我确实将示例缩减到最低限度 我需要识别超过特定阈值的间隙 并且重复不会成为问题 尽管此示例删除了它们 在任何情况下 使用 ROW NUMBER 的常见解决方案都没有帮助 因为即使是 1 的间隙也
  • 构建应用程序后,Electron index.html 未加载

    我有一个电子应用程序 在与它捆绑之前运行得非常好electron builder 捆绑并打开应用程序后 出现以下错误 Not allowed to load local resource file tmp mount displa4VwuQ
  • 产品属性的数据库架构

    我想在类别中实现产品过滤 并且对正确的数据库架构有疑问 现在我有下表 类别 1 id 2 category 3 description Products 1 id 2 category id 3 product 4 image 5 pric
  • UDID 和 UUID 之间的区别[重复]

    这个问题在这里已经有答案了 有人说UDID Unique Device IDentifier 有人说UUID Universally Unique IDentifier 它们是否相同 它们之间有什么区别 UUID 通用唯一标识符 以每个应用
  • 闭包中局部变量的错误行为

    我被下面的代码困住了 首先 我将描述用例 使用 ColorGradient 实例调用函数 addPreset 打电话时this listController addItem 名为的回调函数onSelect是提供的 每次触发 listCont
  • 错误:useHref() 只能在 组件的上下文中使用

    当我直接在我的路由器组件中写入我的导航栏组件内容时 它工作正常 但是当我在导航栏组件中写入该内容时 它会生成以下错误 错误 useHref 只能在组件上下文中使用 我在用着 react dom 17 0 2 react router dom
  • 使用 clang 编译时 openmp 无法正确链接

    我已经在 Ubuntu 16 04 上从源代码构建了 clang 4 0 并尝试编译一个简单的 OpenMP 程序 但收到以下错误 tmp test 7f2c7c o In function main home me sf shared t
  • 选择两列之间的日期

    我需要一个 SQL 查询 如果我有两列STARTDATE and END DATE 我想选择日期位于这两个日期之间的所有行 例如 开始日期 1 1 2011 且结束日期 2 2 2011 SELECT FROM table1 WHERE 2
  • Laravel 4 中的通用访问器和修改器

    我知道可以为各个字段定义访问器和修改器 如下所示 public function setSomeAttribute value set the attribute public function getSomeAttribute retur
  • 如何在Java中获取客户端计算机上当前登录用户的用户名?

    当用户 客户端 尝试通过键入 URL 进入应用程序时 我需要获取该计算机的 Windows 登录用户名 我尝试过System getProperty user name 但是当我从其他机器 客户端 访问应用程序时 这仍然显示服务器上登录用户
  • 如何使用本地安装在node_modules中的包中的可执行文件?

    如何在中使用模块的本地版本node js 例如 在我的应用程序中 我安装了咖啡脚本 npm install coffee script 这会将其安装在 node modules咖啡命令是 node modules bin coffee 当我
  • 如何以编程方式从 UIView 获取约束

    我想从 UIView 获取 UILabel 约束 但我无法得到任何约束 我在 CustomView m 中设置约束 如下所示 id initWithFrame CGRect frame self super initWithFrame fr
  • 在 OpenGL3 Core Profile 中使用矩阵作为顶点属性

    我在 OSX 上使用 OpenGL 3 2 Core Profile 我想要进行实例化绘图 glDrawArraysInstanced 其中我为每个实例传递一个矩阵 我的顶点着色器构建得很好 version 150 in mediump v
  • LIKE 与 Linq to Entities

    我知道 Contains 方法确实喜欢LIKE therm the StartsWith 方法确实喜欢LIKE therm 和 EndsWith 方法就像LIKE therm but 有没有办法像下面那样做 Linq to Entities
  • Flutter iOS 崩溃并出现 EXC_BAD_ACCESS 错误

    我正在使用 Flutter 开发一个应用程序 并在物理 iOS 设备 iPhone 7 上测试该应用程序 iOS版本是 15 3 1Flutter版本是 2 10 3 当我测试我的应用程序时 偶尔会发生崩溃 崩溃给出以下错误 它并不总是在同