Search code examples
objective-cloggingmacrosnslog

How do you get the variables passed into function using macros (objective c)


Does anyone know how to dynamically get all the variables values passed into a function for the sake of logging ?

I'm looking for a simple way (like using a compiler macro) to be able to log the function, and the variable values passed into it (which will then be written to a log file so we can easily find inputs that cause functions to crash)

I've been trying

#define NFDebug( s, ... ) NSLog( @"DEBUG: %s: %@", __PRETTY_FUNCTION__, \
[NSString stringWithFormat:(@"%@"), ##__VA_ARGS__] )

,which gives everything, BUT the variables values


Solution

  • I use something like this:

    #ifdef YOUR_DEBUG_ENABLER_SYMBOL_ONLY_SET_IN_DEBUG_BUILDS
    #define DEBUG_ONLY(_code_) _code_
    #else
    #define DEBUG_ONLY(_code_)
    #endif
    
    #define DebugLog(_str, ...) DEBUG_ONLY(NSLog(@"%s: " _str, __func__, ## __VA_ARGS__))
    

    Note that there is no comma before the _str in the NSLog - this means the string you use in your calling code is appended (by the compiler) to the "%s: " string to become a composite format string for the NSLog. Whatever parameters you want to print can be included in your passed in format string. The %s applies to the _ _ func _ _ and your _str applies to the rest of the passed in variables:

    float f;
    int i;
    NSString* s;
    // Initialise f, i, and s to something
    ...
    // Log the values only when in debug mode, with function name auto-prepended
    DebugLog(@"float is: %f - int is: %d - string is: %@", f, i, s);
    

    This has the advantage that you can log whatever text and variables you want, conditionally on debug, and with the function name automatically prepended onto the output.