iOS应用程序在使用Xcode 4.2&进入main()之前崩溃iOS 5

时间:2011-10-10 08:25:26

标签: objective-c xcode ios5 xcodebuild lldb

背景

/ 升级为 / 后,我正在加载应用程序时遇到崩溃,之前它甚至进入{ {1}}。

我在main()设置了一个断点,但它永远不会到达。

main() break point

  • 使用4.3的main()在Xcode 4.1中编译项目在iOS 4.x和iOS 5上正常工作。
  • 使用Base SDK 5.0在Xcode 4.2中编译相同的项目在4.x上工作正常但在iOS 5中崩溃,无论是在模拟器上还是在设备上。

模拟器崩溃

iOS 5 Simulator LLDB Crash Xcode 4.2 Output

使用 EXC_BAD_ACCESS

崩溃

Stack calls

呼叫列表,所有系统呼叫,甚至还没有呼叫Base SDK

我最好的猜测是加载一个库时遇到问题,但是知道如何跟踪它!

尝试以分辨率

  1. 打开Zombies
  2. 打开所有日志记录
  3. 添加了不同版本的系统库(libz.1.2.5.dylib和libz.dylib)
  4. 清理项目
  5. 从模拟器中删除了应用
  6. 删除main()文件夹

11 个答案:

答案 0 :(得分:10)

您的部署目标是什么?

我的部署目标是iOS4.0。我将其更改为iOS4.3并解决了问题! (当然,建立在iOS5 GM SDK的基础上。)我的应用程序现在可以在iOS5模拟器中运行。

我从an answer in another SO thread得到了这个想法,即在iOS4.3及更高版本中支持ARC。据我所知,我的应用程序不使用ARC,也不使用任何依赖库。答案还说了一些关于弱参考归零的东西,这似乎是......可能是相关的,因为很多人已经成功地删除了关于对libSystem.B.dylib的弱引用的特定链接器指令。

让我感到困扰的是,我必须将我的基本部署目标提升到4.0以上,因为这让我觉得我正在削减很多潜在用户。尽管Apple希望每个人都能永远升级他们的设备,但许多人却不会。哦,好吧。

修改

值得一提的是,这个项目最初是在Xcode3下完成的,所以项目本身可能只有一些奇怪的错误,这两者都是不必要的并导致了这个问题。但如果我能找到它,我会被诅咒!

编辑2

嗯,好吧......好吧......经过进一步的检查......我在我的project.pbxproj文件中找到了2个对libSystem.B.dylib的错误引用,这些引用是通过Xcode的构建设置看不到的,但我必须删除手拿文字编辑器!

执行此操作后,我将基本部署版本重置为4.0,为iOS5模拟器构建,并且应用程序无问题地运行。

惊人的。

教训:永远不要低估项目文件中存在垃圾的可能性。

编辑3

Xcode project edit

在Xcode项目包中的project.pbxproj文件中删除这些行的3次(右键单击并显示包内容)。

show package contents

答案 1 :(得分:2)

检查链接器标志。您可能使用的某些库需要这样的标志:

-weak_library /usr/lib/libSystem.B.dylib

弱链接允许构建针对iOS 4.x的3.x部署目标。无论出于何种原因,它现在在模拟器中完全被打破了。

答案 2 :(得分:2)

我正在使用方案诊断程序,并通过意外设置“启用Guard Malloc”来获得完全相同的行为。我的目标是4.3并且在5.0 Simulator上运行ARC。从模拟器启动时,应用程序运行正常,而不是从XCode启动。转到产品 - >编辑方案...,选择左侧表格中的“运行”项,然后选择右侧的“诊断”选项卡。取消选中“启用Guard Malloc”。

答案 3 :(得分:1)

我在rjstelling和MarkGranoff的帖子中尝试了一切无济于事。我现在可以通过在我的调试方案上关闭Guard Malloc来重复使用它。 Guard Malloc on - 崩溃,关闭 - 没有崩溃。我从来没有在设备上只有模拟器的问题。我首先在上面的帖子中应用了修复程序,所以我不知道如果没有这些更改,这是否可以解决问题。希望这有助于其他人。

答案 4 :(得分:1)

我有完全相同的诊断,但解决方案完全不同。

但是,这里的答案中描述的解决方案对我不起作用,因为我在我的项目中找不到“弱”相关的问题.pbxproj

但是,我发现我的问题的原因是从主线程调用的+(void)initialize方法中的死锁。在这种方法中,我正在调用dispatch_sync(dispatch_get_main_queue(), ^{[some block code]})。将其更改为dispatch_async(注意“a”)解决了我的问题。

我发现这个问题的方式是偶然的。虽然似乎没有任何事情发生,Xcode的“线程”导航器告诉我应用程序本身没有崩溃。我偶然点击了调试器中的“暂停”。然后它突然停在了僵局所在的位置。经过一些思考之后,这在逻辑上是显而易见的。

答案 5 :(得分:1)

我有逻辑单元测试的类似问题(运行单独的目标而不依赖于iOS模拟器中的主应用程序),在我的情况问题是lldb,这里有更多细节:
Logic unit tests crash

答案 6 :(得分:0)

Xcode 4.2仍然有一些粗略的边缘。一个完整的删除和重新安装修复了我遇到的问题(它被困在“附加”并且“官方”SO线程上的解决方案都没有帮助)。可能会有点极端。

在File Navigator中选择顶级项目,然后转到Build Phases选项卡。展开“使用框架链接二进制”部分 - 是否有任何框架不是Apple提供的?它们是可选的还是必需的?您的任何代码是否需要任何其他框架?

要帮助更多,您可以发布当前被调用堆栈弹出窗口隐藏的所有日志消息吗?

答案 7 :(得分:0)

您可以将链接器标志有条件地应用于iOS SDK,但不能将其应用于XCode 4中的iPhone模拟器。

选择其他链接器标志,单击添加构建设置,选择添加条件设置,然后仅为iOS SDK应用-weak_library /usr/lib/libSystem.B.dylib。

这使模拟器构建仍然有效。

答案 8 :(得分:0)

当链接框架未被复制时,在进入main.m之前发生应用程序崩溃可能会发生,例如因为项目使用Carthage并且Run Script构建阶段/usr/local/bin/carthage copy-frameworks丢失

答案 9 :(得分:0)

在我的情况下,它是-objc中的Other Linker Flags标志。我不得不将其删除,并且它就像一种魅力。

答案 10 :(得分:-1)

我似乎记得在调用main()之前遇到过类似的崩溃错误,并且我跟踪它在app delegate和我的nib中声明的IBOutlet之间的不匹配。浏览并查看您的商店,看看是否有任何错误配置。

-mz