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
risposta
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.
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
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
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).
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. –
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
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
Premi il pulsante di pausa nel debugger e controlla se ti dà la posizione di un eventuale deadlock. – Jeremy