2011-11-09 5 views
14

He visto un video de WWDC hoy sobre nuevas funciones en xCode 4. Han mencionado que es una buena idea usar acciones de mensaje de registro en puntos de interrupción junto con "acciones de evaluación automáticamente continuar después habilitadas" para generar el valor de una variable por ejemplo en lugar de usar NSLogs todo el tiempo.cómo crear una acción de mensaje de registro de punto de interrupción en xcode?

Digamos que tengo algo por el estilo:

NSLog(@"URL is : %@", userDocumentsURL); 

¿Cómo voy a escribir una acción de mensaje de registro para mostrar el valor de userDocumentsURL? ¿Es realmente una buena idea utilizar el método anterior en lugar de NSLog?

Respuesta

25

Crea una acción de 'Mensaje de registro' de punto de interrupción. Para el mensaje de registro incluir algo como:

URL is @(char*) [[userDocumentsURL description] UTF8String]@ 

alternativa, se puede crear un punto de interrupción de la acción 'Depurador comando' similar a:

po [NSString stringWithFormat:@"URL is: %@", userDocumentsURL] 

prefiero el uso de acciones de punto de interrupción para el registro, ya que es sin duda más fácil de limpiar a cabo un montón de puntos de interrupción de lo que es para eliminar NSLogs. Una posible desventaja del uso de puntos de ruptura de esta manera es que son significativamente más lentos (durante la depuración) que un NSLog directo.

+4

Me gustaría saber por qué una: el depurador es tan estúpida como para requerir el char * cast, yb: no funciona la mitad del tiempo yc: la documentación de apple no deja en claro que necesita el char * yd: por qué no se queja si las variables no existen para ayudarle a depurar. Compare con los puntos de corte Eclipse para Java que ni siquiera tienen esta característica, por lo que deberían ser mucho más pobres, pero le permiten hackearlo poniendo una impresión en una condición. Esto es molesto de eclipse, pero aún así es mucho más fácil ya que la impresión no requiere un casting especial y se detendrá y le informará sobre los errores – Rhubarb

-3

Observo que la característica editar puntos de interrupción, aunque útil y tal vez moderna, no se compromete con el control de fuente, por lo que no se adapta a un equipo de desarrolladores. Por esta razón, diría que cuando trabaje en un equipo bajo control de código fuente, me apegue al registro basado en código como NSLog.

+4

Creo que sí si selecciona las opciones correctas de compartir en el editor de punto de interrupción. No utilizo esta función por mi cuenta (desarrollador solo), pero las conversaciones de la WWDC indican que compartir se integra con el control de fuente. – mbm29414

+12

En mi opinión, no ser obligado a leer todo el resultado de depuración de otros miembros del equipo es un profesional. No es necesario que limpie el NSLog (o el // antes del NSLog) antes de confirmar. Trabajé en un equipo en el que 1 de cada 10 commits era "eliminación de registro", "agregado más NSLog", "NSLog cambiado para ser más/menos detallado" o cualquier otra cosa relacionada con el registro. –

+0

Me gusta @MatthiasBauch acaba de comentar que esto también podría ser útil.Y, por otro lado, debe saber que hay algunas aplicaciones en las que no desea reiniciar la aplicación, pero le gustaría ver un registro en el depurador, por lo que esta sería la única posibilidad de hacerlo. –

19

Aquí hay una solución similar que usa NSLog, que podría tener menos caracteres que las otras soluciones.

debugger command using NSlog

Sin embargo, a menos que añadir el void así:

po (void)NSLog(@"the person name is: %@", p.name) 

usted recibirá un molesto "nulo" impresa con su registro. por ejemplo:

(lldb) po NSLog(@"foo") 
nil 
2013-06-19 14:42:59.025 TheMove[95864:c07] foo 

(lldb) po (void)NSLog(@"foo") 
2013-06-19 14:43:10.758 TheMove[95864:c07] foo 

Si se puede vivir con el nula (puedo) es más rápido que escribir y más fácil de recordar sólo el po

Cuestiones relacionadas