logo

Błąd segmentacji Porzucił rdzeń Ubuntu

Co to jest błąd segmentacji?

Błąd segmentacji Lub naruszenie dostępu ( błąd seg w skrócie) to stan awarii lub usterka spowodowana sprzętem wyposażonym w ochronę pamięci, ostrzegająca system operacyjny, że oprogramowanie próbowało uzyskać dostęp do ograniczonego obszaru pamięci (naruszenie dostępu do pamięci).

Jest to ogólna postać błędu ochrony w standardowych systemach x86. W odpowiedzi jądro systemu operacyjnego zwykle wdraża kilka operacji naprawczych, zazwyczaj przekazując błąd procesowi powodującemu naruszenie, przesyłając sygnał do procesu.

W niektórych przypadkach procesy mogą zainstalować procedurę obsługi sygnału, umożliwiającą im samodzielne odzyskiwanie, ale w innych przypadkach używana jest domyślna procedura obsługi sygnału systemu operacyjnego, co zazwyczaj prowadzi do nieprawidłowego zakończenia procesu, a czasem do zrzutu rdzenia.

  • Błędy segmentacyjne to podstawowa klasa błędów w programach określanych w wielu językach, np C język, który oferuje dostęp do pamięci na niskim poziomie, a niektórzy znają kontrole bezpieczeństwa.
  • Przede wszystkim powstają na skutek wielu błędów we wskaźnikach używanych do adresowania pamięci wirtualnej, a konkretnie na skutek nielegalnego dostępu.
  • Inne rodzaje błędów dostępu do pamięci to: błąd autobusu , co obejmuje również kilka przyczyn.
  • Pojawiają się one głównie z powodu niedokładnego adresowania pamięci fizycznej lub nieprawidłowego dostępu do pamięci.
  • Są to odniesienia do pamięci, których sprzęt nie może zaadresować, zamiast odniesień, do których proces nie może się adresować.
  • Kilka języków programowania może stosować mechanizmy stworzone w celu uniknięcia błędów segmentacji i zwiększenia bezpieczeństwa pamięci. Na przykład, the Rdza język programowania stosuje model oparty na własności w celu zapewnienia bezpieczeństwa pamięci. Inny język np Jawa I Seplenienie stosuje wyrzucanie elementów bezużytecznych, które ignoruje wiele klas błędów pamięci, które mogą powodować błędy segmentacji.

Przegląd błędu segmentacji

  • Błąd segmentacji pojawia się, gdy dowolny program próbuje uzyskać dostęp do komórki pamięci, do której nie jest dozwolony, lub próbuje uzyskać dostęp do komórki pamięci w niedozwolony sposób (na przykład próbując zapisać w lokalizacji tylko do odczytu lub zastąpić część systemu operacyjnego).
  • W informatyce słowo 'segmentacja' ma kilka zastosowań. W sensie błędu segmentacji, słowo używane od 1950 r., określa przestrzeń adresową programu, przy zabezpieczeniu pamięci czytelna jest tylko przestrzeń adresowa programu, a w tym tylko stos i część do odczytu i zapisu segmentu danych programu jest zapisywalny. Dlatego też próba odczytu poza przestrzenią adresową programu lub zapis w części przestrzeni adresowej przeznaczonej tylko do odczytu skutkuje błędem segmentacji.
  • Błąd segmentacji pojawia się, jeśli sprzęt wykryje próbę odniesienia się do nieistniejącego segmentu, lokalizacji poza granicami segmentu lub lokalizacji w stylu niedozwolonym przez uprawnienia przyznane segmentowi w systemach korzystających z segmentacji pamięci sprzęt zapewniający pamięć wirtualną.
  • Ogólnie rzecz biorąc, błąd nieprawidłowej strony powoduje błąd segmentacji w systemach korzystających wyłącznie z stronicowania. Zarówno błędy strony, jak i błędy segmentacji są błędami wynikającymi z systemu zarządzania pamięcią wirtualną. Ponadto błąd segmentacji może wystąpić niezależnie od błędów stron; nielegalny dostęp do jakiejkolwiek ważnej strony jest błędem segmentacji. Błąd segmentacji może pojawić się na środku strony. Wewnątrz Przepełnienie bufora który znajduje się na stronie, ale na przykład nielegalnie nadpisuje pamięć.
  • Początkowo usterka wynika z MMU ( jednostka zarządzająca pamięcią ) w przypadku nielegalnego dostępu, jako segmentu aspektu ochrony pamięci, lub błędu nieprawidłowej strony na poziomie sprzętowym. Jeśli problemem nie jest nieprawidłowy adres logiczny, ale raczej nieprawidłowy adres fizyczny, pojawia się raczej błąd magistrali. Dlatego nie zawsze można je rozróżnić.
  • Wykryto ten błąd i do procesu powodującego naruszenie wysyłany jest sygnał, włączając procedurę obsługi procesu dla tego sygnału na poziomie systemu operacyjnego. Różne typy systemów operacyjnych mają różne nazwy sygnałów wskazujących, że pojawił się błąd segmentacji.
  • Sygnał tzw SIGSEGV (skrót od naruszenie segmentacji ) jest przenoszony do szkodliwego procesu w systemach operacyjnych typu Unix. Proces naruszający prawo otrzymuje wyjątek, tj. STATUS_ACCESS_VIOLATION w systemie Microsoft Windows.

