objective-c lldb

objective c - Impedir "Se interrumpió la ejecución, razón: punto de interrupción de excepción ObjC interno(-3)" en lldb



objective-c (3)

He escrito algún código que vuelca todos los ivars de una clase en un diccionario en el Objetivo C. Esto usa valueForKey: para obtener los datos de la clase. A veces, KVC lanza una excepción interna que también se captura correctamente, pero esto interrumpe la función de lldb y todo lo que obtengo es:

error: se interrumpió la ejecución, motivo: punto de interrupción de la excepción ObjC interna (-3). El proceso se ha devuelto al estado anterior a la evaluación de la expresión.

No hay puntos de interrupción establecidos. Incluso probé con -itrue -ufalse como opciones de expresión, pero eso no hace una diferencia. Esto es totalmente derrotado por lo que quiero usar lldb, y parece un problema tan pequeño. ¿Cómo puedo hacer que el Clang simplemente ignore si hay excepciones internas de ObjC capturadas al llamar a un método?

Intenté esto tanto desde Xcode, como directamente a través de una llamada desde el terminal y conectándome a un servidor de depuración remoto, sin ninguna diferencia.


Me encontré con el mismo problema. Mi solución fue envolver un try/catch a su alrededor (solo uso este código para la depuración). Ver: DALIntrospection.m line # 848

NSDictionary *DALPropertyNamesAndValuesMemoryAddressesForObject(NSObject *instance)

O, si está ejecutando en iOS 7 , el método de instancia privada _ivarDescription imprimirá todos los ivars para usted (los métodos de instancia similares son _methodDescription y _shortMethodDescription ).


Me encontré con el mismo problema.

Mi solución es simplemente alloc init la propiedad antes de asignarla al valor que causó el bloqueo.


Yo y mis compañeros de trabajo nos encontramos con esto hoy, y finalmente encontramos una solución alternativa utilizando la API python de lldb. La forma manual es ejecutar el script , y entrar:

options = lldb.SBExpressionOptions() options.SetTrapExceptions(False) print lldb.frame.EvaluateExpression(''ThisThrowsAndCatches()'', options).value

Esto podría ser empaquetado en su propio comando a través de la command script add .