co zrobić z błędem segmentacji 11
z jakiegoś powodu postanowiłem zbudować produkt używając zwykłego C. Jeśli celem była efektywność kodu, to była katastrofa. Ale jako narzędzie rozwoju osobistego, myślę, że nauczyłem się znacznie więcej o programowaniu w tym procesie.
na przykład teraz wiem dokładniej, dlaczego słownik Pythona i lista zachowują się inaczej i co to naprawdę znaczy „przekazać przez odniesienie.”
jednak, gdyby istniała jedna bariera, która sprawiłaby, że nigdy nie chciałbym wrócić do C, byłaby to przerażająca” Segmentation Fault 11″, a następnie ” Abort Trap 6.”
te dwa błędy występują podczas uruchamiania, co utrudnia ich debugowanie. XCode, Eclipse lub inne narzędzia do debugowania są naprawdę pomocne, ale nauczyłem się, że o wiele ważniejsze jest, aby dowiedzieć się, co to jest i wymyślić procedury, aby poradzić sobie z procesem debugowania. To tylko moje notatki na temat moich typowych błędów. Mam nadzieję, że to lista rozwiązywania problemów dla każdego, kto ma własne problemy. Chcę przynajmniej omówić moje głupie problemy, żebyście mogli skupić się na prawdziwych problemach z kodowaniem.
błąd segmentacji oznacza, że twój program próbował uzyskać dostęp do czegoś, czego nie powinien. To część problemu. Istnieje wiele powodów, dla których program może uzyskać dostęp do rzeczy, których nie powinien, ale skompilowany kod mówi po prostu „# $ # @^ * &!”zamiast tego. Jeśli o tym pomyślisz, nie chciałbyś tłumaczyć komuś, dlaczego szturchanie cię w wrażliwym miejscu sprawia, że jesteś zły. Chcesz, żeby przestali to robić. Na szczęście komputery są głupie i zaskakująco cierpliwe po około 75 latach inżynierii. Będą wysyłać błędy Seg, ale (zwykle) nie przestaną być przyjaciółmi po tym, jak stanie się to po raz 1000.
co to jest pułapka przerwania?
nie jest aż tak różnie. Gdzieś Twój komputer kazał sobie przerwać program. Ponownie, nie bardzo pomocne. Jednak zwykle dzieje się tak, gdy próbujesz uzyskać dostęp do string
dwuznakowego łańcucha "nw"
lub nie przydzielić wystarczającej ilości pamięci char string
dla łańcucha lub tablicy, takiej jak "way"
.
co zrobić z usterką Seg?
samouczki, które czytam, koncentrują się na użyciu narzędzi do debugowania, takich jak LLDB, gdb i tak dalej. Wszystko w porządku i elegancko. Tak, powinieneś najpierw uruchomićgcc -g
, a następnielldb executable_name
, a następnierun -flag1 -flag2
, aby sprawdzić, czy to pomoże Ci to zrozumieć. Ale czasami nie ma żadnej pomocy. Mam listę rzeczy do sprawdzenia.
- sprawdź, czy wymagane zmienne globalne programu mają wartości. Stało się to głównie dlatego, że stworzyłem flagi, które wypełniły kilka wartości, które musiały być ustawione przed uruchomieniem. Co jednak, jeśli nic nie włożą? Seg Fault 11! Nie było wiele razy * myślałem * vars zostały ustawione, gdy nie były i że wykonane dla trudnych błędów. Co więcej, staraj się ograniczać globale, aby były łatwiejsze do śledzenia.
- malloc jest zarówno twoim przyjacielem, jak i wrogiem. Zwłaszcza w przypadku wpisów użytkownika, przydzielanie pamięci, a następnie kopiowanie, łączenie i robienie wszystkiego, co jeszcze w przyszłości, może być bardzo trudne. Znać to polecenie dobrze i jak to działa. I nie zapomnij
free()
pamięć po zakończeniu! - użyj
char var
aby określić rozmiar znaku* dla alokacji pamięci. Większość problemu, który wiązałem z przypisaniem zmiennych, aby ostatecznie zaakceptować ciąg znaków. Widziałem inne porady, ale jeśli jest to ciąg, z którym pracujesz, myślę, żestrlen()
działał najbardziej konsekwentnie. Potrzebujesz + 1 dla\0
(null), aby zakończyć łańcuch na końcu. - użyj
int arr) +1)]
dla tablic innych typów. To dziwny sposób na robienie rzeczy, ale to jest to, co dostajesz z językiem niskiego poziomu. \0
reprezentuje null i zakończy tablicę. Może to być pomocne, gdy próbujesz zapobiec problemom z przepełnieniem bufora.- staraj się używać zdefiniowanych stałych w jak największym stopniu. Ilekroć jesteś w stanie zdefiniować rzeczy na prekompilacji, pozwoli to zaoszczędzić czas debugowania później.
- zrozum, do czego służą pliki nagłówkowe. Wiele samouczków powie Ci, co zawiera plik nagłówka, ale nie zawsze jest jasne, do czego służą. Pliki nagłówkowe są przechwytywane podczas wstępnej kompilacji i zawierają podsumowanie zmiennych i funkcji dostępnych dla programu *przed kompilacją*. Oznacza to, że .pliki C zawarte w programie będą mogły uzyskać dostęp do tych funkcji, pod warunkiem, że
#include <headerfile.h>
zostanie dodany do pliku. Dobrą konwencją jest stworzenieplik h za każdym razem, gdy tworzysz plik . - większość pętli for przebiega w następujący sposób:
for (int i=0; i < stop; i++)
łatwym sposobem na przerwanie pułapki jest umieszczenie ≤ przedstop
. - trzymaj swoje problemy w ryzach. Postaraj się, aby każdy plik robił kilka dyskretnych rzeczy i nic więcej. Jeśli musisz polować na różne pliki w kółko, może to sprawić, że znalezienie problemów z usterką seg będzie naprawdę trudne.
- Matematyka komputerowa jest trudna. Nie jest, ale małe rzeczy powodują duże problemy.
char variable
na przykład oznacza tablicę zawierającą dwie pozycje, ale ponieważ indeksy zaczynają się od 0, oznacza to, że możesz przejść tylko do liczby 1. - drukuje ciągi formatu jako właściwy typ. Na szczęście zwykle zostaje to złapane podczas kompilacji, ale nadal może powodować problemy. Upewnij się, że Twój format
%{whatever}
pasuje do każdej zmiennej, którą chcesz umieścić.
to wszystko co na razie mam. Mam nadzieję, że moje nieszczęścia oszczędziły Ci bólów głowy! Jeśli Wszystko inne zawiedzie, mam teraz listę rzeczy do sprawdzenia, zanim wyciągnę włosy!