Uruchomienie aplikacji kończy się na „Błąd segmentacji”

40

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ć?

Złotowłosa
źródło
powiązane: stackoverflow.com/questions/2876357/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

63

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 runi 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 SIGSEGVdo 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ś runitp., 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 --versionmoż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.

Złotowłosa
źródło
1
Błąd segmentacji może wystąpić również w językach tłumaczy (głównie dlatego, że występują błędy w samym
tłumaczu
To jest bardzo przydatne! Czy jest możliwość wejścia do środka? postawić znak stop i spróbować dowiedzieć się więcej?
Zloy Smiertniy
1
@ZloySmiertniy gdbrobi wiele rzeczy . Chcesz przejść do sekcji 5.1
Złotowłosa
11

Oznacza to, że aplikacja ma błąd.

  • Jeśli jesteś użytkownikiem końcowym, powinieneś skontaktować się ze sprzedawcą aplikacji.

    • Jeśli przyszedł z dystrybucją Linuksa, powinieneś utworzyć raport o błędach dla tej dystrybucji.
    • W przypadku niekomercyjnych aplikacji innych firm należy zgłosić błąd autorowi lub temu konkretnemu narzędziu do śledzenia błędów aplikacji. Zwykle można znaleźć miejsce, przeglądając witrynę aplikacji lub pobrany pakiet binarny / źródłowy.
    • W przypadku aplikacji komercyjnych należy skontaktować się z pomocą techniczną.
  • Jeśli jest to Twoja aplikacja, możesz:

    1. włącz podstawowe pliki: $ ulimit -c unlimited
    2. odtworzyć awarię: $ ./yourapp
    3. awaria debugowania z gdb: $ 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).

gena2x
źródło
Zgodnie z oknem dialogowym Microsoft powinieneś skontaktować się ze sprzedawcą „tylko jeśli problem będzie się powtarzał”, w przeciwnym razie nie przejmuj się. Rzadkie awarie nie są prawdziwymi błędami, a tylko powtarzalnymi.
Kaz
4
Moim spostrzeżeniem jest to, że jakość oprogramowania Microsoft jest niska w wielu przypadkach w porównaniu z oprogramowaniem UNIX i fajnie jest, że w świecie UNIX ludzie zwykle nie odnoszą się do ich wytycznych.
gena2x