在使用Xcode 4.2和iOS 5进入main()之前,iOS应用程序崩溃
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在使用Xcode 4.2和iOS 5进入main()之前,iOS应用程序崩溃相关的知识,希望对你有一定的参考价值。
背景
在将qazxsw poi / qazxsw poi升级到qazxsw poi / xcode4.1之后,我正在遇到崩溃,而App正在加载,甚至在它进入ios4之前。
我在xcode4.2设置了一个断点,但它永远不会达到。
- 使用4.3的ios5在Xcode 4.1中编译项目在ios 4.x和iOS 5上运行正常。
- 使用5.0的
main()
在Xcode 4.2中编译相同的项目在4.x上工作正常但在iOS 5中崩溃,无论是在模拟器上还是在设备上。
模拟器崩溃
与EXC_BAD_ACCESS崩溃
呼叫列表,所有系统调用,甚至还没有调用main()
。
我最好的猜测是加载一个库有问题,但知道如何跟踪它!
试图解决问题
- 打开僵尸
- 打开所有日志记录
- 添加了不同版本的系统库(libz.1.2.5.dylib和libz.dylib)
- 清理了这个项目
- 从模拟器中删除了应用程序
- 删除
Base SDK
文件夹
您的部署目标是什么?
我的部署目标是iOS4.0。我将其更改为iOS4.3并解决了问题! (当然,建立在iOS5 GM SDK的基础上。)我的应用程序现在可以在iOS5模拟器中运行。
我从Base SDK
得到了这个想法,说在iOS4.3及更高版本中支持ARC。据我所知,我的应用程序不使用ARC,也不使用任何依赖库。答案还说了一些关于弱引用归零的东西,这看起来似乎......可能是相关的,因为很多人已经成功地删除了关于对libSystem.B.dylib的弱引用的特定链接器指令。
令我困扰的是,我必须将我的基本部署目标提升到4.0以上,因为这感觉我正在削减许多潜在用户。尽管Apple希望每个人都能永远升级他们的设备,但许多人却不会。那好吧。
编辑
值得一提的是,这个项目最初是在Xcode3下完成的,所以项目本身可能只有一些奇怪的错误,这两者都是不必要的并导致了这个问题。但如果我能找到它,我会被诅咒!
编辑2
好吧,好吧......经过进一步的检查......我在我的project.pbxproj文件中发现了两个对libSystem.B.dylib的错误引用,这些引用是通过Xcode的构建设置看不到的,但是我必须手动删除文本编辑器!
执行此操作后,我将基本部署版本重置为4.0,为iOS5模拟器构建,应用程序运行没有问题。
惊人。
经验教训:永远不要低估项目文件中存在垃圾的可能性。
编辑3
在Xcode项目包中的main()
file中删除这些行的3次出现(右键单击并显示包内容)。
当链接框架未被复制时,在进入Logic unit tests crash之前崩溃的应用程序可能会发生,例如因为项目使用Carthage并且缺少This question构建阶段#0 0x00000000 in <????> ()
#1 0x99924ef3 in mig_get_reply_port ()
#2 0x9991e70c in mach_ports_lookup ()
#3 0x0141c124 in _xpc_domain_init_local ()
#4 0x01419eb1 in _libxpc_initializer ()
#5 0x8fe2a15b in __dyld__ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE ()
#6 0x8fe29cc0 in __dyld__ZN16ImageLoaderMachO16doInitializationERKN11ImageLoader11LinkContextE ()
#7 0x8fe27220 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEjRNS_21InitializerTimingListE ()
#8 0x8fe271b6 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEjRNS_21InitializerTimingListE ()
#9 0x8fe271b6 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEjRNS_21InitializerTimingListE ()
#10 0x8fe271b6 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEjRNS_21InitializerTimingListE ()
#11 0x8fe271b6 in __dyld__ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEjRNS_21InitializerTimingListE ()
#12 0x8fe281c0 in __dyld__ZN11ImageLoader15runInitializersERKNS_11LinkContextERNS_21InitializerTimingListE ()
#13 0x8fe1c626 in __dyld__ZN4dyld24initializeMainExecutableEv ()
#14 0x8fe20ef2 in __dyld__ZN4dyld5_mainEPK12macho_headermiPPKcS5_S5_ ()
#15 0x8fe1a2ef in __dyld__ZN13dyldbootstrap5startEPK12macho_headeriPPKclS2_ ()
#16 0x8fe1a063 in __dyld__dyld_start ()
。
就我而言,它是main.m
的Run Script
旗帜。我不得不删除它,它就像一个魅力。
我似乎记得在调用main()之前有一个类似的崩溃错误,我跟踪它在app delegate和我的nib中声明的IBOutlets之间的不匹配。浏览并检查您的商店,看看是否有任何错误配置。
-mz
检查链接器标志。您可能使用的某些库需要这样的标志:
Derived Data
弱链接允许针对iOS 4.x构建具有3.x部署目标。无论出于何种原因,它现在在模拟器中完全被打破了。
我正在使用方案诊断程序,并通过意外设置“启用Guard Malloc”来获得完全相同的行为。我的目标是4.3并且在5.0 Simulator上运行ARC。从模拟器启动时,应用程序运行正常,而不是从XCode启动。转到产品 - >编辑方案...,选择左侧表格中的“运行”项,然后选择右侧的“诊断”选项卡。取消选中“启用Guard Malloc”。
我在rjstelling和MarkGranoff的帖子中尝试了一切都无济于事。我现在可以通过在我的调试方案上关闭Guard Malloc来重复使用它。 Guard Malloc on - 崩溃,关闭 - 没有崩溃。我从来没有在设备上只有模拟器的问题。我首先在上面的帖子中应用了修复程序,所以我不知道如果没有这些更改,这是否可以解决问题。希望这有助于其他人。
我有完全相同的诊断,但解决方案完全不同。
但是,这里的答案中描述的解决方案对我不起作用,因为我发现我的项目中没有“弱”相关的问题.pbxproj
但是,我发现我的问题的原因是从主线程调用的an answer in another SO thread方法中的死锁。在这种方法中,我打电话给project.pbxproj
。将此更改为-weak_library /usr/lib/libSystem.B.dylib
(注意“a”)解决了我的问题。
我发现这个问题的方式是偶然的。虽然似乎没有任何事情发生,Xcode的“线程”导航器告诉我应用程序本身没有崩溃。我偶然点击了调试器中的“暂停”。然后它突然停在了僵局所在的位置。经过一些思考后,这在逻辑上是显而易见的。
我有逻辑单元测试的类似问题(运行单独的目标而不依赖于iOS模拟器中的主应用程序),在我的情况问题是在lldb,这里是更多细节:
+(void)initialize
Xcode 4.2仍然有一些粗略的边缘。一个完整的删除和重新安装修复了我遇到的问题(它被困在“附加”并且“官方”SO线程上的解决方案都没有帮助)。可能有点极端。
在File Navigator中选择顶级项目,然后转到Build Phases选项卡。展开“使用框架链接二进制”部分 - 是否有任何框架不是Apple提供的?它们是可选的还是必需的?您的任何代码是否需要任何其他框架?
为了帮助更多,您可以发布当前被调用堆栈弹出窗口隐藏的所有日志消息吗?
您可以将链接器标志有条件地应用于iOS SDK,而不是XCode 4中的iPhone模拟器。
选择Other Linker Flags,单击Add Build Setting,选择Add Conditional Setting,然后为iOS SDK应用-weak_library /usr/lib/libSystem.B.dylib。
这使模拟器构建仍然有效。
Guard malloc也是我的问题。可能是因为我使用的是libxml2.2.7.3.dylib。
dispatch_sync(dispatch_get_main_queue(), ^{[some block code]})
描述了同样的崩溃,但他很幸运能够开启警卫摩托车,所以很明显是什么导致了撞车事故。我刚刚将Xcode升级到4.2后崩溃了。
我想要包含堆栈跟踪,以便它是Googleable。我很难找到这个页面。
dispatch_async
以上是关于在使用Xcode 4.2和iOS 5进入main()之前,iOS应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
使用 iOS 5.0 Beta 版本在 Xcode 4.2 中创建 IPA 文件
升级到 Xcode 4.2/iOS 5 后,类别中的方法引发异常
Xcode 4.2 和 iOS 5.1 管理器用黄点读取我的 iPhone?
如何在 Mac OSX 10.6.4 Snow leopard 中使用 iOS 5 安装 xcode 4.2