web-dev-qa-db-fra.com

Que signifie SEGV_ACCERR?

J'examine quelques plantages qui ont tous le signal SIGSEGV avec la raison SEGV_ACCERR. Après avoir recherché SEGV_ACCERR, la chose la plus proche que j'ai trouvée à une explication lisible par l'homme est: Autorisations non valides pour l'objet

Qu'est-ce que cela signifie dans un sens plus général? Quand surviendrait un SEGV_ACCERR? Existe-t-il une documentation plus spécifique sur cette raison?

27
Saltymule

C'est une erreur que j'ai principalement vue sur les appareils iOS 64 bits et peut se produire si plusieurs threads lisent et modifient une variable sous ARC. Par exemple, j'ai corrigé un plantage aujourd'hui où plusieurs threads d'arrière-plan lisaient et utilisaient une variable statique NSDate et NSString et les mettaient à jour sans effectuer de verrouillage ou de mise en file d'attente.

L'utilisation d'objets de données de base sur plusieurs threads peut également provoquer ce plantage, comme je l'ai vu à plusieurs reprises dans mes journaux de plantage.

J'utilise également Crittercism, et ce crash particulier était un SEGV_ACCERR qui ne concernait que les appareils 64 bits.

17
jjxtra

Comme indiqué dans la page de manuel de sigaction, SEGV_ACCERR est un code de signal pour SIGSEGV qui spécifie Autorisations non valides pour l'objet mappé . Contrairement à SEGV_MAPERR qui signifie que l'adresse n'est pas mappée à un objet valide, SEGV_ACCERR signifie que l'adresse correspond à un objet, mais à coup sûr ce n'est ni la bonne, ni celle à laquelle le processus est autorisé à accéder.

3
germinolegrand

J'ai vu cela dans des cas où le code essaie de s'exécuter à partir d'endroits autres que "texte".

Par exemple, si votre pointeur pointe vers une fonction dans le tas ou la pile et que vous essayez d'exécuter ce code (à partir du tas ou de la pile), le CPU lève cette exception.

2
Sameer