Za każdym razem, gdy szukam IDE (obecnie majstruję przy Go), znajduję wątek pełen osób polecających Vi, Emacs, Notepad ++ itp.
Nigdy nie robiłem żadnego rozwoju poza IDE; Myślę, że zostałem zepsuty. Jak debugować bez IDE? Czy jesteś ograniczony do zwykłego logowania?
Odpowiedzi:
Za pomocą debugera. W przeważającej części jest to również to, co IDE robi za kulisami - po prostu otacza doświadczenie w GUI.
W Uniksie jednym z najczęściej używanych debuggerów jest GNU
gdb
, który w znacznym stopniu wyparł wcześniejsze debugery takie jakdbx
.Aby dowiedzieć się, jak wygląda / czuje się debugowanie z wiersza poleceń, możesz zajrzeć do instrukcji gdb .
Podobnie jak w innych obszarach, korzystanie z debuggera z wiersza poleceń wymaga nauczenia się składni i zestawu poleceń, ale zapewnia dużą elastyczność i możliwość pisania skryptów. Z drugiej strony, jeśli już czujesz się komfortowo pracując w edytorze takim jak vim lub emacs, może się okazać, że twój ulubiony edytor ma wtyczkę do twojego ulubionego debuggera.
źródło
pdb
jest to właściwie lepszy niż jakikolwiek debugger IDE, który znalazłem.ipdb
jest lepszy niż to;)Używałem debugera przez kilka lat, kiedy pisałem sterowniki graficzne. Miałem drugi komputer, na którym działał debugger w stosunku do pierwszego (ponieważ ekran w komputerze podstawowym nie działałby, gdy sterownik grafiki był zepsuty). Bardzo ważne było, aby móc zatrzymać kod i przejść do punktu, w którym zawiesiłem sprzęt, aby wiedzieć, co się dzieje.
W przypadku problemów czysto programowych uważam, że myślenie o problemie i testowanie systemu, aby dowiedzieć się więcej o problemie, jest o wiele bardziej przydatne niż przechodzenie między wierszami kodu. Dzięki instrukcjom drukowania mam listę wszystkiego, co wydarzyło się w wierszu polecenia lub pliku dziennika, do którego mogę zajrzeć i zrekonstruować to, co się wydarzyło, przechodząc wstecz i do przodu łatwiej niż kiedykolwiek przy użyciu debuggera.
Najtrudniejsze błędy są zazwyczaj rozwiązywane przez zrozumienie problemu z dala od komputera. Czasami z kawałkiem papieru lub tablicy, a czasem odpowiedź ujawnia się, gdy robię coś innego. Najtrudniejsze błędy można rozwiązać, uważnie przyglądając się kodowi, np. Grając w Where's Waldo. Cała reszta wydaje się najłatwiejsza w przypadku instrukcji drukowania lub instrukcji logowania.
Różni ludzie mają różne style, a różne style są lepsze do różnych zadań. Instrukcje drukowania niekoniecznie są krokiem w dół od debuggera. W zależności od tego, co robisz, mogą być nawet lepsze. Zwłaszcza w języku, który nie ma natywnego debuggera (czy Go?).
źródło
going backwards
. Często mam doświadczenie: „Hej - waittaminute, to nie jest właściwa wartość Jak to stać to ?”, I trzeba iść tam iz powrotem na wyjściu podczas czytania kodu. Debugery mają słabą pozycję wsteczną.Niektóre osoby używają gdb w wierszu poleceń lub wtyczki . Istnieją również niezależne interfejsy GUI do gdb, takie jak DDD . W zależności od języka dostępne są autonomiczne GUI debugowania specyficzne dla języka, takie jak Winpdb dla python lub jswat dla java. Ponieważ projekty te koncentrują się wyłącznie na debugowaniu, często są lepsze od zintegrowanych debuggerów.
Innym brudnym sekretem dotyczącym IDE jest to, że wszystkie z nich są warte swojej soli, pozwalają określić niestandardowy edytor, dzięki czemu można używać części IDE do niektórych zadań, ale do edytowania używać przyzwoitego edytora. Często zdarza się, że uruchamia się IDE, aby użyć debuggera, szczególnie jeśli tego używają wszyscy twoi koledzy.
źródło
Niektóre języki oferują REPL - to znaczy, że możesz pisać i wykonywać wiersz po wierszu podczas pisania, co może być pierwszym krokiem do weryfikacji fragmentu kodu. Wiele z nich oferuje również funkcje debugowania. GHC dla Haskell zawiera GHCi, którego można używać do interaktywnego debugowania programu w wierszu poleceń, podobnie jak robi to IDE.
źródło
Nie rozumiem, dlaczego istnieje awersja do debugowania za pomocą instrukcji printf. Był czas, kiedy rekompilacja i połączenie programu trwało zbyt długo, ale dziś zajmuje to tylko kilka sekund. Bardzo łatwo mi debugować za pomocą cout, printf, qDebug () itp. Typu danych wyjściowych. Instrukcje Printf przedstawiają bieżącą historię wszystkiego, co program zrobił, którą można przeanalizować po fakcie, podczas gdy uruchamianie w debuggerze powoduje konieczność ręcznego zapamiętania przebiegu programu podczas jego działania. Za pomocą printf możesz konwertować wartości zmiennych na określone jednostki, wyświetlać je w systemie szesnastkowym, dziesiętnym, cokolwiek. Instrukcje printf mogą zawierać nazwy procedur i zmiennych, a także numery linii. Możesz wymienić tylko niektóre elementy tablicy w zależności od innych zmiennych. Możesz śledzić kierunki. Możesz bardzo łatwo kontrolować wyjście, wstawiać liczniki, drukować tylko określoną liczbę razy przez pętlę, dodawać i usuwać instrukcje drukowania podczas debugowania, mieć różne poziomy wyników debugowania, zapisywać do plików itp. O wiele łatwiej jest zobaczyć historię programu zapisaną w pliku niż spróbuj zapamiętać wszystkie miejsca, przez które przechodziłeś ręcznie i być może będziesz musiał zapisać zawartość zmiennych, które zmieniają się w czasie, aby odkryć, co program zrobił. I wreszcie, dzięki instrukcjom printf, możesz pozostawić je na stałe, aby były włączane i wyłączane w celu przyszłego debugowania. o wiele łatwiej jest zobaczyć historię programu zapisaną do pliku, niż próbować zapamiętać wszystkie miejsca, w których przechodziłeś ręcznie, i być może będziesz musiał zapisać zawartość zmiennych, które zmieniają się w czasie, aby odkryć, co program zrobił. I wreszcie, dzięki instrukcjom printf, możesz pozostawić je na stałe, aby były włączane i wyłączane w celu przyszłego debugowania. o wiele łatwiej jest zobaczyć historię programu zapisaną do pliku, niż próbować zapamiętać wszystkie miejsca, w których przechodziłeś ręcznie, i być może będziesz musiał zapisać zawartość zmiennych, które zmieniają się w czasie, aby odkryć, co program zrobił. I wreszcie, dzięki instrukcjom printf, możesz pozostawić je na stałe, aby były włączane i wyłączane w celu przyszłego debugowania.
źródło
jimwise dość dobrze odpowiedział na pytanie, ale pomyślałem, że powinienem dodać, że jeśli zdecydujesz się pracować bez pełnego IDE, udostępniony przez Microsoft debugger wiersza poleceń dla systemu Windows nazywa się CDB . CDB zawiera kilka innych narzędzi, w tym WinDBG, który jest odpowiednikiem GUI, podczas pobierania zestawu Windows SDK.
źródło
Zwykle nie używam debugera, może raz na kilka tygodni, ale nie jest to pierwsza rzecz, do której chodzę.
Najważniejsze narzędzie w mojej pracy jest tak wszechobecne, że prawie zapomniałem o tym wspomnieć - ślady stosu. Ponad 90% napotkanych problemów można rozwiązać, badając ślad stosu. To narzędzie nie zawsze jest bardzo pomocne w zależności od języka, ale jeśli są one dobrze wdrożone przez język, mogą zaoszczędzić niesamowitą ilość czasu.
Wydaje mi się, że drugim najczęstszym sposobem wykrywania prostych problemów jest prawdopodobnie właśnie zmodyfikowany kod. Często przeprowadzam testy jednostkowe, więc ogólnie wiem, co właśnie złamałem.
W celu bardziej złożonego programowania i debugowania mogę dodać pewne instrukcje dziennika debugowania lub śledzenia. Uważam, że problemy z programowaniem są dobrym przewodnikiem, który pomaga mi umieścić informacje dotyczące śledzenia produkcji / debugowania, co prowadzi mnie do:
Nie zawsze masz pod ręką debugger. W środowisku produkcyjnym uruchomienie debuggera może być niemożliwe (Heck, dostęp do maszyn produkcyjnych może być niemożliwy, z wyjątkiem dzienników, w zależności od bezpieczeństwa firmy). Istnieją również języki, w których podłączenie debugera trwa zbyt długo lub może nie są dostępne dobre debuggery.
Jeśli cały czas kodowałeś za pomocą logiki i rejestrowania na poziomie debugowania / śledzenia, może to być po prostu sprawdzenie doskonałych instrukcji dziennika (możliwe zwiększenie poziomu dziennika) w celu wykrycia problemu bez dostępu do sprzętu.
Chociaż uważam, że debugery to potężne narzędzie, nie pozwól, aby były jedynym narzędziem w twoim zestawie narzędzi!
źródło
Nie ma powodu, dla którego nie można używać debugera w środowisku IDE wraz z niezależnym edytorem tekstu. Kiedyś używałem! Zap do edycji, JBuilder do debugowania na innym komputerze i serwera plików w piwnicy. Tradycyjnie debuggery były samodzielnymi programami bez przeciągania IDE i to też działa.
Warto zauważyć, że kompleksowe testowanie wypiera debugowanie. Warto rozważyć zgłoszony błąd jako błąd w testowaniu, a nie w kodzie.
Jest też
printf
. Przydatne może być utworzenie dużej liczby „rejestrowania” i przeszukiwanie go, zamiast zatrzymywania się dla każdej linii. Uważam za szczególnie przydatne, jeśli możesz modyfikować klasy bibliotek, których nie byłbyś w stanie zmodyfikować w środowisku produkcyjnym, na przykład za pomocą-Xbootclasspath/p:
hakowania klas bibliotek Java.źródło
Zgadzam się, że najlepsze problemy można rozwiązać z dala od komputera za pomocą pióra i papieru lub po prostu myśleć o problemie. Jest to bardziej pomocne niż używanie debuggerów na żywo. Często poprawia twój proces myślenia.
Możesz użyć pudb, który jest konsolą opartą na prostym interfejsie użytkownika. Możesz wybrać preferowany debugger, taki jak pdb lub ipdb, jeśli chcesz wprowadzić REPL i sprawdzić bardziej szczegółowo.
Sprawdź również Wiki PythonDebuggingTools, aby uzyskać bardziej wszechstronny zbiór dostępnych narzędzi.
źródło