ios - iOS 内存对齐错误

标签 ios objective-c runtime rapidjson

我被以下崩溃报告困扰:

Date/Time:       2013-09-12 22:39:54 +0000
OS Version:      iPhone OS 6.1.3 (10B329)
Report Version:  104

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0xa0000008
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                     0x39a3c564 _cache_getImp + 4
1   libobjc.A.dylib                     0x39a3e1d7 class_respondsToSelector + 31
2   CoreFoundation                      0x31b96605 objectIsKindOfClass + 37
3   CoreFoundation                      0x31b9635d __handleUncaughtException + 69
4   libobjc.A.dylib                     0x39a41a65 _objc_terminate() + 129
5   libc++abi.dylib                     0x3948e07b safe_handler_caller(void (*)()) + 79
6   libc++abi.dylib                     0x3948e114 std::terminate() + 20
7   libc++abi.dylib                     0x3948f599 __cxa_current_exception_type + 1
8   libobjc.A.dylib                     0x39a419d1 objc_exception_rethrow + 13
9   CoreFoundation                      0x31adcf21 CFRunLoopRunSpecific + 457
10  CoreFoundation                      0x31adcd49 CFRunLoopRunInMode + 105
11  GraphicsServices                    0x356a82eb GSEventRunModal + 75
12  UIKit                               0x339f2301 UIApplicationMain + 1121
13  Our App                             0x0003bc27 main (main.m:15)

在尝试修复导致此错误的错误后,我不断从 PLCrashReporter(来自 Beta 测试人员的临时构建)一次又一次地收到此崩溃日志。不同的异常代码从 SIGSEGV/SEGV_ACCERR 到 SIGBUS/BUS_ADRALN 到 EXC_BAD_ACCESS/KERN_INVALID_ADDRESS 不等

我正在使用rapidjson library在 iOS(armv7 和 armv7s)上,按照描述进行填充修复 here (#8)我使用 Objective-C 运行时函数在运行时添加方法实现(使用 class_addMethod)。

我们的代码库主要由 Objective-C 代码组成,还有一些 Obj-C++ 和一些 C 代码。除了手动处理的 Obj-C++ 和 C 部分外,内存管理均由 ARC 完成。我研究了每个 malloc/free 调用,并广泛使用 libgmalloc 来确定内存问题,但没有什么对我来说不正确的。

我无法自己重现此崩溃日志,无论是在调试还是 Release模式下,但我们的 Beta 测试人员都会偶尔向我发送此崩溃日志(大约 50 次运行中会出现 1 次)。由于我们的产品(希望)很快将在许多 iOS 设备上运行,因此我们不能让这个问题被破坏。

在阅读了大量内存管理文章后,我怀疑这个问题是由内存对齐不良引起的。因此我怀疑rapidjson是这个bug的原因。我对 iOS/armv7 内存对齐缺乏了解,不允许我修复此崩溃日志。有人可以向我解释一下有关 iOS 上这个主题的更多信息吗?或者我找错了地方,这是另一个内存问题吗? 我希望有人能指出我正确的方向。

如果需要更多信息,我很乐意提供。 注意:我并不是在寻找使用 JSONKit 或其他库来替换 rapidjson 的答案。谢谢:)

最佳答案

此问题之前已在此处解决:https://devforums.apple.com/message/807860

简而言之,原始 O​​bjective-C 异常在未捕获的异常处理程序中被取消引用之前已被释放(例如,通过自动释放池)。因此, __handleUncaughtException() 取消引用现在已死亡的指针,并且您会在异常处理程序中看到崩溃。

关于ios - iOS 内存对齐错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18779966/

相关文章:

ios - 我可以在应用程序终止后从 NSUserDefaults 检索数据吗?

ios - 存储在 'cfuuid' 中的对象的潜在泄漏

objective-c - 同时使用 AVCaptureSession 和 Playback Audio 录制音频/视频?

ios - 导航栏自行更改栏

java - 在运行时将按钮添加到布局

ios - UITableView 在 reloadData 时消失了

ios - Swift 全屏导航推送 Segue

ios - 在 tableView 中插入两个数组 - 连接时出错

objective-c - Objective-C 中的标记指针

objective-c - Objective-C 是如何编译的?