web-dev-qa-db-fra.com

Empêcher "L'exécution a été interrompue, raison: point d'arrêt d'exception ObjC interne (-3)" sur lldb

J'ai écrit du code qui transfère tous les ivars d'une classe dans un dictionnaire dans l'objectif C. Cela utilise valueForKey: pour obtenir les données de la classe. Parfois, KVC lève une exception interne qui est également capturée correctement - mais cela perturbe la fonctionnalité de lldb et tout ce que j'obtiens est:

erreur: l'exécution a été interrompue, raison: point d'arrêt d'exception ObjC interne (-3) .. Le processus a été remis à l'état avant l'évaluation de l'expression.

Aucun point d'arrêt n'est défini. J'ai même essayé avec -itrue -ufalse comme options d'expression, mais cela ne fait aucune différence. Cela échoue totalement pour ce que je veux utiliser lldb, et cela semble être un problème si minuscule. Comment puis-je apporter clang simplement ignorer s'il existe des exceptions ObjC internes et capturées lors de l'appel d'une méthode?

J'ai essayé cela à la fois dans Xcode et directement via l'appel de clang depuis le terminal et la connexion à un serveur de débogage distant - aucune différence.

20
steipete

J'ai rencontré le même problème. Ma solution était d'envelopper un try/catch autour (j'utilise ce code uniquement pour le débogage). Voir: DALIntrospection.m ligne # 848

NSDictionary *DALPropertyNamesAndValuesMemoryAddressesForObject(NSObject *instance)

Ou, si vous utilisez iOS 7, la méthode d'instance privée _ivarDescription affichera tous les ivars pour vous (des méthodes d'instance similaires sont _methodDescription et _shortMethodDescription).

21
haShalosh

J'ai rencontré le même problème.

Ma solution est simplement alloc init la propriété avant de l'affecter à la valeur qui a provoqué le crash.

4
mollysmile.ye

Moi-même et mes collègues avons rencontré cela aujourd'hui, et nous avons finalement trouvé une solution de contournement en utilisant l'API python python. La méthode manuelle consiste à exécuter script et à saisir:

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

Cela pourrait être intégré à sa propre commande via command script add.

2
Dave Lee