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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调试旧版Mac OS X的应用程序?相关的知识,希望对你有一定的参考价值。

我在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令牌。

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

答案

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

另一答案

您很可能使用一个或多个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应标记那些不可用的函数。

另一答案

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

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

以上是关于如何调试旧版Mac OS X的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在实时代码应用程序中的Mac OS X上收听特定的文本字符串

如何在 Mac OS X 上设置已保存文档的 kMDItemKind?

在 Mac OS X 上调试和杀死应用程序?

在 Mac OS X 上使用 Eclipse CDT 调试远程 Linux 应用程序

对 Mac OS X 应用程序进行代码签名以进行 Ad-Hoc Beta 分发(使用 HockeyApp)

MAC OS X 和三星 Galaxy Note 3 中的 ADT:启用 logcat。调试禁用