¿Cómo debo depurar con NSLog(@ "Inside of the iPhone Simulator")?
objective-c cocoa (6)
Aquí hay un gran código que recogí en algún lugar de la web. Define nuevas funciones DLog () y ALog (). Los mensajes DLog solo aparecen cuando la aplicación se compila con un indicador -DDEBUG (define DEBUG). Los mensajes ALOG SIEMPRE aparecen (incluso en modo Release).
// 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__);
Estoy acostumbrado a programar y tener mensajes de registro visibles. Sé que solía poder utilizar NSLog()
para rastrear mensajes al depurar aplicaciones Cocoa. ¿Cuál es la mejor manera de "rastrear" mensajes cuando se codifica en un entorno de desarrollo de iPhone Xcode?
En mi proyecto, tengo una solución personalizada basada en DebugOutput.m Esto agrega el número de archivo y línea a la salida de depuración, por lo que es más fácil identificar de dónde proviene el texto de salida, sin dejar de ser breve.
Aumenté la solución estándar con una máscara de depuración, de modo que puedo activar y desactivar la depuración para áreas particulares de funcionalidad en mi aplicación. En Debug.h, tengo
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__]
Y en 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];
}
En la aplicación, las llamadas se ven así:
debugForComponent(kDebugMaskApp,@"Request failed - error %@", [error localizedDescription]);
Hay una manera mucho más conveniente de rastrear con los mensajes de registro en Xcode, y eso es mediante el uso de Acciones de punto de interrupción.
En la línea de código en la que estaría tentado de agregar un printf o NSLog, establezca un punto de interrupción, luego haga clic y haga clic en "Editar punto de interrupción". En la burbuja azul que aparece, haz clic en el botón + de la derecha para abrir las Acciones de punto de interrupción: alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png
Ingrese su texto de registro allí. Cualquier expresión que pueda imprimirse en el Depurador se puede usar cuando está delimitada por signos @.
Para depurar Objective-C generalmente es más útil elegir "Comando del depurador" en la ventana emergente e ingresar el método po [[método de objeto]] para imprimir la cadena de descripción de un objeto Objective-C o el resultado de una llamada a un método.
Asegúrese de hacer clic en la casilla de verificación "Continuar" en la parte superior derecha para que la ejecución continúe después del registro.
Ventajas de esto sobre NSLog y printf:
- Está sobre la marcha. No es necesario volver a compilar y reiniciar para agregar o editar mensajes de registro. Esto le ahorra mucho tiempo.
- Puede habilitarlos y deshabilitarlos de manera selectiva. Si aprendes lo suficiente de uno, pero su arrojo está interfiriendo, simplemente desmarca la casilla Habilitado.
- Toda la salida se genera en su Mac, nunca en el iPhone, por lo que no tiene que descargar y analizar los registros después de los hechos.
- La posibilidad de enviar spew de la consola en su aplicación se reduce significativamente.
También mira el botón Hablar; es genial para depurar aplicaciones de pantalla completa donde no se puede ver el registro de depuración.
Pega esto en tu encabezado de prefijo. TODOS los registros del proyecto desaparecerán con seguridad.
#ifndef __OPTIMIZE__
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...) {}
#endif
Puede usar NSLogger que aporta mucho más a la mesa que el simple registro de sus mensajes. Utilizo macros para deshabilitar registros en compilaciones de lanzamiento, dejando cada uno de ellos activo en compilaciones de depuración. El volumen de registro no es un problema, ya que NSLogger ofrece potentes opciones de filtrado de registros.
Simplemente uso la funcionalidad de reemplazar todo ...
Deshabilito todas mis declaraciones NSLog reemplazando NSLog (@ "con // *** NSLog (@"
De esa manera, simplemente puedo encontrarlo (usando find en todos los archivos de proyecto) con // *** NSLog (@ "y volver a habilitarlos
Nada lujoso pero funciona :)