如何调试旧版Mac OS X的应用程序?

时间:2013-04-08 14:52:19

标签: xcode macos cocoa gdb lldb

我正在OS X 10.8计算机上使用Xcode 4.6开发应用程序。应用程序部署目标设置为10.6,这是我们需要支持的。但是当我归档应用程序(编译,链接和嵌入资源+框架)并将其部署(也称为复制)到10.6测试机器时,它会崩溃,导致通用的Segmentation故障。它在10.7上工作正常。

我无法在旧版Mac上的Xcode中编译项目,因为应用程序是使用较新的编译器构建的(它使用ARC,隐式属性合成,新的objective-c文字语法等)。它也不会进行类型检查,因为基本SDK是10.8并且它引用了10.6机器上的编译器不知道的一些10.8令牌。

有关如何调试应用的任何建议?

3 个答案:

答案 0 :(得分:2)

我不以任何方式与该公司/软件挂钩,但Deploymate是一款付费应用,可以扫描您的应用以获取SDK使用情况,并告诉您何时调用旧版本中不可用的选择器和API OS版本。这可以帮助您跟踪与API使用相关的异常和崩溃。

答案 1 :(得分:1)

您很可能使用一个或多个10.7+ API在10.6上崩溃。使用10.8目标SDK,您可以允许该SDK中可用的所有调用。然而,应用程序被限制很晚,因此当您实际上没有调用这些函数时,这不会崩溃。您需要一个类似于此的显式检查(此处为全屏功能):

#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_6
if (runningOnLionOrLater) {
    [mainWindow setCollectionBehavior: NSWindowCollectionBehaviorFullScreenPrimary];
    [toggleFullscreenItem setHidden: NO];
}
#endif

确定当前版本的一种方法是:

    int macVersion;
    if (Gestalt(gestaltSystemVersion, &macVersion) == noErr) {
        runningOnLionOrLater = macVersion > MAC_OS_X_VERSION_10_6;
    }

为了调试有问题的调用,只需将基本SDK设置为10.6,XCode应标记那些在那里不可用的函数。

答案 2 :(得分:0)

虽然没有真正好的解决方案(我在不同的macOS版本上看到了不同的行为)并且无法简单地模拟旧的macOS版本,如果你有一台备用的机器:

可以使用外置HD,对其进行分区并安装不同的macOS版本。它们都可以启动,每个操作系统版本重启机器都很麻烦(<痛苦)。

相关问题