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
- 1. Emacs: metodi per il debug di python
- 2. Debug del ciclo di digest di Angular: come trovare la causa di un ciclo infinito?
- 3. Metodi standard di debug
- 4. Come specificare la posizione del keystore di debug per le build di debug della form Android?
- 5. come trovare la causa di ActiveRecord ROLLBACK
- 6. Qual è la posizione migliore per trovare tutorial sulla fisica nello sviluppo del gioco?
- 7. Trovare la posizione di un elemento in un semplice array
- 8. Come si esegue il debug di un oggetto xml che causa un errore di trasformazione durante la scrittura nella stringa?
- 9. Metodi per il debug dei problemi di NSNotificationCenter?
- 10. Il miglior modulo node.js per trovare la posizione?
- 11. Ciclo di gioco con timer separato per il rendering e logica di gioco
- 12. Come trovare la vera causa di avviso di memoria e come risolvere nell'app per iOS
- 13. Ingresso di un gioco ritmico
- 14. Trovare la posizione dell'elemento max
- 15. Strategia di gioco e strategia di progettazione per un gioco di carte multiplayer
- 16. Trovare la posizione di un elemento in una matrice bidimensionale?
- 17. È possibile eseguire il debug di "Terminato a causa di un errore di memoria"?
- 18. Posizione SkSpriteNode nel gioco universale
- 19. Creazione di un algoritmo per un campo di gioco
- 20. Trovare la posizione del segno di omissione in un TextBox
- 21. Redirect Console.Write ... Metodi per la finestra di uscita di Visual Studio durante il debug
- 22. Un modo per trovare la dimensione e la posizione del riempimento in una struttura?
- 23. Visual Studio 2015, congelamento del condensatore sul debug UnitTests
- 24. Migliori pratiche e strumenti per il debug delle differenze tra le build di debug e release?
- 25. Dove posso trovare immagini gratuite per il gioco?
- 26. chiamando .clear() o .Elimina() in C++ std :: multimap a volte causa di congelamento (100% CPU)
- 27. Descrivere e trovare un bug corrotto dallo stato che causa arresti apparentemente casuali
- 28. Xcode - trovare metodi morti in un progetto
- 29. Il modo migliore per trovare la posizione dell'elemento nell'array non ordinato dopo che è stato ordinato
- 30. Che cos'è un buon gioco che coinvolge la codifica?
Premi il pulsante di pausa nel debugger e controlla se ti dà la posizione di un eventuale deadlock. – Jeremy