标签: reswift

堆栈溢出:线程 1:EXC_BAD_ACCESS(代码=2,地址=0x16d09aa00)

崩溃描述

最近,我在我的一个 iOS/Swift 项目中遇到了非常奇怪的内存问题。我真的不确定发生了什么,感觉也不太容易描述,但无论如何我会尽力而为。

它的基本行为如下:

  • 在某个代码库上,崩溃总是发生在同一个地方(100% 可重现)
  • 更改代码库,可能会解决问题,但也可能只是在其他地方弹出
  • 崩溃只发生在真实设备上,永远不会发生在模拟器内

目前该应用程序崩溃并出现以下错误(3 次不同运行的结果):

线程 1:EXC_BAD_ACCESS(代码=2,地址=0x16d09aa00)

线程 1:EXC_BAD_ACCESS(代码=2,地址=0x16af46a00)

线程 1:EXC_BAD_ACCESS(代码=2,地址=0x16d526a00)


关于内存地址的推理

世界开发者大会

我在WWDC 2018 上发现了一个有趣的会议(Understanding Crashes and Crash Logs),其中一个人指出有时可以从特定的内存地址中获取更多信息,崩溃就会发生。

不幸的是,它在我的应用程序中崩溃的地址有些完全不同,但也许我们可以从它们那里获得线索?至少有趣的是,它们都非常相似,不是吗?

由于启用了诊断选项而发生的变化

进一步调查表明,前 2 个字节 (16) 始终保持不变,然后是 4 个随机字节,然后是 3 个字节 (a00)。当激活诊断(例如 ASan 或 Scribble)时,最后 3 个字节会改变(例如 3a0 或 9e0)。但也许这只是由于添加了更多“调试内容”而导致的一种转变?我真的不是那个“记忆人”,只是想提供我注意到的任何东西。


尝试“诊断选项”

我尝试了不同的诊断选项(来自方案),但没有一个真正以任何方式改变崩溃,或提供更多信息。

1. 涂鸦

崩溃不引用 0xAA 或 0x55,所以使用 Scribble 没有什么可以捕获的吗?(Xcode - 涂鸦,保护边缘和保护 malloc

2. Malloc Guard Edges

使用这个也没有注意到任何区别。

3. 僵尸

使用本指南

malloc_info --type 0x16b15e9c0

错误:错误:试图将堆栈放入无法读取的内存中:0x16b15e920。

4.阿桑

使用 ASan …

xcode exc-bad-access ios swift reswift

8
推荐指数
1
解决办法
4441
查看次数

如何在iOS swift模块化应用程序中执行路由?

我正在开发一个非常大的应用程序,因此决定采用模块化方法,在该方法中,每个功能都实现为框架,并且一个功能不应“知道”其他功能。

我决定在ReSwift中大量使用它,这是一个遵循REDUX原理构建iOS应用的库。

我设法将全局应用程序状态与所有功能状态分离开来,因此每个功能都定义了自己的状态,并由全局应用程序状态进行管理。

我面临的下一个挑战是路由/导航。我希望能够在位于Feature1中的一个视图控制器到位于Feature2中的另一个视图控制器之间路由(请记住:我想避免要素之间的依赖关系,因此Feature1对Feature2一无所知)。

我知道我可以在我的应用程序中创建一个中心位置,以处理该应用程序的所有路由,但是我想知道每种功能是否都有实现自己的路由的方法。因此Feature1将路由到Feature2,而无需调用某些中央实现。这样做的动机是每个功能都将向应用程序提供其自己的资源。因此,在REDUX原则中,每个功能都应提供:状态,Reducer,操作和路由器,但是这里的挑战是功能不依赖于其他功能。

用于路由的PS我决定选择ReSwift-Router,它是ReSwift应用程序的声明式路由库。

谢谢!

routing ios swift redux reswift

6
推荐指数
1
解决办法
810
查看次数

标签 统计

ios ×2

reswift ×2

swift ×2

exc-bad-access ×1

redux ×1

routing ×1

xcode ×1