我想知道是否有任何不错的方法,除了NSLog-ing几乎所有东西 - 在OS X中正确调试Screensaver应用程序包?
“屏幕保护程序”是Xcode中的项目类型,但显然没有Build and Go调试。此外,我发现实际上我的包已经加载到
/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app
应用程序作为某种插件。
那么调试代码有一个不错的方法吗?查看崩溃报告和NSLoging到控制台帮助,但它远非完美。
答案 0 :(得分:14)
有一篇旧的MacTech文章介绍了屏幕保护程序的开发周期。文章还有一个Part 2。请查看“调试提示”部分。
我觉得这个方法很痛苦所以我编写了一个应用程序,基本的应用程序是一个窗口和一个控制器,用我的新屏幕保护程序包初始化了ScreenSaverView。一旦这个工作正常,我必须做的就是测试一个改变是在Xcode中命中了Command-R。
答案 1 :(得分:7)
由于OS X 10.11 El Capitan的系统完整性保护功能,调试器无法连接到从/System/
运行的任何内容。此外,此处的其他信息适用于旧版本的Xcode。
以下是我使用Xcode 7.2开发El Capitan的方法:
/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app/
复制到/tmp/
。 (由于.xcscheme引用了完全限定的路径,因此将其复制到公共场所最适合协作,而不是特定用户主目录中的某个位置。).xcscheme
:
-debug
-background
-module "<product-name>"
(其中<product-name>
是不带{.saver
的包名称1}}扩展)。/bin/bash
,其构建设置来自该方案。它会在.saver
~/Library/Screen Savers/
包的符号链接
来源:
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不够高)