2014-02-27 13 views
5

Zunächst einmal habe ich einige Threads über CocoaLumberjack gelesen und ich habe nicht in der Lage Lösung auf diese Frage zu finden:CocoaLumberjack Log App Absturz

ich CocoaLumberjack bin mit meiner App anmelden. Aber ich möchte die App auch abstürzen lassen.

Ich habe dies versucht:

void uncaughtExceptionHandler(NSException *exception) { 
    DDLogError(@"CRASH: %@", exception); 
    DDLogError(@"Stack Trace: %@", [exception callStackSymbols]); 
    // Internal error reporting 

    // Send log to SOA 

} 

Aber ich bin immer diesen Fehler in der AppDelegate, funktioniert in anderen Orten auch:

Use of undeclared identifier '_cmd'; did you mean 'dcmd'?

Gibt es eine andere Möglichkeit, dies zu tun ?.

Antwort

11

_cmd ist eine Verknüpfung für den aktuellen Selektor oder Objective-C-Methode, die aufgerufen wird. Zum Beispiel in einer Klasse, die eine Methode, wie diese umgesetzt:

@implementation MDAppController 

- (void)applicationWillFinishLaunching:(NSNotification *)notification { 
    NSLog(@"[%@ %@]", NSStringFromClass([self class]), 
          NSStringFromSelector(_cmd)); 
} 

@end 

wäre es ausdrucken:

[MDAppController applicationWillFinishLaunching:]

Sie laufen in Probleme versuchen DDLogError() zu verwenden, um von innerhalb dieser uncaughtExceptionHandler() Funktion, weil es ist eine C-Funktion und keine Objective-C-Methode, daher ist _cmd undefiniert.

Sie sollten DDLogCError() anstelle von DDLogError() verwenden, da ersteres für C-Funktionen und nicht für Objective-C-Methoden vorgesehen ist.

+0

Wow, Danke für die Antwort, du warst richtig !. Jetzt funktioniert es perfekt und der Fehler ist in meinem Protokoll gedruckt :) –

6

in einer C-Funktion gibt es keine versteckten self, und keine versteckten _cmd, aber keine Angst ...

gibt es eine Familie von Protokollierungsfunktionen für Sie:

#define DDLogCError(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_ERROR, ddLogLevel, LOG_FLAG_ERROR, 0, frmt, ##__VA_ARGS__) 
#define DDLogCWarn(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_WARN, ddLogLevel, LOG_FLAG_WARN, 0, frmt, ##__VA_ARGS__) 
#define DDLogCInfo(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_INFO, ddLogLevel, LOG_FLAG_INFO, 0, frmt, ##__VA_ARGS__) 
#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, ddLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__) 

ähnlich wie NSAssert vs NSCAssert

2

Yeap, Sie sollten DDLogC * für jetzt verwenden. In der nächsten Version (2.0) funktioniert DDLogError sowohl für Obj-c-Methoden als auch für C-Funktionen.