Mam aplikację wiersza polecenia, która po uruchomieniu nie wykonuje tego, co powinna i w pewnym momencie pozostawia komunikat:
Segmentation fault
Co to znaczy? Co powinienem zrobić?
debugging
segmentation-fault
Złotowłosa
źródło
źródło
Odpowiedzi:
Winy segmentacji jest wynikiem naruszenia dostępu do pamięci. Program odwoływał się do adresu pamięci poza tym, który został mu przydzielony, a jądro systemu operacyjnego odpowiada, zabijając program za pomocą SIGSEGV.
Jest to błąd, ponieważ nie ma sensu próbować uzyskać dostępu do niedostępnej pamięci (nie można tego zrobić). Tego typu błędy są jednak łatwe do popełnienia, szczególnie w językach takich jak C i C ++ (które są przyczyną wielu popularnych aplikacji). Wskazuje błąd w samym programie lub w bibliotece, do której prowadzi łącze. Jeśli chcesz zgłosić błąd (zrób - to pomaga), dobrym pomysłem jest dołączenie śledzenia zdarzeń, które doprowadziły do błędu seg.
Aby to zrobić, możesz uruchomić program w środku
gdb
(debuger GNU), który powinien być dostępny z dowolnej dystrybucji Linuksa, jeśli nie jest jeszcze zainstalowany (pakiet będzie się nazywał „gdb”). Jeśli uszkodzona aplikacja nosi nazwę „brokenapp”:Pojawi się akapit dotyczący praw autorskich i licencji, a na końcu pojawi się monit z kursorem:
Wpisz
run
i naciśnij Enter. Jeśli potrzebujesz podać argumenty (np.-x --foo=bar whatever
), Dodaj je (run -x --foo=bar whatever
). Program zrobi to, co robi, zobaczysz wynik, a jeśli potrzebujesz interakcji, możesz (pamiętaj, że możesz uruchomić dowolny program, w tym GUI, wewnątrz gdb). W punkcie, w którym zwykle występuje awaria, zobaczysz:Drugi wiersz wyników jest tutaj tylko przykładem. Teraz wpisz
bt
(dla „śladu wstecz”) i naciśnij Enter. Zobaczysz coś takiego, chociaż może być znacznie dłużej:Jeśli jest dłuższy, dostaniesz tylko ekran na raz i pojawi się
--More--
komunikat. Naciskaj klawisz Enter, aż będzie gotowy. Możesz terazquit
, wyjście pozostanie w twoim terminalu. Skopiuj wszystko od początkuProgram received signal SIGSEGV
do pliku tekstowego i zgłoś raport o błędzie za pomocą narzędzia do śledzenia błędów aplikacji; możesz je znaleźć online, wyszukując np. „raport o błędzie brokenapp” - prawdopodobnie będziesz musiał się zarejestrować, aby otrzymać odpowiedź e-mailem. Dołącz opis problemu, wszelkie argumenty, które podałeśrun
itp., Oraz kopię śladu wstecznego (jeśli jest bardzo długi, może istnieć sposób na dołączenie pliku tekstowego w interfejsie śledzenia błędów). Dołącz także wersję, jeśli wiesz, co to jest (brokenapp --version
może działać, lub strona podręcznika może wskazywać, jak ją zdobyć),Mam nadzieję, że ktoś wróci do ciebie w niedługim czasie. Zgłaszanie błędów jest zwykle mile widziane.
źródło
gdb
robi wiele rzeczy . Chcesz przejść do sekcji 5.1Oznacza to, że aplikacja ma błąd.
Jeśli jesteś użytkownikiem końcowym, powinieneś skontaktować się ze sprzedawcą aplikacji.
Jeśli jest to Twoja aplikacja, możesz:
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
Pliki podstawowe będą również bardzo przydatne dla programistów innych niż ty - zawierają pełny stan programu w momencie awarii; jeśli masz zamiar złożyć raport o błędzie, dołącz go, a w niektórych przypadkach binarną aplikację. Pamiętaj, że istnieje niewielka szansa, że Twoje dane osobowe, takie jak numery kont, hasła i tym podobne, mogą pozostać w pamięci programu w momencie awarii. W wielu przypadkach zgłoszenie tylko śladu po awarii wątku stanowi dużą pomoc dla programistów w znalezieniu problemu. Aby uzyskać ślad zwrotny, możesz załadować plik podstawowy za pomocą debuggera (jak
gdb executable corefile
).źródło