Как отладить заставку в OS X

Мне было интересно, есть ли какой-нибудь достойный способ, кроме NSLog-ing почти всего, правильно отлаживать пакет приложений Screensaver в OS X?

«Заставка» — это тип проекта в Xcode, но явно нет отладки Build and Go. Кроме того, я обнаружил, что на самом деле мой пакет загружается в

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

приложение как своего рода плагин.

Итак, есть ли достойный способ отладки вашего кода? Просмотр отчетов о сбоях и запись NSLog в консоль помогает, но далеко не идеально.


person Dave Martorana    schedule 09.07.2009    source источник


Ответы (9)


Существует старая статья MacTech, в которой описывается разработка экранной заставки. цикл. В статье также есть часть 2. Посмотрите в разделе "Советы по отладке".

Я нахожу этот метод болезненным, поэтому я написал приложение, базовое приложение состояло из одного окна и контроллера, который инициализировал ScreenSaverView с моей новой заставкой. Как только это заработало, все, что мне нужно было сделать, чтобы проверить изменение, это нажать Command-R в Xcode.

person Mark    schedule 09.07.2009
comment
Фантастическая ссылка! Не знаю, почему я сам не нашел :) - person Dave Martorana; 11.07.2009
comment
Куто — Дэвиду Хиллу за эту статью (x-Apple DTS!) - person geowar; 16.05.2012
comment
Эта статья относится к тому времени, когда MacTech стоило прочитать разработчикам. Я отписался, когда они переключили свое внимание на IT. - person Mark; 16.05.2012
comment
Я был бы рад, если бы кто-нибудь мог публиковать обновленные шаги, потому что последний xcode сильно отличается от настройки:/ - person Tom Roggero; 20.08.2012

Из-за функции защиты целостности системы OS X 10.11 El Capitan отладчик не может подключаться ни к чему, работающему из /System/. Кроме того, другая информация здесь относится к старым версиям Xcode.

Вот как я заработал на El Capitan с Xcode 7.2:

  1. Скопируйте /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app/ в /tmp/. (Поскольку .xcscheme ссылается на полный путь, копирование его в какое-то общее место лучше всего подходит для совместной работы, а не где-то в домашнем каталоге конкретного пользователя.)
  2. Edit the project's .xcscheme:
    • Set the Executable for its Run action to the copied app, and add the arguments: -debug -background -module "<product-name>" (where <product-name> is the bundle name without the .saver extension).
    • Добавьте сценарий Pre-action (источник ниже), с его оболочкой, установленной на /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, экранная заставка будет работать в режиме обоев на рабочем столе, и вы сможете использовать отладчик.

person Community    schedule 21.01.2016
comment
В High Sierra приложение находится по адресу /System/Library/CoreServices/ScreenSaverEngine.app. - person Chad von Nau; 16.01.2019

Вы можете отлаживать плагины, запустив приложение, которое загрузит плагин.

Итак, чтобы отладить заставку, откройте проект вашего плагина, выберите «Новый пользовательский исполняемый файл» в меню «Проект» и установите приложение в качестве механизма заставки.

Для отладки заставки вы также можете использовать второй Mac и использовать удаленная отладка, чтобы ваши действия в пользовательском интерфейсе не мешали хранителю экрана.

person Peter N Lewis    schedule 09.07.2009
comment
Я обнаружил, что на Lion с XCode4 это было сделано путем изменения исполняемого файла схемы на /System/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app. - person iforce2d; 06.01.2012
comment
Я также обнаружил, что вам по-прежнему необходимо устанавливать заставку в системных настройках, как обычно, каждый раз, когда вы меняете ее, но это все же чертовски лучше, чем ждать 3 минуты каждый раз. - person iforce2d; 06.01.2012
comment
Вместо удаленной отладки вы можете передать -background в качестве аргумента командной строки в ScreenSaverEngine, чтобы он работал как ваш рабочий стол… - person geowar; 16.05.2012

