【问题标题】:How to debug a Screensaver in OS X如何在 OS X 中调试屏幕保护程序
【发布时间】:2009-07-09 05:10:22
【问题描述】:

我想知道除了 NSLog-ing 几乎所有东西之外,是否有任何体面的方法来正确调试 OS X 中的屏幕保护程序应用程序包?

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

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

应用程序作为某种插件。

那么有没有合适的方法来调试您的代码?查看崩溃报告和 NSLog-ing 到控制台帮助,但这远非完美。

【问题讨论】:

    标签: objective-c xcode macos debugging screensaver


    【解决方案1】:

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

    我觉得这种方法很痛苦,所以我编写了一个应用程序,基本应用程序是一个窗口和一个控制器,它使用我的新屏幕保护程序包初始化 ScreenSaverView。一旦它起作用了,我只需在 Xcode 中按 Command-R 即可测试更改。

    【讨论】:

    • 很棒的链接!我不知道为什么我自己找不到它:)
    • 库托感谢 David Hill 撰写的那篇文章(x-Apple DTS!)
    • 那篇文章来自 MacTech 值得开发者阅读的时候。当他们将注意力转移到 IT 时,我取消了订阅。
    • 如果有人可以发布更新的步骤,我会很高兴,因为最新的 xcode 与设置完全不同:/
    【解决方案2】:

    由于 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 扩展名的包名称)。
      • 添加一个 Pre-action 脚本(源代码如下),其 shell 设置为 /bin/bash,其构建设置来自该方案。它创建一个符号链接到 ~/Library/Screen Savers/ 中构建的 .saver

    来源:

    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 的“运行”按钮时,屏幕保护程序将在您的桌面上以墙纸模式运行,您可以使用调试器。

    【讨论】:

    • 在High Sierra,该应用位于/System/Library/CoreServices/ScreenSaverEngine.app
    • 如果您在附加调试器时遇到问题,这也很有帮助:helpx.adobe.com/uk/photoshop/kb/…
    【解决方案3】:

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

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

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

    【讨论】:

    • 在带有 XCode4 的 Lion 上,我发现这是通过将方案的可执行文件更改为 /System/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app 来完成的
    • 我还发现每次更改屏幕保护程序时仍然需要像往常一样将屏幕保护程序安装到系统偏好设置中,但这仍然比每次等待 3 分钟要好。
    • 您可以将“-background”作为命令行参数传递给 ScreenSaverEngine 以使其作为桌面运行,而不是远程调试...
    【解决方案4】:

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

    为避免在每次构建后将构建产品复制到“~/Library/Screen Savers/”,您可以添加自定义构建脚本(注意:我在 shell 中使用“/bin/tcsh -x”):

    #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}”。

    现在,当您构建/运行项目时,它会自动神奇地链接到您的调试版本或复制您的发布版本。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 不幸的是,这在 10.11 El Capitan 上不起作用,因为系统完整性保护会阻止在调试器中运行 ScreenSaverEngine。
      • 这里对我有用……也许是因为我禁用了 SIP?
      • 对,禁用 SIP 可让您调试 /System 应用程序,例如 ScreenSaverEngine。但是,我确实想出了一个解决方法:通过将 ScreenSaverEngine.app 复制出 /System 文件夹层次结构来复制它,然后将该副本设置为目标可执行文件。应用的复制副本不再受 SIP 约束,因此可以通过 Xcode 进行调试。
      【解决方案6】:

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

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

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

      【讨论】:

      • 我一直在用这个方法。非常适合我的目的。
      • 这就是我使用的(我还使用从独立测试应用程序记录到文件,以正确获取一些数据密集型核心代码)。在最新版本的 Mac OS X 和 Xcode(例如 10.10 和 Xc 7)上,请注意您只需启用断点,“附加”到系统偏好设置(Xc 调试菜单),单击列表中的屏幕保护程序,瞧,您可以单步调试您的源代码(假设您安装了调试版本)。鉴于预览功能覆盖了整个屏幕,您无法轻松地使用预览功能来调试较大的屏幕保护程序实例。
      【解决方案7】:

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

      编辑

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

      【讨论】:

      • 我试图避免这种情况只是因为另一台机器缺乏可用性......
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

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

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

        (虽然我相信这确实属于评论,但我的xp还不够高)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-17
          • 1970-01-01
          • 1970-01-01
          • 2011-03-01
          • 1970-01-01
          相关资源
          最近更新 更多