¿Qué es SEGV_MAPERR?

Respuestas:

197

Hay dos tipos comunes de SEGV , que es un error que resulta de un acceso a memoria no válido:

  1. Se accedió a una página que tenía los permisos incorrectos. Por ejemplo, era de solo lectura, pero su código intentó escribir en él. Esto se informará como SEGV_ACCERR .
  2. Se accedió a una página que ni siquiera está asignada al espacio de direcciones de la aplicación. Esto a menudo será el resultado de eliminar la referencia a un puntero nulo o un puntero que se corrompió con un valor entero pequeño. Esto se informa como SEGV_MAPERR .

La documentación de un tipo (código fuente indexado de Linux) para SEGV_MAPERR está aquí: http://lxr.free-electrons.com/ident?i=SEGV_MAPERR .

ahcox
fuente
8
¿Por qué se marca stackoverflow.com/a/1000010/358475 como la respuesta cuando esta es más completa y útil?
OldPeculier
2
La pregunta y otras respuestas son mucho más antiguas que mi respuesta. Edité la otra respuesta para mejorarla al menos.
ahcox
Sería interesante conocer las circunstancias que los diferencian de los tipos de excepción EXC_BAD_ACCESS. por ejemplo, ¿la página está mapeada pero no asignada (/ desasignada recientemente)?
Bobjt
6
Un ejemplo de SEGV_MAPERRdesbordamiento de pila (sin juego de palabras). : D
Antti Haapala
2
Hay incluso más tipos de SEGV: elixir.free-electrons.com/linux/latest/source/include/uapi/…
tomasz
40

Es una falla de segmentación. Lo más probable es que se trate de un problema de puntero colgante o algún tipo de desbordamiento de búfer.

SIGSSEGV es la señal que lo termina en función del problema, falla de segmentación.

Compruebe si hay punteros colgando, así como el problema de desbordamiento.

Habilitar los volcados de memoria le ayudará a determinar el problema.

Sev
fuente