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
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
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.
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
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