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ć?
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ć?
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”:
gdb brokenapp
Pojawi się akapit dotyczący praw autorskich i licencji, a na końcu pojawi się monit z kursorem:
(gdb) _
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:
Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
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:
(gdb) bt
#0 0x00000000006031c9 in ?? ()
#1 0x000000000040157f in mishap::what() const ()
#2 0x0000000000401377 in main ()
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 teraz quit
, wyjście pozostanie w twoim terminalu. Skopiuj wszystko od początku Program 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.
gdb
robi wiele rzeczy . Chcesz przejść do sekcji 5.1
Oznacza 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
).