Jak debugować bez IDE? [Zamknięte]

61

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?

ConditionRacer
źródło
53
Debugowanie stylu oldschoolowego printf, o ile mi wiadomo :-)
Andrew Walters
25
W dniach poprzedzających IDE korzystaliśmy z debuggerów, które albo dołączały się do uruchomionego procesu, albo pakowały proces, aby umożliwić stopniowanie lub introspekcję stanu programu. (gdb, perl -d itp.). Integracja debuggerów z IDE sprawia, że ​​jest to wygodne, ale istnieją one osobno. Niepowodzenie debugerów, rejestrowanie ... upewnij się, że rejestrowanie nie zmienia stanu programu, gdy zostanie wycofany, i ponownie wprowadź błąd, który próbujesz znaleźć.
7
debugger z wiersza poleceń (na nich opartych jest kilka debugerów IDE)
maniak zapadkowy
14
Powoli i ostrożnie.
FrustratedWithFormsDesigner
3
Chociaż wydruki są dość powszechne, ich użycie może ukryć niektóre subtelniejsze błędy, takie jak warunki wyścigu.
James

Odpowiedzi:

86

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 jak dbx.

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.

jimwise
źródło
18
+1 za „Za pomocą debugera”. I w IDE oznacza „zintegrowany” :)
joshin4colours
1
Jeśli piszesz w Pythonie, pdbjest to właściwie lepszy niż jakikolwiek debugger IDE, który znalazłem.
asthasr 17.01.13
1
@syrion I ipdbjest lepszy niż to;)
Izkata,
Doskonale - nie wiedziałem, że istnieje, Izkata. Dzięki.
asthasr
@ joshin4colours zintegrowany! = kolekcja, nie?
Cole Johnson
35

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?).

GlenPeterson
źródło
7
To. Absolutnie to. Uważam, że przynajmniej dla mnie problemy są zwykle błędami logicznymi lub interakcjami, których debuger nie uczyniłby bardziej widocznym. Musisz zrozumieć, dlaczego coś idzie nie tak, a nie tylko co .
Fałszywe imię
2
+1 całkowicie za 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ą.
Izkata,
tak, gdb jest dobry do badania zrzuconego rdzenia, ale w takich sytuacjach stwierdziłem, że bezpłatne użycie instrukcji print naprawdę pomogło.
Brian
Debugery są przydatne, ale efemeryczne. Dzięki dobrym ramom logowania mogę rozbudować sesję debugowania. Użyj debuggera, aby zrozumieć sytuację, uzupełnij instrukcje drukowania, aby sesja debugowania była trwała. Uważam, że z czasem coraz mniej
pozywam
Tak, myślenie przy pomocy kawałka papieru lub tablicy lub po prostu w umyśle to najlepszy sposób na debugowanie. Często poprawia twój proces myślenia. Debuger czasami jest łatwym wyjściem, które może nie rozwiązać pierwotnego problemu, dlaczego błędy występują w twoim programie :)
Nishant
11

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.

Karl Bielefeldt
źródło
1
+1 Inną opcją jest oczywiście ustawienie schematu kolorów i skrótów klawiszowych w edytorze IDE i udawanie :)
darvids0n 17.01.2013
1
@ darvids0n, używam IDE od ponad dwudziestu lat i JESZCZE znajduję taki z edytorem, który nawet zaczyna sugerować, że może kiedyś pomyśli o tym, że kiedyś może pomyśleć o próbie rozpoczęcia próby trzymaj świecę GNU Emacs.
John R. Strohm,
6

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.

CodexArcanum
źródło
2

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.

Robert Felten
źródło
3
„Był czas, kiedy rekompilacja i połączenie programu trwało zbyt długo, ale dziś zajmuje to tylko kilka sekund”. Zależy od twojego języka i wielkości projektu. Jeśli zmienię plik nagłówka w moim bieżącym projekcie, przebudowanie na komputerze z 32 procesorami i 256 GB pamięci RAM zajmie około 65 minut (nie żartuję)
Nemanja Trifunovic
Ludzie nie mają „awersji” do debugowania za pomocą instrukcji print, po prostu wolą debugger. Znam o wiele więcej „osób debugujących”, którzy nigdy nie używają debugerów, niż „osób debugujących”, którzy nigdy nie debugują się przy użyciu printfs.
Karl Bielefeldt,
1
Zaskakująco trudno jest użyć debugera dla wystarczająco rozproszonego systemu, ale możliwe jest (z pewną niedokładnością z powodu problemu z synchronizacją zegara) korelowanie logów. Jeśli twój system oprogramowania składa się z plików binarnych działających na 100 różnych komputerach, logowanie / „debugowanie printf” może być łatwiejsze niż używanie debuggerów i próbowanie utrzymania wszystkiego w wystarczającym stopniu blokady, aby nie wprowadzać innych problemów.
Vatine
2

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.

Drew Marsh
źródło
4
czy mógłbyś bardziej szczegółowo wyjaśnić, w jaki sposób odpowiada to na zadane pytanie?
komara
Masz rację, sama w sobie nie odpowiada na pytanie. Czułem, że odpowiedź @ jimwise była dobrą odpowiedzią na pytanie, ale nie zawierała żadnych informacji o tym, gdzie znaleźć debuger wiersza poleceń dla systemu Windows. Pomyślałem więc, że postawię dodatkową odpowiedź dla tych, którzy się z tym spotkają i zastanawiają się, jak to zrobić w systemie Windows. Zaktualizuję swoją odpowiedź, aby powiedzieć tyle samo.
Drew Marsh,
2

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!

Bill K.
źródło
1

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.

Tom Hawtin - tackline
źródło
„Warto zauważyć, że kompleksowe testy wypierają debugowanie”. - Powiedziałbym, że redukuje, a nie „wypiera”. Zdarzają się sytuacje, w których uruchomienie kodu za pomocą debugera jest korzystne, nawet podczas wykonywania TDD - np. Gdy test zapewnia całkowicie nieoczekiwany wynik, ustalenie, gdzie dokładnie poszło nie tak, może być bardzo przydatne - oczywiście, chyba że jest to niewielka część kodu, który właśnie napisałeś, co oznacza, że ​​przeoczyłeś przypadek krawędziowy podczas poprzednich testów, ale tak się dzieje ...
Jules
1

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.

Nishant
źródło
Pierwotne pytanie dotyczyło Go, a nie Pythona.
TMN
Racja, jakoś mi tego brakowało. Okazało się, że szukałem debugera w języku Python.
Nishant,