55 votes

Comment déboguer avec NSLog (@ "Inside of the iPhone Simulator")?

Je suis habitué à programmer et à faire en sorte que les messages du journal soient visibles. Je sais que vous pouviez utiliser NSLog() pour retracer les messages lors du débogage des applications Cocoa. Quel est le meilleur moyen de "tracer" les messages lors du codage dans un environnement de développement iPhone Xcode?

214voto

cdespinosa Points 14277

Il y a une manière beaucoup plus pratique pour tracer avec des messages de log dans Xcode, et c'est à l'aide de point d'arrêt Actions.

Sur la ligne de code où tu serais tenté d'ajouter un printf ou NSLog, définissez un point d'arrêt, puis ctrl-cliquez dessus et choisissez "Modifier le point d'arrêt". Dans le bleu de la bulle qui s'affiche, cliquez sur le bouton + sur la droite pour ouvrir le point d'arrêt Actions: alt text

Entrer votre texte. Toute expression qui peut être imprimé dans le Débogueur peut être utilisé lors de la délimité par le signe@.

Pour le débogage Objective-C, il est généralement plus utile de choisir "Débogueur de Commande" à partir de la liste déroulante et entrez 'po [[méthode de l'objet de la méthode]]' pour imprimer de la chaîne de description de l'Objectif-C, l'objet ou le résultat d'un appel de méthode.

Assurez-vous de cliquer "Continuer", la case à cocher en haut à droite de sorte que l'exécution se poursuit après le journal.

Les avantages de ce NSLog et de printf:

  • C'est à la volée. Vous n'avez pas à recompilez et redémarrer à ajouter ou à modifier les messages du journal. Cela vous permet d'économiser beaucoup de temps.
  • Vous pouvez l'activer de manière sélective et de les désactiver. Si vous apprendre assez d'une, mais ses spew est interférer, il suffit de décocher son Permis la boîte.
  • La sortie est généré sur votre Mac, jamais sur l'iPhone, de sorte que vous n'avez pas à télécharger et analyser dans les journaux après le fait.
  • Le hasard de la navigation de la console de vomir dans votre application de manière significative a diminué.

Consultez également le bouton Parler, c'est génial pour le débogage d'une application en plein écran où vous ne pouvez pas voir le journal de débogage.

9voto

Elliot Points 2237

Voici un bon morceau de code que j'ai ramassé quelque part sur le Web. Il définit les nouvelles fonctions DLog () et ALog (). Les messages DLog n'apparaissent que lorsque l'application est compilée avec un indicateur -DDEBUG (define DEBUG). ALOG messages TOUJOURS apparaissent (même en mode Libération).

 // DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
#       define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#       define DLog(...)
#endif

// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
 

5voto

Jane Sales Points 10895

Dans mon projet j'ai une solution personnalisée basée sur DebugOutput.m Ce qui ajoute le fichier et le numéro de ligne à la sortie de débogage, le rendant plus facile à identifier d'où la sortie de ce texte, tout en gardant toujours brève.

J'ai augmenté la solution standard avec un masque de débogage, de sorte que je peux passer de débogage sur et en dehors pour les zones de fonctionnalité dans mon application. En Debug.h, j'ai

typedef enum {
kDebugMaskAp- = 1,
kDebugMaskXMLParser = 1 << 1,
kDebugMaskNetwork = 1 << 2,
kDebugMaskAnalytics = 1 << 3,
kDebugMaskCache = 1 << 4,
} debugBitMask;

#define debugForComponent(mask,format,...) if( currentDebugMask() & mask) [[DebugOutput sharedDebug]  output:__FILE__ lineNumber:__LINE__ input:(format), ##__VA_ARGS__]

Et en Debug.m

-(void)output:(char*)fileName lineNumber:(int)lineNumber input:(NSString*)input, ...
{
  va_list argList;
  NSString *filePath, *formatStr;

  // Build the path string
  filePath = [[NSString alloc] initWithBytes:fileName length:strlen(fileName) encoding:NSUTF8StringEncoding];

  // Process arguments, resulting in a format string
  va_start(argList, input);
  formatStr = [[NSString alloc] initWithFormat:input arguments:argList];
  va_end(argList);

  // Call NSLog, prepending the filename and line number
  NSLog(@"File:%s Line:%d %@",[((DEBUG_SHOW_FULLPATH) ? filePath : [filePath lastPathComponent]) UTF8String], lineNumber, formatStr);

  [filePath release];
  [formatStr release];
}

Dans l'application, les appels à ressembler à quelque chose comme ceci:

debugForComponent(kDebugMaskApp,@"Request failed - error %@", [error localizedDescription]);

2voto

Abhishek Bedi Points 967

Collez ceci dans votre en-tête de préfixe. Tous les journaux du projet vont disparaître à coup sûr.

0voto

fpillet Points 146

Vous pourriez utiliser NSLogger qui apporte beaucoup plus à la table de journalisation juste vos messages. J’ai utiliser des macros pour désactiver les journaux dans les versions release, tout en laissant chacun d'entre eux active dans les versions debug. Le volume du journal n’est pas un problème, en tant que NSLogger offre de puissantes options de filtrage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X