452 Stimmen

Wie kann man den Methodennamen und die Zeilennummer ausgeben und NSLog bedingt deaktivieren?

Ich mache eine Präsentation über das Debugging in Xcode und würde gerne mehr Informationen über die effiziente Verwendung von NSLog erhalten.

Ich habe vor allem zwei Fragen:

  • gibt es eine Möglichkeit, einfach NSLog die aktuelle Methode Name / Zeilennummer?
  • Gibt es eine Möglichkeit, alle NSLogs vor dem Kompilieren für den Release-Code einfach zu deaktivieren?

13 Stimmen

erste Frage, bei der Favoriten (Sterne) mehr als Upvotes sind... +1..

598voto

diederikh Punkte 25146

Hier sind einige nützliche Makros rund um NSLog, die ich häufig verwende:

#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__)

Das DLog-Makro wird verwendet, um nur Ausgaben zu machen, wenn die DEBUG-Variable gesetzt ist (-DDEBUG in den C-Flags des Projekts für die Debug-Konfiguration).

ALog wird immer Text ausgeben (wie das reguläre NSLog).

Die Ausgabe (z.B. ALog(@"Hello world") ) wird wie folgt aussehen:

-[LibraryController awakeFromNib] [Line 364] Hello world

0 Stimmen

Warum haben Sie ein ##? Ich dachte, es sei zum Zusammenkleben von Argumenten gedacht, aber Sie kleben an nichts.

1 Stimmen

Dies verhindert eine mögliche Makroexpansion der Argumente

0 Stimmen

Das kann bei Makros im Allgemeinen passieren; manche Makros ergeben mehrere Zeilen. Ein weiteres Argument, immer geschweifte Klammern zu verwenden ;-).

142voto

whitneyland Punkte 10275

Ich habe die DLog y ALog von oben, und fügte hinzu ULog die eine UIAlertView Nachricht.

