将xcode4.1 / ios4升级为xcode4.2 / ios5后,我正在加载应用程序时遇到崩溃,之前它甚至进入{ {1}}。
我在main()
设置了一个断点,但它永远不会到达。
main()
在Xcode 4.1中编译项目在iOS 4.x和iOS 5上正常工作。Base SDK
5.0在Xcode 4.2中编译相同的项目在4.x上工作正常但在iOS 5中崩溃,无论是在模拟器上还是在设备上。
使用 EXC_BAD_ACCESS
崩溃
呼叫列表,所有系统呼叫,甚至还没有呼叫Base SDK
。
我最好的猜测是加载一个库时遇到问题,但是知道如何跟踪它!
main()
文件夹答案 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下完成的,所以项目本身可能只有一些奇怪的错误,这两者都是不必要的并导致了这个问题。但如果我能找到它,我会被诅咒!
嗯,好吧......好吧......经过进一步的检查......我在我的project.pbxproj文件中找到了2个对libSystem.B.dylib的错误引用,这些引用是通过Xcode的构建设置看不到的,但我必须删除手拿文字编辑器!
执行此操作后,我将基本部署版本重置为4.0,为iOS5模拟器构建,并且应用程序无问题地运行。
惊人的。
教训:永远不要低估项目文件中存在垃圾的可能性。
在Xcode项目包中的project.pbxproj
文件中删除这些行的3次(右键单击并显示包内容)。
答案 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