J'ai pu enregistrer mon propre port mach pour capturer les exceptions mach dans mes applications et il fonctionne parfaitement lorsque je cible 32 bits. Toutefois, lorsque je cible 64 bits, mon gestionnaire d'exceptions catch_exception_raise()
est appelé mais le tableau de codes d'exception transmis au gestionnaire a une largeur de 32 bits. Cela est prévu dans une version 32 bits, mais pas dans 64 bits.Gestion des exceptions mach dans l'application 64 bits OS X
Dans le cas où je prends EXC_BAD_ACCESS
le premier code est le numéro d'erreur et le deuxième code devrait être l'adresse de la faute. Comme le second code a une largeur de 32 bits, les 32 bits élevés de l'adresse de défaillance de 64 bits sont tronqués.
Je trouve un drapeau dans <mach/exception_types.h>
je peux passer task_set_exception_ports()
appelé MACH_EXCEPTION_CODES
qui, de regarder les sources Darwin semble contrôler la taille des codes transmis au gestionnaire. On dirait qu'il est destiné à être corrigé avec le comportement transmis à task_set_exception_ports()
.
Cependant lorsque je fais cela et déclenche une exception, mon port mach est notifié, j'appelle exc_server()
mais mon gestionnaire n'est jamais appelé, et quand le message de réponse est renvoyé au noyau, je reçois le comportement d'exception par défaut.
Je vise le SDK 10.6. J'aimerais vraiment que Apple documente mieux ce genre de choses. Quelqu'un a des idées?
Je me demande si cela a plus à voir avec le noyau que vous utilisez; vous obtiendrez des exceptions 32 bits sous le noyau 32 bits et des exceptions 64 bits sous le noyau 64 bits? Le noyau 32 bits est toujours le noyau par défaut sur 10.6, mais si vous avez un Mac assez récent, vous pouvez l'essayer ... –
Le noyau 32 bits est entièrement conscient de 64 bits et passera soit 64 bits ou 32 bits exceptions -bit à une application. Tout dépend de la façon dont votre application demande et les gère. –