2009-09-03 11 views
8

Xcode/obiettivo c in realtà non stampa una traccia di stack utile. La mia app si blocca da qualche parte, e quella dannata cosa mi dà solo numeri come 45353453, 34524323, 6745345353, 457634524234. Non utile affatto.Un modo semplice per stampare la traccia dello stack corrente di un'app?

Quindi voglio creare un NSLog(); all'inizio di ogni metodo che ho nella mia intera app. Ma forse c'è un modo più semplice per scoprire la traccia reale dello stack, umanamente leggibile? Non solo in caso di avvio o di arresto delle app, ma sempre, in ogni attività che si verifica? Aiuterebbe il debug molto.

+0

è possibile seguire l'analisi dello stack nel debugger, si dovrebbe prendere l'ultima chiamata al metodo prima del crollo penso – Daniel

+0

No, le informazioni del debugger non sono davvero utili. –

+1

Perché le informazioni sul debugger non sono utili? Se si avvia l'applicazione nel debugger e si arresta in modo anomalo, il debugger dovrebbe presentare una traccia di stack piacevole che è possibile tornare indietro per visualizzare ciascuna riga chiamata. Se la tua applicazione si ferma su un'eccezione, vedi la risposta di alex_c su come eseguirne il debug. –

risposta

1

Non c'è davvero un modo per farlo in modo affidabile all'interno dell'app. Se la tua app si arresta in modo anomalo e non genera simboli, sembra che tu stia eseguendo una versione di rilascio ridotta e non la versione di debug?

Se si dispone della versione unstripped seduti intorno, è possibile correlare tra questi numeri e il nome effettivo dello stack frame utilizzando il comando atos (vedi man atos nel Terminale o cercare atos nella documentazione di Xcode o Google).

Probabilmente non si desidera registrare lo stack di ogni chiamata di metodo. Il volume di informazioni diventerebbe rapidamente schiacciante. E non dovrebbe essere un mistero il motivo per cui la maggior parte dei metodi della tua app vengono chiamati (anche se ci vorrà un po 'per capire perché l'interfaccia tra UIKit e la tua app funzioni come fa).

4

Qualcosa di simile potrebbe essere utile anche a voi


@implementation UIApplication (MyCategory) 

+ (void)logStackTrace { 
    @try { 
     [[NSException exceptionWithName:@"Stack Trace" reason:@"Testing" userInfo:nil] raise]; 
    } 
    @catch (NSException *e) { 
     NSLog(@"%@", [e callStackSymbols]); 
    } 
} 

@end 
+8

Questo è utile prima di iOS 4. Usa [NSThread callStackSymbols] per iOS 4+. –

Problemi correlati