3

我在这里遇到了一个奇怪的崩溃,我认为它是由外部库引起的,但是我无法跟踪堆栈跟踪,并且不确定如何使用 Xcode 的内存探索工具。

这是我在控制台崩溃时得到的内容:

*** Terminating app due to uncaught exception 'NSGenericException',
    reason: '*** Collection <__NSArrayM: 0x208c5d00> was mutated while being enumerated.'
*** First throw call stack:
    (0x37ae32a3 0x35e0d97f 0x37ae2d85 0x7c57d 0x728b1 0x6b865 0x34d9f11f 0x34d9e4b7 0x34da31bd 0x37ab6f3b 0x37a29ebd 0x37a29d49 0x368602eb 0x38ffb2f9 0x643d1 0x64358)
libc++abi.dylib: terminate called throwing an exception

我正在使用 MKNetworkKits UIImageViewsetImageFromURL添加来向 UITableViewCell imageview(自定义 imageview 对象,而不是 UITableViewCell 附带的默认 imageview)提供图像。当我删除此setImageFromURL呼叫时,我没有遇到任何崩溃。

我尝试在命令行上使用dwarfdumpatos,但上述崩溃中的地址都没有链接到任何特定的函数地址。

我已经搜索了执行枚举循环的地方forin,但似乎找不到任何真正改变数据的地方。显然我忽略了一些东西..

任何建议/提示/帮助都将非常感激..

编辑:到目前为止感谢您的评论。关于如何利用内存地址追踪实际代码行的任何提示都会有所帮助 - Xcode 可以做一些 Visual Studio 调试器可以做的事情,关于代码和内存检查吗?

4

4 回答 4

2

脚步 :

  1. 运行应用程序并检查哪个ViewController应用程序因此异常而崩溃。
  2. 一旦您找到该ViewController控制器的检查整个代码NSArray
  3. 检查您从该控制器调用的相关委托(如果有)。
  4. 检查您在该控制器中使用的所有自定义子类。

从描述看来,您正在枚举NSArray并检查它的值。一旦你找到你想要改变这些值的值。因此,您正在创建一个mutableCopyofNSArray并尝试在当前运行的枚举中进行更改。

解决方案 :

  1. 创建NSMutableArray外部枚举。当您找到要更改的值时,枚举两个数组NSArray的值将保持不变。objectAtIndex:在可变副本中更改它(在外部创建)。[不利于记忆]
  2. 创建NSMutableArray当前 NSArray 的外部枚举。然后枚举NSMutableArray。[枚举可变副本时枚举会变慢]

猎杀虫子!

于 2013-02-18T21:43:38.190 回答
1

这可能对您有用:

用这个替换你的 main.m 文件代码(对于 ARC):

int main(int argc, char *argv[])
{
    @autoreleasepool {
        int retVal = -1;
        @try {
            retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([FRAppDelegate class]));
        }
        @catch (NSException* exception) {
            NSLog(@"Uncaught exception: %@", exception.description);
            NSLog(@"Stack trace: %@", [exception callStackSymbols]);
        }
        return retVal;
    }
}
于 2013-02-18T22:36:24.130 回答
0

我建议,从简单的地方开始,你正在改变一个数组,可能是NSMutableArray一个循环内部。这可以通过使用临时存储轻松解决,它们在循环完成后删除临时对象。

如果这没有帮助,请设置一个异常断点以中断所有异常。这可能会在导致错误的代码行上停止。

于 2013-02-18T21:44:59.607 回答
0

这有助于:

https://stackoverflow.com/a/12266856/420594

编辑 Debug 方案并从 LLDB 切换到 GDB 帮助很大——崩溃点现在直接指向我自己的代码行。

于 2013-02-19T09:09:23.970 回答