2009-07-09 25 views
15

Mi chiedevo se esistesse un modo decente, diverso da quello di NSLog, quasi tutto, per eseguire correttamente il debug di un pacchetto di app Screensaver in OS X?Come eseguire il debug di un salvaschermo in OS X

Lo "Screensaver" è un tipo di progetto in Xcode, ma non c'è ovviamente alcun debug Build and Go. Inoltre, ho scoperto che in realtà il mio pacco è sempre caricato all'applicazione

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

come una sorta di plugin.

Quindi c'è un modo decente per eseguire il debug del codice? Guardare i rapporti di crash e NSLoging alla console aiuta, ma è tutt'altro che perfetto.

risposta

10

C'è un vecchio articolo MacTech che descrive il ciclo di sviluppo di Screen Saver. C'è anche un Part 2 per l'articolo. Cerca nella sezione "Suggerimenti per il debug".

Trovo che questo metodo sia un problema, quindi ho scritto un'applicazione, l'applicazione di base era una finestra e un controller che inizializzava ScreenSaverView con il mio nuovo pacchetto di salvaschermo. Una volta che ha funzionato tutto quello che dovevo fare per testare una modifica è stato premere Command-R in Xcode.

+0

Link fantastico!Non so perché non sono riuscito a trovarlo da me :) –

+0

Kuto's to David Hill per quell'articolo (x-Apple DTS!) – geowar

+0

Questo articolo deriva da quando MacTech valeva la pena di essere letto dagli sviluppatori. Ho annullato la sottoscrizione quando hanno spostato il focus su IT. – Mark

1
non

necessariamente il modo migliore, ma si potrebbe ssh da un'altra macchina e lanciare ScreenSaverEngine da gdb (non testato)

modificare:

Inoltre, si potrebbe provare ad aggiungere un nuovo target di applicazione e aggiungere il tuo ScreenSaverView a una finestra in IB, potrebbe essere necessario configurare manualmente cose come le impostazioni, ma potrebbe aiutare alcuni e dovrebbe funzionare probabilmente come ScreenSaverView è una sottoclasse di NSView

+0

Stavo cercando di evitarlo solo a causa della mancanza di disponibilità di un'altra macchina ... –

6

È possibile eseguire il debug dei plugin eseguendo l'applicazione che verrà caricato la spina in.

Quindi per eseguire il debug di uno screensaver, aprire il progetto del plugin, scegliere Nuovo Eseguibile personalizzato dal menu Progetto e impostare l'applicazione come motore dello screensaver.

Per eseguire il debug di uno screensaver, si potrebbe anche voler utilizzare un secondo Mac e utilizzare remote debugging in modo che le azioni dell'interfaccia utente non interferiscano con lo screensaver.

+0

Su Lion con XCode4, ho scoperto che ciò avveniva cambiando l'eseguibile dello schema in /System/Frameworks/ScreenSaver.framework/ Risorse/ScreenSaverEngine.app – iforce2d

+0

Ho anche scoperto che è necessario installare il salvaschermo nelle preferenze di sistema come al solito ogni volta che lo si cambia, ma è comunque una vista dannatamente migliore dell'attesa di 3 minuti ogni volta. – iforce2d

+0

>>> non è possibile formattare il testo qui; passa a una nuova risposta <<< – geowar

2

Come dice Peter, è possibile eseguire il debug del plug-in eseguendo un'applicazione che carica il plug-in.

Tuttavia, anziché utilizzare il motore di screensaver è possibile utilizzare anche le preferenze di sistema. Quando vengono visualizzate le preferenze, accedi al salvaschermo in "Desktop & Screen Saver" per caricare il plug-in.

Non è perfetto in quanto la visualizzazione non sarà completa, ma può essere più semplice dell'impostazione del debug remoto.

+0

Ho usato questo metodo. Funziona alla grande per i miei scopi. –

+0

