1

我在 App Store 中有一个应用程序,它给出以下错误消息:

main.m 第 15 行中的 SIGSEGV

int main(int argc, char *argv[])
{
@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  <-- line 15
}
}

相关用户的详细信息是:

在此处输入图像描述

这是堆栈跟踪:

0 libobjc.A.dylib 0x3b446b26 0x3b443000 + 15142
1 UIKit 0x3376c03b 0x33549000 + 2240571
2 UIKit 0x3376bf43 0x33549000 + 2240323
3 UIKit 0x3367132b 0x33549000 + 1213227
4 UIKit 0x33724253 0x33549000 + 1946195
5 UIKit 0x335d4971 0x33549000 + 571761
6 UIKit 0x3354c473 0x33549000 + 13427
7 CoreFoundation 0x30dae1d5 <redacted> + 20
8 CoreFoundation 0x30dabb79 <redacted> + 284
9 CoreFoundation 0x30dabebb <redacted> + 730
10 CoreFoundation 0x30d16ce7 CFRunLoopRunSpecific + 522
11 CoreFoundation 0x30d16acb CFRunLoopRunInMode + 106
12 GraphicsServices 0x359e4283 GSEventRunModal + 138
13 UIKit 0x335b8a41 UIApplicationMain + 1136
14 SalonBook 0x0006c0f5 main (main.m:15) + 28917

关于从哪里开始寻找此错误原因的任何想法?

4

1 回答 1

1

您的应用程序遇到分段错误或内存访问冲突。根据我在过去一年左右从我自己的设备上看到的抛弃日志,42 MB 的内存占用听起来很大。我对您的应用程序、它在内存中拥有什么样的资源等一无所知。您的应用程序可能存在一系列内存问题:

  • 无法满足的简单内存过度需求(没有交换文件)
  • 保留周期导致不必要的内存压力
  • 无效的指针访问

我建议您使用您的应用程序实现的目标:

  • 实现分析仪报告的零警告
  • 确定在什么情况下内存分配会变得如此之高
  • 识别并消除保留周期
  • 识别内存中不必要的资源并删除它们
  • 识别大于应有的资源并对其进行返工

调查此问题的起点是通过Product > Analyze菜单项运行 Xcode 的分析器。这将检测并报告内存访问错误的已知原因。如果您没有使用自动引用计数,它还会报告潜在的内存泄漏。在撰写本文时,我不认为分析器有助于保留周期。

接下来,只需在设备上使用您的应用程序,通过 Xcode 运行,并观察内存占用情况。当您浏览应用程序和/或使用更多功能时,内存使用量只是在增长而不是在减少吗?识别导致内存占用大量增加的任何场景。同样,我不了解您的应用程序,因此目前我不知道如何提供更具体的指导。

如果您在 Apple 的Instruments应用程序中使用分配工具,则保留周期可能很明显。您可以通过Product > Profile运行它菜单项。Instruments 允许您按对象类型、大小、计数等浏览分配,并允许您查看单个对象的调用堆栈,以便了解它们是如何创建的。您可能会发现一些分配突然出现在您面前,例如“这个 4 MB 的图像是什么?” 或“为什么应用程序有 8000 个 NSArray 对象?” Instruments 在这里帮助完成的另一项任务是提供代数。“标记生成”按钮可让您在工作流程中的关键点放置标记。在执行工作流之前和之后,您将看到该时间跨度内的内存增长量,并且您可以深入了解调用堆栈以查看分配的内容以及分配方式。

如果您对此有任何疑问,请发表评论,我会尽快跟进。

于 2013-09-28T07:58:19.303 回答