web-dev-qa-db-fra.com

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 tracer des messages lors du débogage d'applications Cocoa. Quel est le meilleur moyen de "tracer" les messages lors du codage dans un environnement de développement iPhone Xcode?

55
Rob Sawyer

Il existe un moyen beaucoup plus pratique de suivre les messages de journal dans Xcode, à l'aide des actions de point d'arrêt.

Sur la ligne de code où vous seriez tenté d’ajouter un printf ou un NSLog, définissez un point d'arrêt, puis cliquez dessus tout en maintenant la touche Ctrl enfoncée, puis choisissez "Modifier le point d'arrêt". Dans la bulle bleue qui apparaît, cliquez sur le bouton + à droite pour ouvrir les Actions du point d'arrêt: alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png

Entrez votre texte de journal ici. Toute expression pouvant être imprimée dans le débogueur peut être utilisée lorsqu'elle est délimitée par des signes @. 

Pour déboguer Objective-C, il est généralement plus utile de choisir "Commande de débogage" dans la fenêtre contextuelle et entrez "po [[méthode d'objet]]" "pour imprimer la chaîne de description d'un objet Objective-C ou le résultat d'un appel de méthode.

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

Avantages de ceci par rapport à NSLog et à printf:

  • C'est à la volée. Vous n'avez pas besoin de Recompiler et de redémarrer pour ajouter ou modifier des messages Log. Cela vous fait gagner beaucoup de temps.
  • Vous pouvez les activer et les désactiver de manière sélective. Si vous en apprenez assez avec un, mais que son spew est une interférence, décochez sa case Enabled.
  • Toutes les sorties sont générées sur votre Mac Jamais sur votre iPhone. Vous n'avez donc pas besoin de télécharger et d'analyser Dans les journaux après coup.
  • Le risque d’expédition de console sur votre application est considérablement réduit de.

Consultez également le bouton Parler; c'est idéal pour le débogage d'applications en plein écran où vous ne pouvez pas voir le journal de débogage. 

214
cdespinosa

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__);
9
Elliot

Dans mon projet, j'ai une solution personnalisée basée sur DebugOutput.m Ceci ajoute le numéro de fichier et de ligne à la sortie de débogage, ce qui facilite l'identification de l'origine du texte de sortie tout en le gardant bref.

J'ai augmenté la solution standard avec un masque de débogage afin de pouvoir activer et désactiver le débogage pour des zones particulières de fonctionnalité de mon application. Dans 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 dans 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 ressemblent à quelque chose comme ceci:

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

Collez ceci dans l'en-tête de votre préfixe. TOUS les journaux du projet disparaîtront à coup sûr.

#ifndef __OPTIMIZE__

#    define NSLog(...) NSLog(__VA_ARGS__)

#else

#    define NSLog(...) {}

#endif
2
Abhishek Bedi

Vous pouvez utiliser NSLogger qui apporte beaucoup plus à la table que la simple journalisation de vos messages. J'utilise des macros pour désactiver les journaux des versions, tout en les laissant actifs dans les versions de débogage. Le volume de journal n’est pas un problème, car NSLogger offre de puissantes options de filtrage des journaux.

0
fpillet