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

问题描述 投票:4回答:3

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

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

xcode macos cocoa gdb lldb
3个回答
2
投票

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


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应标记那些不可用的函数。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.