Co to jest SEGV_MAPERR?


Odpowiedzi:


200

Istnieją dwa popularne rodzaje SEGV , które są błędami wynikającymi z nieprawidłowego dostępu do pamięci:

  1. Uzyskano dostęp do strony, która miała nieprawidłowe uprawnienia. Np. Był tylko do odczytu, ale Twój kod próbował do niego pisać. Zostanie to zgłoszone jako SEGV_ACCERR .
  2. Uzyskano dostęp do strony, która w ogóle nie jest odwzorowana w przestrzeni adresowej aplikacji. Często będzie to wynikać z wyłuskiwania odniesienia do wskaźnika zerowego lub wskaźnika, który został uszkodzony przez małą wartość całkowitą. Jest to zgłaszane jako SEGV_MAPERR .

Dokumentacja sortowania (indeksowany kod źródłowy Linuksa) dla SEGV_MAPERR jest tutaj: http://lxr.free-electrons.com/ident?i=SEGV_MAPERR .


8
Dlaczego stackoverflow.com/a/1000010/358475 jest oznaczony jako odpowiedź, gdy ta jest bardziej kompletna i pomocna?
OldPeculier

2
Pytanie i inna odpowiedź są znacznie starsze niż moja odpowiedź. Zredagowałem drugą odpowiedź, aby przynajmniej ją poprawić.
ahcox

Interesujące byłoby poznanie okoliczności, które odróżniają je od typów wyjątków EXC_BAD_ACCESS. np. czy strona jest zamapowana, ale nie została przydzielona (/ niedawno została zwolniona)?
Bobjt

6
Jednym z przykładów SEGV_MAPERRjest przepełnienie stosu (gra słów nie jest zamierzona). : D
Antti Haapala


40

To błąd segmentacji. Najprawdopodobniej problem z wiszącym wskaźnikiem lub przepełnienie bufora.

SIGSSEGV jest sygnałem kończącym go na podstawie problemu, błędu segmentacji.

Sprawdź, czy nie ma wiszących wskaźników, a także problem z przepełnieniem.

Włączenie zrzutów pamięci pomoże określić problem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.