2013-12-15 7 views
6

ho utilizzato il profiler di guardare fuori per le perdite di memoria e sono imbattuto in questo problema:iOS: come identificare la perdita dagli strumenti Xcode?

enter image description here

sono passato a chiamare Albero.

Così ho potuto fare clic su di esso per saperne di più su di esso:

enter image description here

Ma in realtà non mi darà alcun indizio. Come dovrei sapere cosa stava causando la perdita?

enter image description here

UPDATE:

  • l'albero chiamata con librerie di sistema indicato è aggiornato sopra.
  • informazioni sugli oggetti trapelata:

enter image description here

  • qualche descrizione di ciò che si fa in app per riprodurre questa perdita:

La nostra applicazione è la sincronizzazione con il nostro resto- API all'avvio (primo piano) dell'app. Funziona sempre con iOS 7/iPhone 4S. Ma un altro sviluppatore ha iOS7/iPhone 5 e gira raramente nel problema che non si sincronizza. Dopo 10 giorni di osservazione e mettendo NSLogs ovunque, abbiamo trovato questo la scorsa notte:

Dec 15 03:18:58 appname[4801] <Warning>: A gateway to the host server is working via WWAN. 
Dec 15 03:18:58 appname[4801] <Warning>: Syncing... 
Dec 15 03:18:58 appname[4801] <Warning>: Eventname to be fired: f11-reachability 
Dec 15 03:18:58 appname[4801] <Warning>: Sync event IOS_REACHABILITY reached. 
Dec 15 03:18:58 appname[4801] <Warning>: Sync: IOS_SYNC_WITH_SERVER is true 
Dec 15 03:18:58 appname[4801] <Warning>: Animating indicator... 
Dec 15 03:18:58 appname[4801] <Warning>: Getting last timestamp: 1387003344.407783 then calling syncWithServerWithDate 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilecal[0x45fb]) Exited: Killed: 9 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (com.apple.afcd) Idle-exit job was jettisoned. Will bypass throttle interval for next on-demand launch. 
Dec 15 03:19:27 com.apple.launchd[1] <Error>: (com.apple.afcd) assertion failed: 11B554a: launchd + 35697 [3C91C465-EFA6-32C7-A677-DD0B5FDEE0DC]: 0x9 
Dec 15 03:19:27 com.apple.launchd[1] <Notice>: (com.apple.absd) Idle-exit job was jettisoned. Will bypass throttle interval for next on-demand launch. 

Un terzo tentativo di sincronizzare (premendo il pulsante di casa e tornare a primo piano) ci ha dato questo, che ha indicato un basso di memoria:

Dec 15 03:25:18 C1 appname[4801] <Warning>: Getting last timestamp: 1387003344.407783 then calling syncWithServerWithDate 
Dec 15 03:25:29 C1 profiled[6244] <Notice>: (Note) profiled: Service stopping. 
Dec 15 03:25:40 C1 crash_mover[6248] <Notice>: (Warn) <crash_mover.m mv_recursive:98> Moving './LowMemory-2013-12-14-160222.plist' -> '/var/mobile/Library/Logs/CrashReporter/LowMemory-2013-12-14-160222.plist' 

Quindi ho pensato di dare il profiler e vedere se trovo qualcosa.

Per riprodurlo, ho avviato l'app, sono andato alla schermata Home, quindi ho premuto il Simulate a Low Memory e poi ho fatto clic sull'app per tornare in primo piano. Questo è dove ottengo il picco rosso.

  • quale versione Xcode stai utilizzando.

Xcode 5.02. iOS 7.04 su iPhone 4S (OK), iPhone 5 (caso edge rare)

Spero che questo aiuti. Grazie

+0

Tutte quelle piccole scatole a sinistra sotto il "Call Tree" voce .. Io di solito trovare cliccando tutti loro produce risultati molto più leggibile. –

+0

Quando hai simulato manualmente l'avviso di memoria, hai manifestato l'errore di sincronizzazione riscontrato dal tuo collega? – Rob

risposta

2

Man mano che appare minaccioso come il picco rosso in Perdite, la memoria totale trapelata è 1,06 kb, il che è estremamente improbabile che sia la fonte (e nemmeno il relativo) problema.

In termini di app che ha come risultato il jettisoning di altre app, questo, di per sé, non è un problema e sarei meno preoccupato di questo (anche se, per essere un buon cittadino, dovresti davvero cercare di minimizzarlo).Il problema funzionale più immediato è il motivo per cui la tua app non riesce a sincronizzarsi e se questo è realmente il risultato di un avviso di memoria all'interno dell'app stessa (o, più precisamente, un errore della tua app a risorse sufficientemente libere in risposta a un avviso di memoria, risultante nelle successive allocazioni di memoria fallire).

Nella mia mente, la prima domanda è se ricevi davvero degli avvisi di memoria nella tua app. In generale, mi piacerebbe vedere qualcosa di simile a quanto segue nella console se l'applicazione in realtà ha avuto un avviso di memoria:

 
Dec 15 11:12:26 Robs-iPad myapp[2224] : Received memory warning. 

