2012-03-29 5 views
5

La mia app si arrestava in modo anomalo solo quando non funzionava con il debugger XCode. È stato difficile tenere traccia perché non riesco a eseguire il debug, ma alla fine l'ho capito. Era a causa del rilascio di chiamate su qualche oggetto che non apparteneva a me. Prima ho corretto che ho cercato e trovato 2 domande relative qui (link qui sotto)iOS si blocca solo quando NON è in esecuzione tramite XCode. Concidence?

iOS App Crashes when running by itself on device, does not crash when running through Xcode using debugger, or in simulator

iPhone crash only when device not connected to xcode, how to understand the crash log?

Nessuno di domanda di cui sopra ha risposto perché nessun crash quando si esegue tramite debugger.So la mia domanda è: perché succede ? Conosco i motivi per il debug/rilascio di crash specifici, ma questo è pazzesco. È per caso anche se è successo più di 10 volte.

+0

Hai provato la creazione di profili con Zombi abilitati? – CodaFi

+0

No, ma l'ho capito esaminando il metodo dealloc che sto inviando un messaggio di rilascio a un oggetto zombi. – msk

risposta

2

Quello che descrivi non è atipico di oscuri bug relativi alla memoria. Potresti anche voler usare debug-malloc in questi momenti. Anche se non è garantito trovare tutto. La ragione (e sta accadendo probabilmente fino a quando ci sono stati i debugger a livello di codice sorgente) è che la memoria è presentata almeno in qualche modo in modo diverso nel codice di debugging e quando è in esecuzione sotto il debugger. Quindi l'errore si traduce in un diverso pezzo di memoria (innocuo) danneggiato quando si trova sotto il debugger. Quando non è sotto il debugger, la posizione danneggiata è in realtà qualcosa a cui il tuo codice importa e si blocca.

Lo stesso potrebbe accadere in senso inverso, ma non si potrebbe mai sapere - se si blocca quando viene eseguito il debugging, lo si troverà prima di passare all'esecuzione all'esterno dell'ambiente di debug.

0

Ho riscontrato questo problema durante l'accesso ai database SQLite dall'esterno della directory [[NSBundle mainBundle] resourcePath], che ha causato errori di iCloud.

Ho scoperto l'errore solo installando Console sul mio iPhone che ha registrato gli errori.

http://itunes.apple.com/us/app/console/id317676250

Una volta entrati nel database dalla directory corretta, gli errori sono scomparsi e l'applicazione caric correttamente.

0

Ho riscontrato questo sintomo quando ho creato una NSString, inviato una UTF8String da essa a un altro oggetto e assegnata a un puntatore char. Bene, si è scoperto che ho dimenticato di mantenere l'NSString originale, che non avrebbe avuto importanza in ogni caso, poiché non sono riuscito a capire che il metodo UTF8String (che presumibilmente è un oggetto che dà accesso al puntatore stesso) opera nella autorelease piscina. Cioè, mantenere la stessa NSString non ha risolto il problema.

Suppongo che questo sembra funzionare correttamente se collegato al debugger solo perché ho attivato zombi, quindi il puntatore che avevo era ancora valido. Dovrei vedere se questa è la ragione per cui ha funzionato; se è così, questa è una buona ragione per testare con e senza NSZombie abilitato.

In ogni caso, questo era probabilmente un progetto scadente, e un errore di gestione della memoria newbie abbastanza ovvio una volta trovato. Fortunatamente la console nella finestra Organizer mi ha dato alcuni suggerimenti su dove iniziare a cercare, e il debug in definitiva mi ha mostrato dove stava cambiando il valore del mio puntatore. Spero che questo aiuti chiunque trovi la strada qui.

0

Avevo anche questo problema e ho avuto la fortuna di capire la causa rapidamente, spero che postando qui potrei salvare qualcun altro un po 'di tempo perso. Per chiarire, la mia app funzionava senza problemi quando veniva lanciata direttamente da XCode, ma si bloccava immediatamente quando veniva avviata manualmente sull'iPad.

L'app in questione è scritta in Obj-C ma si basa su un codice di terze parti scritto in Swift. Il codice Swift è incluso nell'app come framework incorporato. Ho dovuto impostare "Contenuto incorporato contiene codice Swift" su Sì nelle impostazioni di compilazione per l'app (in Opzioni di creazione), quindi il problema è andato via.

Problemi correlati