Zusammengefasst:

  • DLog wird wie folgt ausgegeben NSLog nur wenn die DEBUG-Variable gesetzt ist
  • ALog wird immer wie folgt ausgegeben NSLog
  • ULog zeigt die UIAlertView nur wenn die DEBUG-Variable gesetzt ist

    ifdef DEBUG

    define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

    else

    define DLog(...)

    endif

    define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

    ifdef DEBUG

    define ULog(fmt, ...) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"%s\n [Line %d] ", __PRETTY_FUNCTION__, __LINE__] message:[NSString stringWithFormat:fmt, ##__VA_ARGS__] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; }

    else

    define ULog(...)

    endif

So sieht es aus:

Debug UIAlertView

+1 Diederik

0 Stimmen

Ich werde meinen ALog+DLog-Code auch mit ULog erweitern. Sehr nützlich.

0 Stimmen

Dieser Code verursacht eine unbenutzte Variable Fehler in Xcode 5.1, wenn nicht in DEBUG ausgeführt :(

0 Stimmen

Warum enden einige der #define-Anweisungen mit einem Semikolon?

74voto

stefanB Punkte 72857
NSLog(@"%s %d %s %s", __FILE__, __LINE__, __PRETTY_FUNCTION__, __FUNCTION__);

Gibt den Dateinamen, die Zeilennummer und den Funktionsnamen aus:

/proj/cocoa/cdcli/cdcli.m 121 managedObjectContext managedObjectContext

__FUNCTION__ in C++ zeigt verstümmelten Namen __PRETTY_FUNCTION__ zeigt schöne Funktionsnamen, in Kakao sehen sie gleich aus.

Ich bin mir nicht sicher, wie man NSLog richtig deaktiviert, ich habe es getan:

#define NSLog

Und es wurden keine Protokollierungsausgaben angezeigt, aber ich weiß nicht, ob dies irgendwelche Nebenwirkungen hat.

20voto

Hier eine große Sammlung von Debug-Konstanten, die wir verwenden. Viel Spaß.

// Uncomment the defitions to show additional info.

//  #define DEBUG

//  #define DEBUGWHERE_SHOWFULLINFO

//  #define DEBUG_SHOWLINES
//  #define DEBUG_SHOWFULLPATH
//  #define DEBUG_SHOWSEPARATORS
//  #define DEBUG_SHOWFULLINFO

// Definition of DEBUG functions. Only work if DEBUG is defined.
#ifdef DEBUG 

    #define debug_separator() NSLog( @"" );

    #ifdef DEBUG_SHOWSEPARATORS
        #define debug_showSeparators() debug_separator();
    #else
        #define debug_showSeparators()
    #endif

    /// /// /// ////// ///// 

    #ifdef DEBUG_SHOWFULLPATH
        #define debug_whereFull() debug_showSeparators(); NSLog(@"Line:%d : %s : %s", __LINE__,__FILE__,__FUNCTION__); debug_showSeparators(); 
    #else
        #define debug_whereFull() debug_showSeparators(); NSLog(@"Line:%d : %s : %s", __LINE__,[ [ [ [NSString alloc] initWithBytes:__FILE__ length:strlen(__FILE__) encoding:NSUTF8StringEncoding] lastPathComponent] UTF8String ] ,__FUNCTION__); debug_showSeparators(); 
    #endif

    /// /// /// ////// ///// 

    #define debugExt(args,...) debug_separator(); debug_whereFull(); NSLog( args, ##__VA_ARGS__); debug_separator();

    /// /// /// ////// ///// Debug Print Macros

    #ifdef DEBUG_SHOWFULLINFO
        #define debug(args,...) debugExt(args, ##__VA_ARGS__);
    #else
        #ifdef DEBUG_SHOWLINES
            #define debug(args,...) debug_showSeparators(); NSLog([ NSString stringWithFormat:@"Line:%d : %@", __LINE__, args ], ##__VA_ARGS__); debug_showSeparators();
        #else
            #define debug(args,...) debug_showSeparators(); NSLog(args, ##__VA_ARGS__); debug_showSeparators();
        #endif
    #endif

    /// /// /// ////// ///// Debug Specific Types

    #define debug_object( arg ) debug( @"Object: %@", arg );
    #define debug_int( arg ) debug( @"integer: %i", arg );
    #define debug_float( arg ) debug( @"float: %f", arg );
    #define debug_rect( arg ) debug( @"CGRect ( %f, %f, %f, %f)", arg.origin.x, arg.origin.y, arg.size.width, arg.size.height );
    #define debug_point( arg ) debug( @"CGPoint ( %f, %f )", arg.x, arg.y );
    #define debug_bool( arg )   debug( @"Boolean: %@", ( arg == YES ? @"YES" : @"NO" ) );

    /// /// /// ////// ///// Debug Where Macros

    #ifdef DEBUGWHERE_SHOWFULLINFO
        #define debug_where() debug_whereFull(); 
    #else
        #define debug_where() debug(@"%s",__FUNCTION__); 
    #endif

    #define debug_where_separators() debug_separator(); debug_where(); debug_separator();

    /// /// /// ////// /////

#else
    #define debug(args,...) 
    #define debug_separator()  
    #define debug_where()   
    #define debug_where_separators()  
    #define debug_whereFull()   
    #define debugExt(args,...)
    #define debug_object( arg ) 
    #define debug_int( arg ) 
    #define debug_rect( arg )   
    #define debug_bool( arg )   
    #define debug_point( arg )
    #define debug_float( arg )
#endif

0 Stimmen

Wo und wie setzen Sie dies um?

20voto

Rodrigo Punkte 11069

Es gibt einen neuen Trick, der keine Antwort gibt. Sie können verwenden printf stattdessen NSLog . So erhalten Sie ein sauberes Protokoll:

Mit NSLog bekommt man Dinge wie diese:

2011-11-03 13:43:55.632 myApp[3739:207] Hello Word

Aber mit printf erhalten Sie nur:

Hello World

Verwenden Sie diesen Code

#ifdef DEBUG
    #define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
    #define NSLog(...) {}              
#endif

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X