Co to jest „naruszenie segmentacji”?

Kontekst
Nowoczesny sprzęt ogólnego przeznaczenia zawiera „jednostkę zarządzania pamięcią” (lub MMU). Ta funkcja sprzętowa jest używana przez systemy operacyjne, takie jak Linux, do implementacji ochrony pamięci, tj. uniemożliwienia różnym procesom dostępu lub modyfikacji wzajemnej pamięci (z wyjątkiem ściśle kontrolowanego sposobu za pośrednictwem określonych interfejsów API). Upraszcza to rozwiązywanie problemów i zwiększa odporność, ponieważ procesy są starannie opanowane i oddzielone od siebie.
Sygnał „naruszenia segmentacji” jest wysyłany do procesu, którego jednostka zarządzania pamięcią wykryła próbę użycia adresu pamięci, który do niego nie należy.
Częsta przyczyna: błąd programistyczny
Jeśli proces próbuje uzyskać dostęp do pamięci przez wskaźnik, który nie został prawidłowo zainicjalizowany lub który wskazuje na pamięć, która została wcześniej zdelokowana, prawdopodobnie spowoduje to segfault. W tym przypadku, segfault występuje z określonego procesu lub binarne, ewentualnie w określonym zestawie okoliczności.
Aby poradzić sobie z tego typu segfault, rozpocząć poprzez zastosowanie wszystkich odpowiednich dodatków Service Pack i aktualizacji konserwacji. Następnie, jeśli problem jest nadal powtarzalny z bieżącym kodem, spróbuj przechwycić zrzut rdzenia aplikacji do analizy. Szczegóły na ten temat można znaleźć w TID 3054866 – How to obtain application core dumps.
Jeśli problematyczny plik binarny jest dostarczany przez firmę Novell jako część produktu, otwórz zgłoszenie serwisowe w dziale usług technicznych firmy Novell, dostarczając

  • opis okoliczności, w jakich wygenerowano zrzut rdzenia,
  • raport supportconfig -v dla dotkniętego systemu (strona główna supportconfig) oraz
  • sam plik zrzutu rdzenia, jeśli jest mniejszy niż 50 MB. Jeśli jest większy, poczekaj, aż zgłoszenie serwisowe zostanie przypisane do inżyniera, a następnie współpracuj z nim, aby je przenieść.

Jeśli problematyczny plik binarny został dostarczony przez stronę trzecią, skontaktuj się z działem pomocy technicznej tej strony w celu uzyskania pomocy.
Wspólna przyczyna: niedopasowane pliki binarne i biblioteki
Usterki mogą wystąpić w procesach, które łączą pliki binarne i biblioteki współdzielone, które nie są (w pełni) kompatybilne. Może się to zdarzyć, na przykład, gdy biblioteka jest aktualizowana w sposób, który zmienia jej ABI (interfejs binarny aplikacji), ale wewnętrzny numer wersji biblioteki nie jest aktualizowany, aby to odzwierciedlić. Plik binarny, który został zbudowany w oparciu o starszą wersję biblioteki, może zacząć ulegać awariom, gdy zostanie załadowany w oparciu o nowszą wersję.
Ten przypadek może być trudny do rozpoznania i nie ma listy kroków, jak sobie z nim poradzić. W przypadku podejrzenia tego przypadku należy rozważyć następujące rzeczy:

  • Sprawdzenie systemu pod kątem uszkodzeń plików (np. za pomocą pliku rpm-verify.txt w raporcie supportconfig -v)
  • Sprawdzenie ustawień systemu, które odnoszą się do bibliotek współdzielonych, takich jak pliki konfiguracyjne /etc/ld.so.conf i /etc/ld.so.conf.d/* oraz zmienne środowiskowe LD_LIBRARY_PATH i LD_PRELOAD.
  • Użycie narzędzia objdump do sprawdzenia binarnego pod kątem nadpisania ścieżki wyszukiwania bibliotek wbudowanych (RPATH).

Powszechna przyczyna: problem ze sprzętem lub konfiguracją sprzętu
Gdy błędy segmentów występują często, z różnymi procesami lub bez wyraźnego wzorca, może to wskazywać na problem ze sprzętem systemu (podsystemem pamięci) lub na nieodpowiednie ustawienia konfiguracyjne niskiego poziomu systemu. Więcej informacji na temat postępowania w takiej sytuacji można znaleźć w TID 3301593 – System Linux zawiesza się lub jest niestabilny.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *