2012-01-19 16 views
8

En XCode Organizer, consola - Puedo leer la salida NSLog, pero no printf(). ¿Es posible leer el resultado printf() en el dispositivo real, lo mismo que en el simulador?Depuración de iPhone dispositivo real

+0

Podría ser útil si explica por qué quiere hacer esto? ¿Por qué necesita usar printf en lugar de NSLog()? ¿Es porque está utilizando una biblioteca que contiene instrucciones printf()? –

+2

Porque la mayor parte de mi código es código C. El universal, funciona bajo windoz, droide, symbian, iOS, etc. y printf() funciona bajo el simulador de iOS, en XCode. – theWalker

Respuesta

17

solución más fácil sería sobrecargar la función printf a nivel mundial en su proyecto y reemplazarlo con salida NSLog

int printf(const char * __restrict format, ...) 
{ 
    va_list args; 
    va_start(args,format);  
    NSLogv([NSString stringWithUTF8String:format], args) ;  
    va_end(args); 
    return 1; 
} 
+0

Sohaib, muchas gracias. Esta solución funciona perfectamente, y puedo dejar todo el código C sin ningún cambio :) – theWalker

+0

@skippy: ¿No debería marcarse esto como la respuesta correcta? – newenglander

+2

¿dónde deberíamos poner este fragmento de código? – Raptor

-1

Skippy, printf() es la declaración de salida para c no para Objective C, SO en el dispositivo real también printf() no funciona.

+0

Objective-C es un superconjunto estricto de C, por lo que printf() funciona mucho como está documentado. Pero NSLog() detrás de las escenas hace más que printf(), que podría ser la razón por la cual Skippy está teniendo problemas. –

+0

Creo que el problema es que printf imprime en stdout, mientras que NSLog imprime en stderr. –

+2

Nick, fprintf (stderr, formato, args); no funciona bajo la consola de XCode Organizer. – theWalker

4

Puede ejecutar el siguiente comando para imprimir sólo a la consola del dispositivo:

syslog(LOG_WARNING, "log string"); 

Usted también necesitará #include <sys/syslog.h> para syslog y LOG_WARNING para declararse explícitamente

+0

Puede usar los códigos de registro estándar sin declararlos explícitamente Creo que – wxs

+0

Sí, como he dicho, syslog y LOG_WARNING están explícitamente declarados en sys/syslog.h (el nombre de la inclusión no era visible debido al uso incorrecto de < and >) –

+0

Activado iOS 10 stdout se está enviando a Xcode, por lo que ya no se necesita syslog. –

8

As Nick Lockwood dijo en uno de los comentarios anteriores, printf imprime a stdout pero NSLog imprime a stderr. Puede usar fprintf para imprimir en stderr (la consola de Xcode) en lugar de usar printf, así:

fprintf(stderr, "This prints to the Xcode debug console"); 
+0

simple y funciona con obj-C++;) –

+0

parece que no funciona en C++ para iOS – Sergei

+0

@Sergei funciona para mí ahora, en XCode 9.2. Observe que NSLog agrega información adicional a la salida como prefijo. Sin embargo, fprintf solo registra lo que pasa como parámetro. Además, fprintf no imprime \ n por sí mismo. –

Cuestiones relacionadas