2013-10-01 26 views
7

Widzę te 2 błędy segmentacji w systemie Android. Jeden powiedział SEGV_MAPERR, drugi powiedział SEGV_ACCERR.Co oznacza "kod" w usterce segmentacji

Czy możesz mi powiedzieć, jakie są różnice między tymi 2?

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 41963214 

signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 4006e000 

Dzięki.

+0

'SEGV_MAPERR' jest błędem alokacji pamięci (zwisający wskaźnik, przepełnienie pamięci itp.),' SEGV_ACCERR' to błąd dostępu do pamięci, zwykle uprawnienia. A może szukasz czegoś więcej? – Simon

+0

Czy można powiedzieć, że SEGV_ACCERR jest spowodowane uszkodzeniem stosu? – michael

+0

Cóż, to może być, jeśli używałeś wskaźnika stosu do uzyskania dostępu do pamięci, do której nie masz uprawnień, ale wydaje się to mało prawdopodobne. Co robisz? – Simon

Odpowiedz

12

Per siginfo.h:

SEGV_MAPERR oznacza, że ​​próbował uzyskać dostęp do adresu, który nie mapuje się do niczego.

SEGV_ACCERR oznacza, że ​​próbowałeś uzyskać dostęp do adresu, do którego nie masz uprawnień dostępu.

Tak więc w obu przypadkach uzyskałeś dostęp do adresu, którego nie powinieneś mieć, co jest prawdopodobnie jedyną rzeczą, na którą twój rzeczywisty kod jest winny. W pierwszym przypadku i tak nie ma pamięci w tym zakresie adresów. W tym ostatnim przypadku jest pamięć w tym zakresie adresów, ale nie jesteś jej właścicielem.

Jeśli uzyskasz dostęp do losowego adresu, który otrzymasz, zależy od tego, jak system operacyjny ma skonfigurowany proces w tym momencie.

0

Jeśli uzyskasz dostęp do pamięci takiej jak *((int*)0)=1, otrzymasz SEGV_MAPERR.

Jeśli chroniony pamięć z mprotect(2) np mprotect(buffer, pagesize, PROT_READ), potem zmodyfikował pamięć jak *(buffer)=1, dostaniesz SEGV_ACCERR.

Please man mprotect o szczegóły.