Przyczyny błędu segmentacji

Okoliczności, w których pojawia się błąd segmentacji i sposób jego manifestacji, są specyficzne dla systemu operacyjnego i sprzętu. Różny sprzęt powoduje różne błędy w różnych okolicznościach, a różne systemy operacyjne przekształcają je w różne sygnały wysyłane do procesów.

Nadchodzącą przyczyną może być naruszenie dostępu do pamięci, chociaż podstawową przyczyną jest różnego rodzaju błąd oprogramowania. Debugowanie błędu lub ustalenie pierwotnej przyczyny może być łatwe w kilku przypadkach, w których program będzie konsekwentnie prowadził do błędu segmentacji. Jednakże w innych przypadkach odtworzenie worka może być trudne, a w innych przypadkach polegać na alokacji pamięci przy każdym uruchomieniu.

Oto kilka typowych przyczyn błędu segmentacji:

  • Próba dostępu do nieistniejącego adresu pamięci (zewnętrznego w stosunku do przestrzeni adresowej procesu)
  • Próba dostępu do pamięci, do której program nie ma uprawnień (np struktury jądra w kontekście procesu)
  • Próba zapisania pamięci tylko do odczytu (np segment kodu )
  • Z kolei są one często spowodowane wieloma błędami programistycznymi, które skutkują nieprawidłowym dostępem do pamięci:
  • Próba wykonania programu, który nie kompiluje się poprawnie. (Kilka kompilatorów spowoduje utworzenie pliku wykonywalnego niezależnie od istnienia błędów w czasie kompilacji.)
  • Przepełnienie stosu
  • Przepełnienie bufora
  • Przypisywanie lub usuwanie odwołań do zwolnionego wskaźnika (a wiszący wskaźnik , co wskazuje, że pamięć została usunięta/cofnięta/zwolniona)
  • Przypisywanie lub usuwanie odwołań do pliku niezainicjowany wskaźnik (A dziki wskaźnik , który wskazuje losowy adres pamięci)
  • Odwoływanie się do a wskaźnik zerowy zwykle wskazuje adres, który nie jest częścią przestrzeni adresowej procesu

Błędy segmentacji często pojawiają się z powodu błędów w użyciu wskaźnika, szczególnie w Dynamiczna alokacja pamięci w języku C w kodzie C. Odwoływanie się do a wskaźnik zerowy , co skutkuje niezdefiniowanym zachowaniem, doprowadzi do błędu segmentacji. Dzieje się tak ze względu na wskaźnik zerowy, który nie może być prawidłowym adresem pamięci. The wiszące wskazówki I dzikie wskazówki wskazują pamięć, która może istnieć lub nie, i może być zapisywalna lub czytelna lub nie, a zatem może powodować przejściowe błędy.

Rozwiąż błąd segmentacji w Ubuntu

Ten błąd może w dowolnym momencie uderzyć w nasz system Ubuntu. Błąd segmentacji ma miejsce, gdy nasz system próbuje uzyskać dostęp do dowolnej strony pamięci, która nie istnieje. Rdzeń zrzucony definiuje, kiedy część kodu próbuje wykonać operację zapisu i odczytu w lokalizacji wolnej lub tylko do odczytu. Ogólnie, błędy seg są powiązane z plikiem o nazwie core i mają miejsce podczas aktualizacji.

Podczas wykonywania kilku poleceń w momencie zrzutu pamięci możemy napotkać błąd „Nie można otworzyć pliku blokady” błąd. Dzieje się tak dlatego, że system próbuje przejąć kawałek bloku, który nie istnieje. Dzieje się tak z powodu awarii plików binarnych kilku określonych programów.

Być może debugujemy lub wycofujemy się, aby rozwiązać ten problem, ale rozwiązaniem jest naprawienie uszkodzonych pakietów poprzez wykonanie kilku kroków wymienionych poniżej:

1. Usuń pliki blokujące dostępne w różnych lokalizacjach.

 $ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system 

Błąd segmentacji Porzucił rdzeń Ubuntu

2. Usuwanie pamięci podręcznej repozytorium.

 $ sudo apt-get clean all 

Błąd segmentacji Porzucił rdzeń Ubuntu

