W Ubuntu wielokrotnie napotkałem błąd błędu segmentacji. Co to jest błąd segmentacji i kiedy się pojawia?
W Ubuntu wielokrotnie napotkałem błąd błędu segmentacji. Co to jest błąd segmentacji i kiedy się pojawia?
Odpowiedzi:
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) .
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.
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”.
SIGSEGV
moduł 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.