2009-07-09 12 views
15

Me preguntaba si había alguna forma decente, aparte de NSLog -ing casi todo: ¿depurar correctamente un paquete de aplicaciones de Screensaver en OS X?Cómo depurar un salvapantallas en OS X

El "Salvapantallas" es un tipo de proyecto en Xcode, pero obviamente no hay depuración Build and Go. Además, he encontrado que, de hecho, mi paquete se está cargando en la aplicación

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

como un tipo de complemento.

¿Hay alguna forma decente de depurar el código? Si mira los informes de fallas y NSLog-ing a la consola , ayuda con, pero está lejos de ser perfecto.

Respuesta

10

Hay un artículo antiguo MacTech que describe el ciclo de desarrollo del Protector de pantalla. También hay un Part 2 en el artículo. Consulte la sección "Sugerencias para depurar".

Me parece un problema este método, así que escribí una aplicación, la aplicación básica era una ventana y un controlador que inicializaba un ScreenSaverView con mi nuevo paquete de protector de pantalla. Una vez que eso estuvo funcionando, todo lo que tuve que hacer para probar un cambio fue presionar Command-R en Xcode.

+0

¡Fantástico enlace!No sé por qué no pude encontrarlo :) –

+0

Kuto's to David Hill para ese artículo (x-Apple DTS!) – geowar

+0

Ese artículo es de cuando MacTech valía la pena leer para los desarrolladores. Me dieron de baja cuando cambiaron su enfoque a TI. – Mark

1
no

necesariamente la mejor manera, pero se puede ssh desde otra máquina y lanzar ScreenSaverEngine del BGF (no probado)

edición:

también, podría intentar añadir un nuevo objetivo de aplicación y añadir su ScreenSaverView a una ventana en IB, puede que tenga que configurar manualmente cosas como configuraciones, pero podría ayudar un poco y probablemente debería funcionar bien, ya que ScreenSaverView es una subclase de NSView

+0

Estaba tratando de evitar esto solo por la falta de disponibilidad de otra máquina ... –

6

Puede depurar complementos al ejecutar la aplicación que cargará el enchufe en.

Para depurar un protector de pantalla, abra su proyecto de complemento, elija Nuevo ejecutable personalizado en el menú Proyecto y configure la aplicación para que sea el motor del protector de pantalla.

Para depurar un protector de pantalla, es posible que también desee utilizar una segunda Mac y usar remote debugging para que las acciones de la interfaz de usuario no interfieran con el protector de pantalla.

+0

En Lion con XCode4, encontré que esto se hizo cambiando el ejecutable del esquema a /System/Frameworks/ScreenSaver.framework/ Recursos/ScreenSaverEngine.app – iforce2d

+0

También encontré que todavía necesita instalar el protector de pantalla en las preferencias del sistema como de costumbre cada vez que lo cambie, pero eso es aún mejor que esperar 3 minutos cada vez. – iforce2d

+0

>>> no se puede formatear texto aquí; pasar a una nueva respuesta <<< – geowar

2

Como dice Peter, puede depurar el complemento ejecutando una aplicación que cargará el complemento.

Sin embargo, en lugar de utilizar el motor de protector de pantalla también puede usar las preferencias del sistema. Cuando aparezcan las preferencias, vaya a su salvapantallas en "Escritorio & Protector de pantalla" para cargar su complemento.

No es perfecto ya que su vista no será de tamaño completo, pero puede ser más fácil que configurar la depuración remota.

+0

He estado usando este método. Funciona muy bien para mis propósitos. –

+0

Esto es lo que uso (también uso el registro en archivos, desde aplicaciones de prueba independientes, para obtener algunos códigos básicos de datos intensivos a la derecha). En versiones más recientes de Mac OS X y Xcode (por ejemplo, 10.10 y Xc 7), tenga en cuenta que simplemente habilite sus puntos de interrupción, "adjunte" a las Preferencias del Sistema (menú de depuración Xc), haga clic en su protector de pantalla en la lista y listo , puede recorrer su fuente (suponiendo que haya instalado una versión de depuración). No puede usar fácilmente la función de vista previa para depurar instancias más grandes de su protector de pantalla, dado que cubre toda la pantalla. – jarFlooby

2

Hay algunas aplicaciones de Mac OS X que ejecutarán protectores de pantalla: SaverLab, Screenalicious, etc. Solo encuentra uno de ellos en la web y descárgalo y configúralo como el ejecutable de destino (como dijo Peter N Lewis) .

Para evitar copiar el producto de compilación a '~/Library/ScreenSavers /' después de cada compilación puede agregar un script de compilación personalizado (nota: estoy usando '/ bin/tcsh -x' para el shell):

#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 

continuación, establezca su archivo de entrada a "$ {} BUILT_PRODUCTS_DIR/$ {} FULL_PRODUCT_NAME" y su archivo de salida a "$ {HOME}/Library/Screen Savers/$ {} FULL_PRODUCT_NAME".

Ahora cuando construya/ejecute su proyecto, se vinculará de forma automática a su compilación de depuración o copiará su versión de lanzamiento.

3

También podría hacer que el motor del protector de pantalla ('/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app') sea el ejecutable de destino y pasarle el indicador de fondo (para que funcione detrás de todo en lugar de en frente de todo).

+2

Desafortunadamente, esto no funciona en 10.11 El Capitan porque System Integrity Protection evita ejecutar ScreenSaverEngine dentro del depurador. –

+1

Me está funcionando aquí ... ¿tal vez porque he desactivado SIP? – geowar

+2

A la derecha, deshabilitar SIP le permite depurar/aplicaciones del sistema como ScreenSaverEngine. Sin embargo, me di cuenta de una solución alternativa: hacer un duplicado de ScreenSaverEngine.app copiándolo de la jerarquía de la carpeta/System y luego establecer ese duplicado como el ejecutable de destino. La copia duplicada de la aplicación ya no está sujeta a SIP, por lo que Xcode puede depurarla. –

4

Debido a la función de protección de integridad del sistema de OS X 10.11 El Capitan, el depurador no se puede conectar a nada que se ejecute desde /System/. Además, la otra información aquí se aplica a las versiones anteriores de Xcode.

Así es como lo tengo trabajando en El Capitán con Xcode 7.2:

  1. Copia /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app/-/tmp/. (Dado que el .xcscheme hace referencia a la ruta completa, lo copia a un lugar común que es mejor para la colaboración, en lugar de a un lugar en el directorio personal de un usuario en particular.)
  2. edición del proyecto .xcscheme:
    • Ajuste el ejecutable para ejecutar su acción a la aplicación copiada, y agregar los argumentos: -debug-background-module "<product-name>" (donde <product-name> es el nombre del paquete sin la extensión .saver).
    • Agregue un script de acción previa (fuente a continuación), con su shell configurado en /bin/bash y su configuración de compilación provenga del esquema. Se crea un enlace simbólico a la incorporada .saver bulto en ~/Library/Screen Savers/

Fuente:

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}" 

Ahora, cuando se pulse el botón Ejecutar de Xcode, el protector de pantalla se ejecutará en modo de fondo en su escritorio y puedes usar el depurador

0

Si realiza una copia de la aplicación ScreenSaverEngine y la firma con su ID de desarrollador, se solucionará la situación en la que la Protección de integridad del sistema impide la instalación del depurador. Solo asegúrese de configurar el ejecutable en su propia copia firmada.