Jak rozwiązać problem „Błąd segmentacji (zrzut rdzenia)”


15

Używam Ubuntu 14.04.

Po zainstalowaniu niektórych aplikacji napotkałem błąd segmentacji (zrzut pamięci).

Co to znaczy ? Jak mogę rozwiązać ten problem?

Na przykład :

Po zainstalowaniu stabilnego dla Chrome, kiedy uruchamiam go z terminala, ten błąd występuje.


Niektóre programy binarne uległy awarii, ale jest to bardzo specyficzne dla programu, który się zawiesił, więc może być konieczne poinformowanie nas, który program to spowodował, możesz także spróbować go zaktualizować.
Kwaadpepper


1
Ponieważ jest to zamknięte źródło, lepiej zgłoś raport o błędzie do wujka GooGle!
user.dz

1
Dobry SH :) Zapytam wujka; P
Ravan

1
Spróbuj usunąć To preferencji i pamięci podręcznej sudo rm -rf ~/.config/google-chrome ~/.cache/google-chrome. Następnie uruchom tryb incognitogoogle-chrome --incognito
user.dz

Odpowiedzi:


12

Co to znaczy?

Zobacz AU: Co to jest błąd segmentacji? a także ten, który ma kilka przykładów, jak go odtworzyć, SO: Co to jest błąd segmentacji? . najprostszy opis, jaki mogę podać (może nie być idealny):

Program próbował uzyskać dostęp do obszaru pamięci poza własną sekcją. System operacyjny blokuje to.

Niektóre przypadki: Odczyt wartości za pomocą zainicjowanego wskaźnika, Wyjście poza zakres w tablicy, Wywołanie funkcji (gdy nie jest zachowana kompatybilność wsteczna), ...

Jednak nie zawsze łatwo jest znaleźć przyczynę w przypadku dużych programów lub programów wykorzystujących biblioteki innych projektów. I większość przypadków kończy się raportem o błędzie, zarówno dla programu docelowego, jak i jednego, jeśli jego zależności (albo projekt wyjściowy, albo pakiet dystrybucyjny).

Jak mogę rozwiązać ten problem?

Jeśli nie wykonałeś żadnej niestandardowej konfiguracji / konfiguracji i wszystkie aktualizacje zostały zainstalowane. Uruchom raport o błędzie , zobacz Jak zgłosić błąd?

Jeśli oprogramowanie typu open source jest obsługiwane przez system Ubuntu, użyj ubuntu-bug( apport-bug). W przypadku zamkniętego źródła innej firmy sprawdź strony pomocy, jak zgłaszać błędy i zbierać powiązane dane.


Uwaga: jeśli masz choć trochę doświadczenia programistycznego, zaleca się, aby spróbować rozwiązać to samodzielnie. Wiele raportów błędów jest nieaktywnych przez lata. Lub przynajmniej zbierz wystarczającą ilość danych do debugowania, aby rozwiązać problem przed zgłoszeniem.

Niektóre przydatne narzędzia do debugowania

  1. apport-bug logs / core dump / backtrace

    Jeśli nie masz komunikatu o błędzie przed błędem segmentacji. Uruchom go z --saveopcją i poszukaj dziennika śledzenia wstecznego:

    apport-bug program-cmd --save bug-report_output.txt
    
  2. gdb śledzenie / debugowanie kodu źródłowego

    Jeśli to nie zadziała, użyj gdb:

    $ gdb program-cmd
    (gdb) run
    (gdb) backtrace
    

    Jeśli pojawi się jakikolwiek komunikat o błędzie, sprawdź w Internecie, starterze oraz w narzędziu do śledzenia błędów projektu, czy występują podobne przypadki.

    W przypadku niektórych zaawansowanych użytkowników lub podążających ścieżką edukacyjną ac / c ++ mogą pobrać odpowiednie -dbgpakiety symboli. Następnie można użyć gdbdo śledzenia przepływu programu przez źródło i uzyskania dokładnej funkcji / instrukcji, które powodują błąd w czasie wykonywania.

  3. strace śledzenie połączeń systemowych

    Innym narzędziem, które może pomóc strace, podoba mi się. To naprawdę potężne narzędzie.

    Przedstawia się:

    W najprostszym przypadku straceuruchamia określone polecenie, dopóki nie zostanie zakończone. Przechwytuje i rejestruje wywołania systemowe wywoływane przez proces oraz sygnały odbierane przez proces. Nazwa każdego wywołania systemowego, jego argumenty i wartość zwracana są drukowane po błędzie standardowym lub w pliku określonym opcją -o.

    stracejest przydatnym narzędziem diagnostycznym, instruktażowym i debugującym. Administratorzy systemu, diagnostycy i rozwiązywacze problemów uznają je za nieocenione przy rozwiązywaniu problemów z programami, dla których źródło nie jest łatwo dostępne, ponieważ nie trzeba ich ponownie kompilować w celu ich śledzenia. Studenci, hakerzy i nadmiernie zaciekawieni przekonają się, że można dowiedzieć się wiele o systemie i jego wywołaniach systemowych, śledząc nawet zwykłe programy. Programiści przekonają się, że ponieważ wywołania systemowe i sygnały są zdarzeniami zachodzącymi na interfejsie użytkownika / jądra, dokładne sprawdzenie tej granicy jest bardzo przydatne do izolacji błędów, sprawdzania poczytalności i próby uchwycenia warunków wyścigu.

    Źródło: man strace

  4. ltrace dynamiczne śledzenie połączeń z biblioteki

    ltraceto program, który po prostu uruchamia określone polecenie, dopóki nie zakończy działania. Przechwytuje i rejestruje dynamiczne wywołania biblioteki, które są wywoływane przez wykonywany proces oraz sygnały odbierane przez ten proces. Może także przechwytywać i drukować wywołania systemowe wykonywane przez program.

    Jego użycie jest bardzo podobne do strace(1).

    Źródło: man ltrace

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.