14

背景

/ 升级到 / 后,我在应用程序加载时甚至进入之前main()都遇到了崩溃。

我已经设置了一个断点,main()但从未达到。

main() 断点

  • 在 Xcode 4.1 中使用 4.3 编译项目在Base SDKiOS 4.x 和 iOS 5 上运行良好。
  • 在 Xcode 4.2 中使用Base SDK5.0 编译相同的项目在 4.x 上运行良好,但在 iOS 5 中崩溃,无论是在模拟器上还是在设备上。

模拟器崩溃

iOS 5 模拟器 LLDB 崩溃 Xcode 4.2 输出

EXC_BAD_ACCESS崩溃

堆栈调用

调用列表,所有系统调用,甚至main()还没有被调用。

我最好的猜测是加载库时出现问题,但知道如何追踪它!

尝试解决

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

12 回答 12

10

您的部署目标是什么?

我的部署目标是 iOS4.0。我把它改成iOS4.3,问题就解决了!(当然是针对 iOS5 GM SDK 构建的。)我的应用程序现在在 iOS5 模拟器中运行。

我从另一个 SO 线程中的一个答案中得到了这个想法,该线程说 iOS4.3 及更高版本支持 ARC。据我所知,我的应用程序不使用 ARC,也不使用它的任何依赖库。答案还谈到了弱引用归零,这似乎......也许是相关的,因为很多人已经成功地删除了有关对 libSystem.B.dylib 的弱引用的特定链接器指令。

我不得不将我的基本部署目标提升到 4.0 以上,这让我有点困扰,因为这感觉就像我正在削减很多潜在用户。尽管 Apple 希望每个人都能升级他们的设备,但很多人并没有这样做。那好吧。

编辑

值得一提的是,这个项目最初是在 Xcode3 下完成的,所以项目本身可能只是一些奇怪的东西,既不需要,也导致了这个问题。但如果我能找到它,我会被诅咒的!

编辑 2

好吧,好吧……经过进一步检查……我在我的 project.pbxproj 文件中发现了 2 个对 libSystem.B.dylib 的错误引用,这些引用在 Xcode 的构建设置中是不可见的,但我必须手动删除文本编辑器!

一旦这样做,我将基本部署版本重置为 4.0,为 iOS5 模拟器构建,应用程序运行没有问题。

惊人的。

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

编辑 3

Xcode 项目编辑

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

显示包裹内容

于 2011-10-13T16:17:46.457 回答
2

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

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

弱链接允许针对具有 3.x 部署目标的 iOS 4.x 进行构建。不管什么原因,它现在在模拟器中完全坏了。

于 2011-10-10T20:24:24.180 回答
2

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

于 2011-11-29T20:23:23.570 回答
1

我在 rjstelling 和 MarkGranoff 的帖子中尝试了所有方法,但均无济于事。我现在可以通过在我的调试方案上关闭 Guard Malloc 来重现地导致它不会发生。守卫 Malloc 开——崩溃,关——没有崩溃。我从来没有在设备上遇到过问题,只有模拟器。我首先在上面的帖子中应用了修复,所以我不知道如果没有这些更改,这是否会解决问题。希望这对其他人有帮助。

于 2011-10-26T23:17:14.450 回答
1

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

但是,此处答案中描述的解决方案对我不起作用,因为我在 project.pbxproj 中没有发现与“弱”相关的问题

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

The way I discovered the issue was accidental. While nothing seemed to happen, the "thread" navigator of Xcode was telling me that the app itself wasn't crashed. And I accidentaly clicked on "pause" in the debugger. And suddenly it stopped exactly where the deadlock was. Which after some thoughts is just logically obvious.

于 2012-01-31T16:07:07.887 回答
1

I had similar problem with logic unit testing (running separate target without dependency on the main app in the iOS simulator), in my situation problem was in lldb, here is more details:
Logic unit tests crash

于 2012-02-24T09:03:53.413 回答
1

An app crashing before entering main.m can happen when a linked framework doesn't get copied, for example because the project uses Carthage and the Run Script build phase /usr/local/bin/carthage copy-frameworks is missing.

于 2016-11-13T22:23:04.587 回答
0

Xcode 4.2 在我的使用中仍然有一些粗糙的边缘。完全删除并重新安装解决了我遇到的问题(它卡在“附加”上,并且“官方”SO线程上的解决方案都没有帮助)。不过可能有点极端。

在 File Navigator 中选择顶级项目,然后转到 Build Phases 选项卡。展开“Link Binary with Frameworks”部分——有没有 Apple 不提供的框架?它们是可选的还是必需的?您的任何代码是否需要任何额外的框架?

为了提供更多帮助,您能否发布当前被调用堆栈弹出窗口遮挡的所有日志消息?

于 2011-10-10T20:30:06.130 回答
0

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

选择 Other Linker Flags,单击 Add Build Setting,选择 Add Conditional Setting,然后应用 -weak_library /usr/lib/libSystem.B.dylib 仅适用于 iOS SDK。

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

于 2011-11-11T03:39:28.710 回答
0

Guard malloc 也是我的问题。可能是因为我使用的是 libxml2.2.7.3.dylib。

这个问题描述了同样的崩溃,但他很幸运能够打开保护 malloc,所以很明显是什么导致了崩溃。我刚刚在将 Xcode 升级到 4.2 后崩溃了。

我想包括堆栈跟踪,以便它可以被谷歌搜索。我很难找到这个页面。

#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 ()
于 2011-11-30T16:42:16.970 回答
0

就我而言,它-objcOther Linker Flags. 我不得不删除它,它就像一个魅力。

于 2018-09-15T10:52:12.760 回答
-1

我似乎记得在调用 main() 之前有一个类似的崩溃错误,我跟踪它到应用程序委托中声明的 IBOutlets 与我的 nib 中声明的不匹配。仔细检查您的网点,看看是否有任何错误配置。

-mz

于 2011-10-10T09:12:15.023 回答