Ma non vedo quanto sopra nei vostri discariche console, quindi mi domando se si' sta davvero ricevendo avvisi di memoria.

Potrei suggerire di inserire la registrazione esplicita nella vostra applicazione delegato:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
{ 
    NSLog(@"%s", __FUNCTION__); 

    // free whatever caches or other temporary resources you can here 
} 

o mettere in gestione speciale nel controller della vista:

- (void)didReceiveMemoryWarning 
{ 
    NSLog(@"%s", __FUNCTION__); 

    [super didReceiveMemoryWarning]; 

    // do whatever you want to free resources here 

    [[[UIAlertView alloc] initWithTitle:nil 
           message:@"didReceiveMemoryWarning" 
           delegate:nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil] show]; 
} 

Ciò si tradurrebbe nel vedere quanto segue in mia console:

 
Dec 15 11:12:26 Robs-iPad myapp[2224] : -[AppDelegate applicationDidReceiveMemoryWarning:] 
Dec 15 11:12:26 Robs-iPad myapp[2224] : -[ViewController didReceiveMemoryWarning] 

Ma l'obiettivo chiave è quello di confermare se sei veramente ar e ricevere avvisi di memoria e se ciò è realmente correlato alla mancata sincronizzazione della tua app.

Ma supponiamo per un secondo che il problema sia, in effetti, il risultato di un avviso di memoria. Questo porta a due domande: in primo luogo, cosa stai facendo per mitigare gli avvertimenti di memoria in primo luogo (es. Usando @autoreleasepool per mitigare il high-water mark, senza conservare grandi risorse in memoria allo stesso tempo se non assolutamente necessario, usando imageWithContentsOfFile piuttosto che imageNamed)? Secondo, cosa stai facendo in risposta agli avvertimenti sulla memoria (ad esempio, stai eliminando le cache, ecc.)?

Quindi, se confermi che l'avviso di memoria è veramente la fonte del problema (e lo fai prima), allora potrebbe essere interessante guardare il grafico delle assegnazioni durante un processo di sincronizzazione (e confermare il numero di picco di byte live, così come il numero finale di byte live). Osservando il grafico delle allocazioni nella tua domanda, non sembra troppo male (cioè senza oscillazioni), ma poi, di nuovo, non hai condiviso con noi il numero di "byte live", quindi è difficile dirlo.

Ma sicuramente non mi preoccuperei di questa perdita di 1kb quando si simula un avviso di memoria. È più un fastidio che qualsiasi sintomo serio di cui devi preoccuparti. Tieni d'occhio le perdite, ma concentrati su (a) grandi perdite; e (b) quelli nel tuo codice, non nel framework.


La mia risposta originale, di seguito, era in risposta alla domanda originale, che era semplicemente "ciò che viene mostrato da strumenti che non sembrano corrispondere al mio codice questa perdita". Terrò qui per riferimento:


Questo potrebbe suggerire che la perdita non è nel codice, ma piuttosto nei quadri di sistema (che hai nascosto).

Si potrebbe desiderare di condividere:

  • l'albero chiamata con librerie di sistema indicati;

  • informazioni sugli oggetti trapelato (quindi, non solo l ' "albero di chiamata", ma le "fughe di notizie" lista, troppo);

  • qualche descrizione di ciò che si fa in app per riprodurre questa perdita;

  • quali versioni di iOS si vede questo problema si manifestano, e quali versioni non lo fanno (i framework non sono privi di perdite, ma varia a seconda del target iOS); e

  • quale versione Xcode si sta eseguendo.

Francamente, si potrebbe finire per ignorare questo problema dato (a) la dimensione trascurabile della perdita; (b) la mancanza di indicazione che il problema riposa nel codice; e (c) il fatto che i framework iOS hanno perdite fuori dal tuo controllo. Ma se sei preoccupato, condividi alcune delle informazioni di cui sopra e potremmo essere in grado di offrire ulteriori osservazioni.

+0

Grazie Rob. Ho aggiornato la domanda e fornito tutto ciò che hai richiesto. Dopo 10 giorni di caccia per questo insetto, siamo un po 'in uno stato di disperazione. Spero che tu possa indicarci qualcosa qui. :) – Houman

+0

@Hooman ho ampliato la mia risposta, ma insomma, non è chiaro per me che il problema è legato ad una memoria di avvertimento (ed è quasi certamente estraneo alla perdita 1kb). Apparentemente la tua app causerà il disinnesto di altre app, ma non mostrerai alcuna evidenza di avviso di memoria. E anche se fosse il risultato dell'ammonimento della memoria, se hai liberato risorse, dovresti vedere le allocazioni diminuire un po '(altrimenti l'app verrebbe molto probabilmente bloccata se non stai risolvendo la situazione che ha provocato l'avviso di memoria) . L'app si arresta in modo anomalo o non si sincronizza? – Rob

Problemi correlati