【问题标题】:How do you debug an app for an older version of Mac OS X?如何为旧版 Mac OS X 调试应用程序?
【发布时间】:2013-03-30 17:21:57
【问题描述】:

我正在 OS X 10.8 机器上使用 Xcode 4.6 开发应用程序。应用部署目标设置为 10.6,这是我们需要支持的。但是当我存档应用程序(编译、链接和嵌入资源+框架)并将其部署(也称为复制)到 10.6 测试机器时,它会因通用分段错误而崩溃。它在 10.7 上运行良好。

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

关于如何调试应用程序有什么建议吗?

【问题讨论】:

  • gdb 呢?用它启动你的二进制文件
  • @cody 我喜欢 Xcode 中的可视化调试器,尤其是在我的源代码中设置断点。
  • 你在说什么 10.8 代币?是否有任何运行时条件或“respondsToSelector:”调用允许 10.6 机器避开 10.8 特定 API?
  • 所以可以尝试从 xcode 附加到进程?
  • @MichaelDautermann 例如,我们拥有的一些代码如下所示:if ([NSUserNotificationCenter class]) {//use lion notification center} else {//use growl}

标签: xcode macos cocoa gdb lldb


【解决方案1】:

您很可能使用了一个或多个在 10.6 上崩溃的 10.7+ API。使用 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】:

    我与这家公司/软件没有任何关系,但Deploymate 是一款付费应用程序,它可以扫描您的应用程序以了解 SDK 使用情况,并在您调用旧操作系统版本上不可用的选择器和 API 时告诉您.这可以帮助您跟踪与 API 使用相关的异常和崩溃。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-08-27
        • 2011-02-20
        • 2011-01-15
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        相关资源
        最近更新 更多