it-swarm.com.de

Wie debugge ich mit NSLog (@ "Im Inneren des iPhone Simulators")?

Ich bin es gewohnt, zu programmieren und Protokollnachrichten sichtbar zu machen. Ich weiß, dass Sie in der Lage waren, NSLog() zum Nachverfolgen von Nachrichten beim Debuggen von Cocoa-Anwendungen einzusetzen. Was ist der beste Weg, um Nachrichten beim Codieren in einer iPhone Xcode-Entwicklungsumgebung zu "verfolgen"?

55
Rob Sawyer

Es gibt eine weitaus bequemere Möglichkeit, Protokollnachrichten in Xcode zu verfolgen, und zwar mit Haltepunktaktionen.

Setzen Sie in der Codezeile, in der Sie versucht wurden, eine printf oder ein NSLog hinzuzufügen, einen Haltepunkt, klicken Sie dann mit der rechten Maustaste darauf und wählen Sie "Haltepunkt bearbeiten". Klicken Sie in der blauen Blase auf die Schaltfläche +, um die Haltepunktaktionen zu öffnen: alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png

Geben Sie dort Ihren Protokolltext ein. Jeder Ausdruck, der im Debugger gedruckt werden kann, kann verwendet werden, wenn er durch @ -Zeichen getrennt wird. 

Für das Debuggen von Objective-C ist es im Allgemeinen sinnvoller, "Debugger-Befehl" aus dem Popup auszuwählen und "po [[Objektmethode] Methode]" einzugeben, um den Beschreibungsstring eines Objective-C-Objekts oder das Ergebnis eines Methodenaufrufs zu drucken.

Klicken Sie oben rechts auf das Kontrollkästchen "Weiter", um die Ausführung nach dem Protokoll fortzusetzen.

Vorteile gegenüber NSLog und printf:

  • Es ist im fluge Sie müssen nicht Neu kompilieren und neu starten, um -Protokollnachrichten hinzuzufügen oder zu bearbeiten. Dies erspart Ihnen viel Zeit.
  • Sie können sie selektiv aktivieren und deaktivieren. Wenn Sie genug Von einem erfahren haben, aber dessen Ausbruch Interferiert, deaktivieren Sie das Kontrollkästchen Enabledbox.
  • Die gesamte Ausgabe wird auf Ihrem Mac generiert, niemals auf dem iPhone. Daher müssen Sie Nicht herunterladen und die Protokolle anschließend nicht über Protokolle analysieren.
  • Die Wahrscheinlichkeit des Versandes von Konsolen-Spewin Ihrer Anwendung ist signifikant Gesunken.

Schauen Sie sich auch die Speak-Taste an. Es eignet sich hervorragend zum Debuggen von Vollbild-Apps, bei denen das Debug-Protokoll nicht angezeigt wird. 

214
cdespinosa

Hier ist ein großartiger Code, den ich irgendwo im Web gefunden habe. Es definiert die neuen Funktionen DLog () und ALog (). DLog-Nachrichten werden nur angezeigt, wenn die App mit dem Flag -DDEBUG (DEBUG definieren) kompiliert wird. ALog-Meldungen werden IMMER angezeigt (auch im Freigabemodus).

// 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

In meinem Projekt habe ich eine angepasste Lösung basierend auf DebugOutput.m . Dies fügt die Datei- und Zeilennummer zur Debug-Ausgabe hinzu, wodurch es einfacher wird, den Ursprung dieses Ausgabetextes zu identifizieren, während er dennoch kurz gehalten wird.

Ich habe die Standardlösung um eine Debug-Maske erweitert, sodass ich das Debugging für bestimmte Funktionsbereiche in meiner App ein- und ausschalten kann. In Debug.h habe ich

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__]

Und in 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];
}

In der Anwendung sehen Aufrufe in etwa so aus:

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

Fügen Sie dies in Ihren Präfix-Header ein. ALLE Protokolle aus dem Projekt werden sicher verschwinden.

#ifndef __OPTIMIZE__

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

#else

#    define NSLog(...) {}

#endif
2
Abhishek Bedi

Sie könnten NSLogger verwenden, was weitaus mehr zur Folge hat als nur das Protokollieren Ihrer Nachrichten. Ich verwende Makros, um Protokolle in Release-Builds zu deaktivieren, während jeder einzelne davon in Debug-Builds aktiv bleibt. Das Protokollvolumen ist kein Problem, da NSLogger leistungsstarke Protokollfilteroptionen bietet.

0
fpillet