Was ist SEGV_MAPERR?

Antworten:

190

Es gibt zwei gängige Arten von SEGV. Dies ist ein Fehler, der auf einen ungültigen Speicherzugriff zurückzuführen ist:

  1. Es wurde auf eine Seite zugegriffen, die die falschen Berechtigungen hatte. ZB war es schreibgeschützt, aber Ihr Code hat versucht, darauf zu schreiben. Dies wird als SEGV_ACCERR gemeldet .
  2. Es wurde auf eine Seite zugegriffen, die überhaupt nicht dem Adressraum der Anwendung zugeordnet ist. Dies ist häufig auf die Dereferenzierung eines Nullzeigers oder eines Zeigers zurückzuführen, der mit einem kleinen ganzzahligen Wert beschädigt wurde. Dies wird als SEGV_MAPERR gemeldet .

Eine Dokumentation einer Art (indizierter Linux-Quellcode) für SEGV_MAPERR finden Sie hier: http://lxr.free-electrons.com/ident?i=SEGV_MAPERR .

ahcox
quelle
8
Warum wird stackoverflow.com/a/1000010/358475 als Antwort markiert, wenn diese vollständiger und hilfreicher ist?
OldPeculier
2
Die Frage und andere Antworten sind viel älter als meine Antwort. Ich habe die andere Antwort bearbeitet, um sie zumindest zu verbessern.
Ahcox
Es wäre interessant, die Umstände zu kennen, die diese von den Ausnahmetypen EXC_BAD_ACCESS unterscheiden. zB ist die Seite zugeordnet, aber nicht zugeordnet (/ kürzlich freigegeben)?
Bobjt
5
Ein Beispiel hierfür SEGV_MAPERRist der Stapelüberlauf (kein Wortspiel beabsichtigt). : D
Antti Haapala
39

Es ist ein Segmentierungsfehler. Höchstwahrscheinlich ein Problem mit baumelnden Zeigern oder eine Art Pufferüberlauf.

SIGSSEGV ist das Signal, das es basierend auf dem Problem Segmentierungsfehler beendet.

Suchen Sie nach baumelnden Zeigern sowie nach dem Überlaufproblem.

Durch Aktivieren von Core Dumps können Sie das Problem ermitteln.

Sev
quelle