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 .

ahcox
źródło
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
2
Jest jeszcze więcej typów SEGV: elixir.free-electrons.com/linux/latest/source/include/uapi/…
tomasz
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.

Sev
źródło