3. Uaktualnij i zaktualizuj pamięć podręczną naszego repozytorium.

 $ sudo apt-get update 

Błąd segmentacji Porzucił rdzeń Ubuntu
 $ sudo apt-get upgrade 

Błąd segmentacji Porzucił rdzeń Ubuntu

4. Teraz zaktualizuj naszą dystrybucję, to zaktualizuje nasze pakiety.

 $ sudo apt-get dist-upgrade 

Błąd segmentacji Porzucił rdzeń Ubuntu

5. Przeszukaj uszkodzone paczki i usuń je siłą.

 $ sudo dpkg -1 | grep ^..r | apt-get purge 

Świetny sposób, który zawsze będzie działał, oprócz wiersza poleceń:

jeśli jeszcze Java
  1. W trybie uruchamiania uruchom Ubuntu, klikając przycisk wyjście klucz po ponownym uruchomieniu.
  2. Wybierać ' Zaawansowane opcje dla Ubuntu
    Błąd segmentacji Porzucił rdzeń Ubuntu
  3. W trybie odzyskiwania uruchom Ubuntu, a zostanie wymienionych kilka opcji.
  4. Najpierw wybierz „Napraw uszkodzone pakiety”
    Błąd segmentacji Porzucił rdzeń Ubuntu
  5. Następnie wybierz „Wznów normalne uruchamianie”
    Błąd segmentacji Porzucił rdzeń Ubuntu

Teraz mamy dwa sposoby rozwiązania problemu błędów segmentacji w interfejsie GUI i CLI. Czasami może się również zdarzyć, że polecenie, tj. apt, nie działa z powodu błąd seg , więc metoda CLI nie zostanie zaimplementowana. W takiej sytuacji nie martw się, ponieważ metoda GUI zawsze się u nas sprawdzi.

Obsługa błędu segmentacji

Domyślnym zadaniem w przypadku błędu magistrali lub błędu segmentacji jest nieprawidłowe zakończenie procesu, który go napotkał. Można utworzyć plik podstawowy, aby pomóc w debugowaniu, a także można zaimplementować inne zadania zależne od platformy. Na przykład wiele systemów Linux stosujących łatka grsecurity może się zalogować Sygnały SIGSEGV do monitorowania ewentualnych prób włamań z przepełnieniem bufora.

W kilku systemach, takich jak Windows i Linux, program może sam zarządzać błędem segmentacji. Działający program może nie tylko zarządzać zdarzeniem, ale może wyodrębnić kilka szczegółów na temat jego statusu, takich jak wartości rejestru procesora, uzyskanie śledzenia stosu, linia kodu źródłowego w momencie napotkania, adres pamięci, do którego uzyskano nieprawidłowy dostęp oraz czy zadaniem było zapis czy odczyt, w zależności od systemu operacyjnego i architektury.

Jednak błąd segmentacji oznacza, że ​​w programie występuje błąd wymagający naprawy. Możliwe jest również celowe spowodowanie takiego błędu w celach testowych, debugowania, a także imitowanie platform, w których wymagany jest bezpośredni dostęp do pamięci. System powinien być w stanie zezwolić na wykonanie programu nawet po wystąpieniu błędu w tym drugim przypadku.

W tej sytuacji, jeśli system na to pozwala, możliwe jest zarządzanie zdarzeniami i usprawnianie licznika programu procesora 'skok' na brak polecenia przystąpienia do egzekucji.

Przykłady błędów segmentacji

Błąd segmentacji Porzucił rdzeń Ubuntu

Zapis do pamięci tylko do odczytu

Powstaje błąd segmentacji. Pojawia się, gdy program zapisuje część swojego segmentu kodu lub część tylko do odczytu segmentu danych na poziomach błędów kodu, ponieważ są one ładowane przez system operacyjny do pamięci tylko do odczytu.

Dereferencja wskaźnika zerowego

W C i innych językach podobnych do C wskaźniki zerowe służą do oznaczania znaczenia „wskaźnik do żadnego obiektu” i jako wskaźnik błędu i wyłuskiwanie wskaźnika zerowego (zapis lub odczyt ze wskaźnika zerowego) jest bardzo podstawowym błędem programu.

Standard nie mówi, że wskaźnik zerowy jest podobny do wskaźnika na adres pamięci 0, chociaż może tak być. Prawie wszystkie systemy operacyjne mapują adres wskaźnika zerowego w taki sposób, że jego użycie prowadzi do błędu segmentacji.

Takie zachowanie nie jest gwarantowane przez żaden standard C. W C dereferencja wskaźnika zerowego to: niezdefiniowane zachowanie , a zgodna implementacja może założyć, że wyłuskany wskaźnik nie ma wartości null.

Przepełnienie bufora

Przepełnienie stosu