Есть несколько приложений для Mac OS X, которые будут запускать хранители экрана: SaverLab, Screenalicious и т. д. Просто найдите одно из них в Интернете, загрузите его, а затем установите в качестве целевого исполняемого файла (как сказал Питер Н. Льюис).

Чтобы избежать копирования продукта сборки в «~/Library/Screen Savers/» после каждой сборки, вы можете добавить собственный скрипт сборки (примечание: я использую «/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}».

Теперь, когда вы создаете/запускаете свой проект, он автоматически волшебным образом связывается с вашей отладочной сборкой или копирует сборку релиза.

person geowar    schedule 12.02.2012

Вы также можете сделать механизм скринсейвера ('/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app') целевым исполняемым файлом и передать ему флаг -background (чтобы он работал за всем, а не перед всем) .

person geowar    schedule 13.05.2013
comment
К сожалению, это не работает в 10.11 El Capitan, поскольку защита целостности системы не позволяет запускать ScreenSaverEngine в отладчике. - person Jay Lieske; 09.12.2015
comment
У меня это работает… возможно, потому что я отключил SIP? - person geowar; 10.12.2015
comment
Правильно, отключение SIP позволяет отлаживать системные приложения, такие как ScreenSaverEngine. Однако я нашел обходной путь: создайте дубликат ScreenSaverEngine.app, скопировав его из иерархии папок /System, а затем установите этот дубликат в качестве целевого исполняемого файла. Дубликат приложения больше не зависит от SIP, поэтому его можно отлаживать с помощью Xcode. - person Jay Lieske; 10.12.2015

Как говорит Питер, вы можете отладить плагин, запустив приложение, которое загрузит плагин.

Однако вместо использования механизма заставки вы также можете использовать системные настройки. Когда появятся настройки, перейдите к заставке в разделе «Рабочий стол и заставка», чтобы загрузить плагин.

Это не идеально, так как ваше представление не будет полноразмерным, но это может быть проще, чем настройка удаленной отладки.

person Gavin Maclean    schedule 18.07.2009
comment
Я использовал этот метод. Отлично работает для моих целей. - person Rob Segal; 04.09.2012
comment
Это то, что я использую (я также использую ведение журнала в файлы из автономных тестовых приложений, чтобы получить правильный код ядра с интенсивным использованием данных). В более поздних версиях Mac OS X и Xcode (например, 10.10 и Xc 7) обратите внимание, что вы просто включаете свои точки останова, подключаетесь к Системным настройкам (меню отладки Xc), щелкаете заставку в списке и вуаля, вы может пройти через ваш источник (при условии, что вы установили отладочную сборку). Вы не можете легко использовать функцию предварительного просмотра для отладки больших экземпляров вашей экранной заставки, учитывая, что она покрывает весь экран. - person jarFlooby; 18.04.2016

не обязательно лучший способ, но вы можете подключиться по ssh с другой машины и запустить ScreenSaverEngine из gdb (не проверено)

изменить:

Кроме того, вы можете попробовать добавить новую цель приложения и добавить свой ScreenSaverView в окно в IB, возможно, вам придется вручную настроить такие вещи, как настройки, но это может помочь некоторым и, вероятно, должно работать нормально, поскольку ScreenSaverView является подклассом NSView

person cobbal    schedule 09.07.2009
comment
Я пытался избежать этого только из-за отсутствия другой машины... - person Dave Martorana; 09.07.2009

Если вы сделаете копию приложения ScreenSaverEngine и подпишете ее своим идентификатором разработчика, это исправит ситуацию, когда защита целостности системы не позволяет подключить отладчик. Просто убедитесь, что исполняемый файл настроен на вашу подписанную копию.

person Trygve    schedule 12.08.2016

Я хотел бы отметить, что решение @Karl сработало для меня лучше всего. Однако, если вы похожи на меня и перезагружаете компьютер каждую ночь, вы можете подумать о том, чтобы поставить:

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

в начале сценария оболочки перед сборкой, упомянутого в его ответе. Это автоматически сделает шаг копирования за вас.

(хотя я считаю, что это действительно относится к комментариям, мой опыт еще недостаточно высок)

person Samuel-IH    schedule 09.04.2019