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
.