如何在OS X中调试屏幕保护程序

时间:2009-07-09 05:10:23

标签: objective-c xcode macos debugging screensaver

我想知道是否有任何不错的方法,除了NSLog-ing几乎所有东西 - 在OS X中正确调试Screensaver应用程序包?

“屏幕保护程序”是Xcode中的项目类型,但显然没有Build and Go调试。此外,我发现实际上我的包已经加载到

/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app 

应用程序作为某种插件。

那么调试代码有一个不错的方法吗?查看崩溃报告和NSLoging到控制台帮助,但它远非完美。

9 个答案:

答案 0 :(得分:14)

有一篇旧的MacTech文章介绍了屏幕保护程序的开发周期。文章还有一个Part 2。请查看“调试提示”部分。

我觉得这个方法很痛苦所以我编写了一个应用程序,基本的应用程序是一个窗口和一个控制器,用我的新屏幕保护程序包初始化了ScreenSaverView。一旦这个工作正常,我必须做的就是测试一个改变是在Xcode中命中了Command-R。

答案 1 :(得分:7)

由于OS X 10.11 El Capitan的系统完整性保护功能,调试器无法连接到从/System/运行的任何内容。此外,此处的其他信息适用于旧版本的Xcode。

以下是我使用Xcode 7.2开发El Capitan的方法:

  1. /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app/复制到/tmp/。 (由于.xcscheme引用了完全限定的路径,因此将其复制到公共场所最适合协作,而不是特定用户主目录中的某个位置。)
  2. 修改项目的.xcscheme
    • 将可执行文件的“运行”操作设置为复制的应用程序,并添加参数:-debug -background -module "<product-name>"(其中<product-name>是不带{.saver的包名称1}}扩展)。
    • 添加一个预操作脚本(下面的源代码),其shell设置为/bin/bash,其构建设置来自该方案。它会在.saver
    • 中创建指向已构建~/Library/Screen Savers/包的符号链接
  3. 来源:

    SCREEN_SAVER_PATH="${HOME}/Library/Screen Savers/${FULL_PRODUCT_NAME}"
    if [[ -d "${SCREEN_SAVER_PATH}" || -f "${SCREEN_SAVER_PATH}" || -L "${SCREEN_SAVER_PATH}" ]]; then
        rm -Rf "${SCREEN_SAVER_PATH}"
    fi
    ln -s "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" "${SCREEN_SAVER_PATH}"
    

    现在,当您点击Xcode的“运行”按钮时,屏幕保护程序将在桌面上以壁纸模式运行,您可以使用调试器。

答案 2 :(得分:6)

您可以通过执行将加载插件的应用程序来调试插件。

因此,要调试屏幕保护程序,请打开插件项目,从“项目”菜单中选择“新建自定义可执行文件”,然后将应用程序设置为屏幕保护程序引擎。

要调试屏幕保护程序,您可能还想使用第二台Mac并使用remote debugging,这样您的用户界面操作就不会干扰屏幕保护程序。

答案 3 :(得分:3)

有一些Mac OS X应用程序将运行屏幕保护程序:SaverLab,Screenalicious等。 只需在网上找到其中一个并下载它,然后将其设置为目标可执行文件(如Peter N Lewis所说)。

为避免在每次构建后将构建产品复制到'〜/ Library / Screen Savers /',您可以添加自定义构建脚本(注意:我正在使用'/ bin / tcsh -x'作为shell):< / p>

#remove the old screen saver or link
rm -Rf "${SCRIPT_OUTPUT_FILE_0}"

#if this is a debug build…
if ("${CONFIGURATION}" == "Debug" ) then

# create a symbolic link from our screen saver to this users screen saver directory
ln -sfv "${SCRIPT_INPUT_FILE_0}" "${SCRIPT_OUTPUT_FILE_0}"

#if this is a release build…
else if ("${CONFIGURATION}" == "Release" ) then

# copy our screen saver to this users CMM directory
cp -Rfv "${SCRIPT_INPUT_FILE_0}" "${SCRIPT_OUTPUT_FILE_0}"

endif

然后将其输入文件设置为“$ {BUILT_PRODUCTS_DIR} / $ {FULL_PRODUCT_NAME}”,并将其输出文件设置为“$ {HOME} / Library / Screen Savers / $ {FULL_PRODUCT_NAME}”。

现在,当您构建/运行项目时,它将自动魔术链接到您的调试版本或复制您的版本构建。

答案 4 :(得分:3)

您还可以将屏幕保护程序引擎('/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app')作为目标可执行文件并将其传递给-background标志(因此它在所有内容后面而不是在前面运行一切)。

答案 5 :(得分:2)

正如彼得所说,您可以通过执行将加载插件的应用程序来调试插件。

但是,您可以使用系统偏好设置,而不是使用屏幕保护程序引擎。当首选项出现时,导航到“桌面和屏幕保护程序”下的屏幕保护程序以加载插件。

它并不完美,因为您的视图不是全尺寸,但它比设置远程调试更容易。

答案 6 :(得分:1)

不一定是最好的方法,但你可以从另一台机器上ssh并从gdb启动ScreenSaverEngine(未经测试)

修改

另外,您可以尝试添加新的应用程序目标并将您的ScreenSaverView添加到IB中的窗口,您可能需要手动配置设置之类的东西,但它可以帮助一些并且应该可以正常工作,因为ScreenSaverView是NSView的子类

答案 7 :(得分:0)

如果您复制了ScreenSaverEngine应用程序,并使用您的开发者ID进行签名,它将修复系统完整性保护阻止附加调试程序的情况。只需确保将可执行文件设置为您自己签名的副本。

答案 8 :(得分:0)

我想指出@Karl的解决方案最适合我。 但是,如果您像我一样,每晚都重新启动计算机,则可能需要考虑放置:

cp -Rn /System/Library/CoreServices/ScreenSaverEngine.app /tmp

在他的答案中提到的pre-Build shell脚本的开头。这将自动为您执行复制步骤。

(尽管我相信这确实属于评论,但我的XP不够高)