2013-04-19 10 views
7

Recentemente mi sono imbattuto in un errore che non riesco a capire. Il gioco che sto sviluppando usando Cocos2D si congela a un certo punto casuale - ottiene un SIGSTOP - e non riesco a trovare il motivo. Quale strumento posso usare (e come lo uso) per scoprire dove si verifica l'errore e che cosa lo sta causando?Metodi di debug per trovare la posizione e l'errore che causa il congelamento di un gioco

+2

Premi il pulsante di pausa nel debugger e controlla se ti dà la posizione di un eventuale deadlock. – Jeremy

risposta

8

Jeremy's suggestion fermarsi nel debugger è buono.

C'è un modo molto rapido per indagare su un blocco (o qualsiasi problema di prestazioni), specialmente quando non è facile da riprodurre. Devi avere un terminale a portata di mano (quindi devi essere eseguito nel simulatore iOS o su Mac OS X, non su un dispositivo iOS).

Quando il blocco si verifica un salto ad un terminale ed eseguire:

 
sample YourProgramName 

(. Se ci sono spazi nel nome di programma avvolgere che tra virgolette come sample "My Awesome Game") L'uscita di sample è un registro che mostra dove il vostro il programma sta spendendo tempo e se il tuo programma è effettivamente bloccato, sarà abbastanza ovvio quali funzioni sono bloccate.

+0

Oh, grazie mille per la risposta, ci proverò. Sto ancora cercando di riprodurre l'errore, ma si verifica quando ancora, da quello che hai detto. Ancora una volta, grazie per la risposta! – Allan

+1

Ho fatto quello che dici e ho trovato il problema. C'è un loop in uno dei miei metodi, ma lo strano è il debuger non puntato su di esso quando mi sono fermato e questo ha reso difficile trovare l'errore. Grazie per tutto! – Allan

1

Non sono d'accordo con Aaron Golden's answer sopra come l'esecuzione su un dispositivo è estremamente utile per avere uno scenario reale di dove si blocca l'applicazione. Il simulatore ha più memoria e non riproduce l'hardware del dispositivo in modo accurato (ad esempio, il frame rate è in alcuni casi inferiore).

"Ovviamente", è necessario collegare il dispositivo (con un profilo sviluppatore) su Xcode e guardare il terminale della console per cercare le tracce suggerite dall'utente @AaronGolden.

Se questi non sono sufficienti, è possibile attivare un punto di interruzione generale di eccezione in Xcode per acquisire più messaggi di stacktrace.

Quando ho iniziato a imparare Cocos2D, la mia app spesso si interrompeva. Questa è una lista delle cause più comuni:.

  • non stavo usando fogli sprite e, quindi, il frame rate era caduta drammaticamente
  • stavo usando troppa memoria (troppi sprite ad alta definizione con uno sguardo TexturePacker e l'uso pvr.ccz o il formato pvr.gz; taglia allocazione di memoria a metà)

Usa instruments nel proprio profilo app per avvisi di memoria (per esempio, guardate strumenti di allocazione e cercare avvisi di memoria).

+0

Perché hai messo il mio nome in citazioni spaventose? In ogni caso, il problema sembra essere che l'OP non può riprodurre il problema su richiesta, e può essere frustrante correre con gli strumenti ogni volta solo nel caso in cui si verifichi l'errore * questa * volta. Ecco perché ho detto di essere pronto per passare al terminale ed eseguire il campione. Se OP * può * riprodurre correttamente il problema, allora Strumenti è la strada giusta da percorrere, ma perché hai suggerito lo strumento di allocazione? Sicuramente i profiler del tempo sono lo strumento più applicabile per un problema generico di hang/slow. –

+0

Sto facendo come dici tu, usa texture packer per tutti i miei sprite (pvr.ccz). Proverò quello che hai menzionato! Grazie per la risposta, lo apprezzo davvero. – Allan

+0

Se l'App si blocca, potrebbe essere causa di un "sovraccarico di sistema" e si pensa che l'allocazione della memoria possa influire, ma potrebbe essere errata – mm24

Problemi correlati