tipos objective entre diferencias datos apple objective-c xcode debugging breakpoints

objective c - objective - ¿Cómo establecer un punto de interrupción condicional en Xcode basado en una propiedad de cadena de objetos?



swift apple (5)

Así es como se hace usando XCode lldb conditional breakpoints.

En primer lugar, haga doble clic en el punto de interrupción (o haga clic con el botón derecho en edit breakpoint ), puede ver un cuadro emergente de diálogo.

Esto es lo que significan esas opciones:

  1. Condición : el punto de interrupción solo se disparará en esta condición.
  2. Ignorar : la cantidad de veces que la condición debe cumplirse antes de disparar el punto de interrupción
  3. Acción : acción que se ejecuta después de que se rompe el punto de interrupción.
  4. Opciones : continuar automáticamente después de evaluar acciones

Aquí hay un resumen. Para el ejemplo anterior en imagen, significa que cuando la variable buildingId es igual a 13, rompa aquí. Si agrego tiempo de ignorar a 1, entonces ignorará la primera vez cuando buildingId sea ​​igual a 13 y se rompa en la segunda vez que se cumple la condición.

Para acciones, cuando presiona agregar acciones, habrá una lista de opciones. Usualmente lo que hago es usar el Debugger Command po de po para imprimir las variables que necesito verificar y creo que hay mejores formas de usar las acciones que yo.

Parece que tienes que recompilar y ejecutar la aplicación si cambias las condiciones en tiempo de ejecución

Estoy buscando poder hacer que el depurador se rompa cuando alcanza una coincidencia de cadena en particular. Como ejemplo, podría tener algo como esto:

Foo myObj = [self gimmeObj];

myObj podría tener una propiedad llamada name . Quiero que el depurador se detenga en la tarea cuando

[myObj.name isEqualToString:@"Bar"];

¿Cómo puedo configurar mi punto de interrupción condicional en Xcode para hacer eso?


En ocasiones, cuando se trabaja con Frameworks (compilaciones de depuración) y se necesita poner un punto de interrupción en cierto archivo / ubicación que es difícil de navegar o no está expuesto públicamente en el marco en desarrollo. Una opción es escribir una clase de ayuda para desencadenar puntos de interrupción condicionales y facilitar el acceso y la salida.

- (void)invokeFrameworkMethod { ... [DebugConditionalBreakPointHelper breakPointCondition:YES comment:@"from invokeFrameworkMethod."]; ... }

Declaración de encabezado en el marco en desarrollo.

#import <Foundation/Foundation.h> @interface DebugConditionalBreakPointHelper : NSObject + (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment; @end

Y archivo de implementación:

#import "DebugConditionalBreakPointHelper.h" @implementation DebugConditionalBreakPointHelper + (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment { if (enabled) { NSLog(@"Triggerred Conditional Break Point. Comment: %@"); } } @end


No estoy seguro de si esto funcionará, pero puede intentar establecer un punto de interrupción en esa línea de código, abrir la consola del depurador (Cmd + Shift + R) y escribir

condition N (int)[[myObj name] isEqualToString:@"Bar"]

Donde N se reemplaza por el número del punto de corte (un número entero).


Puede establecer un punto de interrupción condicional en Xcode estableciendo el punto de interrupción normalmente, luego haga clic en él y seleccione Editar punto de interrupción (elija Ejecutar -> Mostrar -> Puntos de interrupción).

En la entrada del punto de interrupción, hay una columna Condición.

Ahora, hay varias cuestiones a tener en cuenta para la condición. En primer lugar, gdb no entiende la sintaxis de puntos, por lo que en lugar de myObj.name, debe usar [myObj name] (a menos que el nombre sea un ivar).

A continuación, como con la mayoría de las expresiones en gdb, debe indicarle el tipo de resultado de la devolución, a saber, "BOOL". Así que establece una condición como:

(BOOL)[[myObj name] isEqualToString:@"Bar"]

A menudo, en realidad es más fácil hacer esto en el código agregando código temporalmente como:

if ( [myObj.name isEqualToString:@"Bar"] ) { NSLog( @"here" ); }

y luego estableciendo el punto de ruptura en NSLog. Entonces su condición puede ser arbitrariamente compleja sin tener que preocuparse por lo que gdb puede y no puede analizar.


Si muta myObj.name utilizando setter, puede agregar un punto de corte simbólico en -[MyObjClass setName:] desde la consola del depurador o desde el menú Ejecutar-> Administrar puntos de interrupción-> Agregar punto de interrupción simbólico en Xcode. Si no (¿por qué no? Probablemente no debería modificar la variable de instancia directamente, excepto en el inicializador designado o dealloc) puede establecer un punto de observación en gdb (use la consola del depurador en Xcode una vez que se esté ejecutando el depurador). This página explica cómo. No creo que Xcode exponga una interfaz de usuario para establecer puntos de observación sin usar la consola del depurador.