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

5
我正在使用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
@cody 我喜欢Xcode中的可视化调试器,特别是在我的源代码中设置断点。 - lmirosevic
你在说什么10.8令牌?是否有任何运行时条件或“respondsToSelector:”调用可以使10.6机器避免使用10.8特定的API? - Michael Dautermann
1
那么,您可以尝试从Xcode附加到进程吗? - cody
@MichaelDautermann 一个例子就是我们有一些代码看起来像这样:if ([NSUserNotificationCenter class]) {//使用Lion通知中心} else {//使用Growl} - lmirosevic
一个伟大的问题没有简单的解决方案。在某些(更糟糕的)情况下,这不是崩溃问题,而是不同的行为。一些动画在旧版 macOS 上根本无法工作(API 应该支持更旧的版本),只会显示第一帧动画。除了拖动二进制文件并查看哪些工作之外,真的没有简单的方法。 - bauerMusic
3个回答

2

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


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就会标记那些在该版本中不可用的函数。


0

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

可以使用外部硬盘,对其进行分区并安装不同的macOS版本。它们都可以启动,只需要重新启动每个操作系统版本即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接