Questo è quello che uso (utilizzo anche la registrazione in file, da app di test indipendenti, per ottenere un codice core intensivo di dati corretto). Nelle versioni più recenti di Mac OS X e Xcode (ad esempio, 10.10 e Xc 7), si noti che è sufficiente abilitare i punti di interruzione, "collegare" a Preferenze di sistema (menu debug Xc), fare clic sul proprio salvaschermo nell'elenco e voilà , puoi passare attraverso la tua fonte (supponendo che hai installato una build di debug). Non è possibile utilizzare facilmente la funzione di anteprima per eseguire il debug di istanze più grandi dello screen saver, dato che copre l'intero schermo. – jarFlooby

2

Esistono alcune app per Mac OS X che eseguono screen saver: SaverLab, Screenalicious, ecc. Basta trovarne uno sul Web e scaricarlo e impostarlo come eseguibile di destinazione (come diceva Peter N Lewis) .

Per evitare di copiare il prodotto build in ~ ~/Library/Screen Savers/'dopo ogni generazione è possibile aggiungere uno script di build personalizzato (nota: sto utilizzando'/bin/tcsh -x 'per la 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 

impostarne il file di input per "$ {} BUILT_PRODUCTS_DIR/$ {} FULL_PRODUCT_NAME" e il suo file di output a "$ {HOME}/libreria/Risparmiatori dello schermo/$ {} FULL_PRODUCT_NAME".

Ora, quando costruisci/esegui il tuo progetto, si collegherà automaticamente alla tua build di debug o copierà la build di rilascio.

3

È anche possibile creare il motore di screensaver ('/System/Library/Framework/ScreenSaver.framework/Resources/ScreenSaverEngine.app') il file eseguibile di destinazione e passarlo il flag -background (in modo che venga eseguito dietro tutto anziché in davanti a tutto).

+2

Sfortunatamente, questo non funziona su 10.11 El Capitan perché System Integrity Protection impedisce l'esecuzione di ScreenSaverEngine all'interno del debugger. –

+1

Qui sta lavorando per me ... forse perché ho disabilitato SIP? – geowar

+2

Giusto, disabilitare SIP ti consente di eseguire il debug/app di sistema come ScreenSaverEngine. Tuttavia, ho individuato una soluzione alternativa: creare un duplicato di ScreenSaverEngine.app copiandolo dalla gerarchia di cartelle/System, quindi impostare tale duplicato come eseguibile di destinazione. La copia duplicata dell'app non è più soggetta a SIP, quindi può essere sottoposta a debug da Xcode. –

4

A causa della funzione di protezione dell'integrità del sistema di El Capitan di OS X 10.11, il debugger non può collegarsi a qualsiasi elemento che vada da /System/. Inoltre, le altre informazioni qui si applicano alle vecchie versioni di Xcode.

Ecco come ho ottenuto che funziona su El Capitan con Xcode 7.2:

  1. Copia /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app/-/tmp/. (Dal momento che l'.xcscheme fa riferimento al percorso completo, copiandolo in un posto comune che è meglio per la collaborazione, invece che da qualche parte nella directory home di un particolare utente.)
  2. Modifica del progetto .xcscheme:
    • Impostare l'eseguibile per l'azione Esegui sull'app copiata e aggiungere gli argomenti: -debug-background-module "<product-name>" (dove <product-name> è il nome del bundle senza l'estensione .saver).
    • Aggiungere uno script di pre-azione (fonte di seguito), con la sua shell impostata su /bin/bash e le relative impostazioni di build provenienti dallo schema. Si crea un collegamento simbolico al costruita .saver fascio in ~/Library/Screen Savers/

Fonte:

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

Ora, quando si preme il pulsante Run di Xcode, lo screen saver verrà eseguito in modalità sfondo del desktop e puoi usare il debugger.

0

Se si esegue una copia dell'app ScreenSaverEngine e si firma con l'ID sviluppatore, si risolve la situazione in cui System Integrity Protection impedisce l'associazione del debugger. Assicurati di impostare l'eseguibile sulla tua copia firmata.

Problemi correlati