Co to jest błąd segmentacji?

27

W Ubuntu wielokrotnie napotkałem błąd błędu segmentacji. Co to jest błąd segmentacji i kiedy się pojawia?

Tachyony
źródło
1
Żeby to ukryć: miałem podobny problem, podczas gdy moje awarie nie były niezawodnie odtwarzalne i pochodziły z (prawie) przypadkowych aplikacji. Okazało się, że najprawdopodobniej moja pamięć jest zepsuta. Jeśli więc jakikolwiek program powoduje awarie segfaulta, można przyjrzeć się bliżej pamięci RAM.

Odpowiedzi:

25

Błąd informujący o błędzie segmentacji (lub segfault lub SIGSEGV ) w systemie Ubuntu i innych systemach operacyjnych typu Unix lub o błędzie ogólnym w systemie Windows występuje, gdy program próbuje uzyskać dostęp do części pamięci, do której nie można uzyskać dostępu, lub do której program dostęp jest zabroniony. Błąd segmentacji jest rodzajem awarii programu, to znaczy nienormalnego zakończenia programu. Więcej informacji na ten temat można znaleźć w artykułach Wikipedii na temat awarii , ochrony pamięci , błędu segmentacji , ogólnego błędu ochrony i SIGSEGV (i bardziej zrozumiałego zrozumienia tematu niż tutaj).

Błąd segmentacji prawie zawsze wynika z błędu w programie, w którym występuje. Zgaduję, że większość lub wszystkie z twoich błędów segmentacji występują w tej samej aplikacji. Podaj więcej szczegółów na temat okoliczności, w których na twoim komputerze występują błędy segmentacji i jaki program ulega awarii. Podaj także pełny i dokładny tekst otrzymanego komunikatu o błędzie oraz wszelkie inne komunikaty, które się przed nim pojawią. Powinno to umożliwić nam udzielenie szczegółowych porad dotyczących konkretnego problemu (a nie tylko ogólnych informacji o tym, co to jest błąd segmentacji).

Najlepszym sposobem na podanie tych informacji jest edytowanie pytania w celu ich uwzględnienia . Alternatywnie, jeśli chcesz, aby to pytanie dotyczyło ogólnie błędów segmentacji, możesz opublikować nowe pytanie, aby dowiedzieć się, co konkretnie powoduje błędy segmentacji (jeśli to zrobisz, pamiętaj o podaniu wszystkich tych szczegółów w nowym pytaniu) .

Eliah Kagan
źródło
na szczęście wszystkie błędy segmentacji zostały naprawione przez aktualizację os :). Moje pytanie dotyczy ogólnie błędu segmentacji. Nie dla konkretnej aplikacji.
Tachyons
@ Nie jestem osobą, odpowiednio zredagowałem swoją odpowiedź. (Zachowuję wskazówki, aby podać więcej informacji, z korzyścią dla innych użytkowników, którzy doświadczają błędów segmentacji, chociaż wiem, że nie potrzebujesz teraz konkretnej pomocy z nimi.)
Eliah Kagan
Chodzi o błąd segmentacji w aplikacji. Chciałem zapytać o to, co dzieje się w programie C ++, w którym ten sam program działa doskonale w systemie Windows lub Turbo C ++ (w winie) (używam anjuty w Linuksie). I to są tylko podstawowe programy, a nie aplikacje (programy takie jak TREES , WYKRESY itp.)
Nirmik
Dzięki. Ale obawiam się, że w większości przypadków pytanie o błąd segmentacji w aplikacji jest tutaj nie na temat. :)
Tachyons
@Nirmik: prawdopodobnie jest to temat stackoverflow :)
Tachyons
4

Błąd segmentacji jest spowodowany błędem w aplikacji. Technicznie oznacza to, że aplikacja próbuje czytać lub zapisywać w części pamięci, która do niej nie należy (lub nie istnieje). Oczywiście nie wolno czytać ani zapisywać w pamięci innej osoby, a gdy system (jądro) to wykryje, wymusi zamknięcie aplikacji.

Vojtech Trefny
źródło
0

Dawno minęły czasy, kiedy ludzie śledzili kod asemblera i debugowali problem. Abends, Dr Watson, błąd segmentacji. Te zielone dni minęły.

Jednym z powodów błędu segmentacji jest błąd kodu, który ma bezpośredni dostęp do pamięci. Gdy fragment kodu próbuje uzyskać dostęp do segmentu pamięci innej aplikacji, występuje błąd segmentacji. Przydziały pamięci są czasami przenoszone, aby umożliwić przydzielenie większych ciągłych bloków pamięci. Podczas próby odzyskania, jądro stara się zapisać wszystkie informacje o pamięci do pliku, aktualny stan wszystkich aplikacji działających na procesorze i ich stan (ostatnia instrukcja) do pliku i po prostu umiera. Spróbuje również zapisać jak najwięcej informacji dotyczących odzyskiwania i zamknąć tak wiele plików, jak to możliwe, aby dyski twarde nie dostawały uszkodzonych łączy.

Debuguj go i napraw, jeśli często go odtwarzasz. Jeśli nie możesz tego odtworzyć, po prostu połącz ręce, uklęknij i módl się jak diabli, abyś nie widział tego „regularnie”.

Siddharth
źródło
Awarie segmentowe mogą być wywoływane w dowolnym programie napisanym w języku umożliwiającym bezpośredni dostęp do pamięci. Zasadniczo też nie powodują awarii jądra.
Alex L.,
@AlexL. to jest dokładne. Zmienię swoją odpowiedź.
Siddharth,
Mam nadzieję, że poprawnie przedstawiłem swoje myśli.
Siddharth,
@AlexL. Czy możesz to jeszcze raz przejrzeć. Usunę go, jeśli nadal nie będzie dokładny.
Siddharth,
To jest lepsze. Mimo to (1), chociaż jest to możliwe, niezwykle rzadko program ustawia SIGSEGVmoduł obsługi na cokolwiek innego niż SIG_DFL(co oznacza zrzucenie rdzenia i wyjście na a SIGSEGV), ponieważ jeśli uzyskujesz dostęp do pamięci, nie powinieneś być, to coś poszło bardzo źle, a odzyskanie prawdopodobnie jest niemożliwe. (2) Rdzeń zostanie zrzucony dopiero po zatrzymaniu procesu. (3) Zrzut rdzenia obejmuje tylko pamięć i rejestry zrzuconego procesu. (4) Inne procesy, procesor i jądro nie mają wpływu na awarię innego procesu.
Alex L.,