2016-03-06 1 views
1

Mon programme OSX plante avec EXC_BAD_ADDRESS avec le code EXEC_I386_GPFLT.Que signifie le code EXEC_I386_GPFLT lorsque le programme se bloque avec EXC_BAD_ADDRESS

Je n'ai aucun message d'habitude comme aucun sélecteur trouvé ...

Le programme fonctionnait avant, je viens de changer le système d'appel. C'était un gestionnaire de raccourci auto-fabriqué, j'utilise maintenant MASShorcut.

Je suspecte un problème de threading et je pense que je vais résoudre le problème avec dispatch_xx block. Donc, la vraie question est: que signifie EXEC_I386_GPFLT?

func saveFile() { 
    // crashes on following line 
    let savePanel = NSSavePanel(contentRect: NSRect(), styleMask: NSTitledWindowMask, backing: NSBackingStoreType.Buffered, `defer`: true) 
    savePanel.canCreateDirectories = true 
    ... 

The stack trace when it crashes

Répondre

1

EXEC_I386_GPFLT est une erreur de protection générale . Cela signifie généralement que votre application a essayé de déréférencer une adresse qui ne se limitait pas à une partie illisible de la mémoire, mais qui est extravagante et fait référence à quelque chose qui ne peut pas être de la mémoire (sur un système 64 bits, il n'y a pas 64 bits d'espace adressable car certains bits sont utilisés comme métadonnées dans certains contextes, par exemple.)

Étant donné que le plantage et l'appel sont sur le thread principal, cela ne ressemble pas à un problème de threading (au moins, pas avec la preuve donnée).

Généralement, vous créez un panneau de sauvegarde avec NSSavePanel(). Étant donné qu'il s'écrase dans alloc/init, je suggère de passer à la manière standard de créer un.

+0

Le remplacement de la construction par simplement 'let savePanel = NSSavePanel()' l'a fait fonctionner. Crash bizarre à mon humble avis. – Xvolks

+0

@Xvolks Crash très étrange. Je suggère de déposer un rapport de bug. – bbum