Wie kann man ohne IDE debuggen? [geschlossen]


61

Jedes Mal, wenn ich nach einer IDE suche (derzeit bastele ich an Go), finde ich einen Thread voller Leute, die Vi, Emacs, Notepad ++ usw. empfehlen.

Ich habe noch nie außerhalb einer IDE entwickelt. Ich glaube, ich wurde verwöhnt. Wie kann man ohne IDE debuggen? Beschränken Sie sich nur auf die Protokollierung?


53
Oldschool Printf-Style-Debugging, soweit ich weiß :-)
Andrew Walters

25
In den Tagen vor den IDEs haben wir Debugger verwendet, die entweder an einen laufenden Prozess angehängt oder den Prozess umbrochen haben, um eine schrittweise Überprüfung des Programmstatus zu ermöglichen. (gdb, perl -d, etc ...) Die Integration von Debuggern in IDEs macht es bequem, aber sie existieren separat. Fehlerhafte Debugger, Protokollierung ... Vergewissern Sie sich nur, dass die Protokollierung den Status des Programms nicht ändert, wenn es wieder entfernt wird, und führen Sie den Fehler, den Sie suchen, erneut ein.

7
Kommandozeilen-Debugger (mehrere IDE-Debugger basieren auf ihnen)
Ratschen-Freak

14
Langsam und vorsichtig.
FrustratedWithFormsDesigner

3
Während Drucke durchaus üblich sind, kann ihre Verwendung einige Fehler verbergen, die subtiler sind, wie z. B. Rennbedingungen.
James

Antworten:


86

Mit einem Debugger. Zum größten Teil ist dies auch das, was eine IDE hinter den Kulissen tut - sie bündelt lediglich die Erfahrung in einer GUI.

Unter Unix ist GNU einer der am häufigsten verwendeten Debugger gdb, der die früheren Unix-Debugger wie dbx.

Um eine Vorstellung davon zu bekommen, wie das Debuggen von der Kommandozeile aus aussieht / sich anfühlt, können Sie das Handbuch zu gdb lesen .

Wie in anderen Bereichen erfordert die Verwendung eines Debuggers über die Befehlszeile das Erlernen einer Syntax und einer Reihe von Befehlen, bringt jedoch viel Flexibilität und Skriptfähigkeit mit sich. Wenn Sie jedoch bereits mit der Arbeit in einem Editor wie vim oder emacs vertraut sind, verfügt Ihr bevorzugter Editor möglicherweise über ein Plug-In für Ihren bevorzugten Debugger.


18
+1 für "Mit einem Debugger". Das I in IDE steht für "Integrated" :)
Joshin4Colours

1
Wenn Sie in Python schreiben, pdbist dies tatsächlich besser als jeder IDE-Debugger, den ich gefunden habe.
Asthasr

1
@syrion Und ipdbist besser als das;)
Izkata

Ausgezeichnet - ich wusste nicht, dass es das gibt, Izkata. Vielen Dank.
Asthasr

@ joshin4colours integriert! = Sammlung, nein?
Cole Johnson

35

Ich habe mehrere Jahre lang einen Debugger verwendet, als ich Grafiktreiber schrieb. Ich hatte einen zweiten Computer, auf dem der Debugger gegen den ersten ausgeführt wurde (da der Bildschirm auf dem primären Computer nicht funktionierte, wenn der Grafiktreiber defekt war). Es war von entscheidender Bedeutung, den Code anhalten zu können und bis zu dem Punkt zu gelangen, an dem ich die Hardware aufgehängt habe, damit ich weiß, was passiert.

Bei reinen Softwareproblemen finde ich, dass es viel nützlicher ist, über das Problem nachzudenken und das System zu testen, um mehr über das Problem zu erfahren, als Code Zeile für Zeile durchzugehen. Mit print-Anweisungen habe ich eine Liste aller Ereignisse in der Befehlszeile oder in der Protokolldatei, die ich anzeigen und rekonstruieren kann. Mit einem Debugger kann ich einfacher vor- und zurückgehen als je zuvor.

Die schwerwiegendsten Fehler werden normalerweise dadurch behoben, dass Sie das Problem außerhalb des Computers verstehen. Manchmal mit einem Stück Papier oder Whiteboard, und manchmal zeigt sich die Antwort, während ich etwas anderes tue. Die kniffligsten Fehler werden behoben, indem man sich den Code genau ansieht, wie wenn man Where's Waldo spielt. Alles andere scheint mit print-Anweisungen oder Protokollanweisungen am einfachsten zu sein.

Unterschiedliche Menschen haben unterschiedliche Stile, und unterschiedliche Stile sind für unterschiedliche Aufgaben besser geeignet. Druckanweisungen sind nicht notwendigerweise ein Rückschritt gegenüber einem Debugger. Je nachdem, was Sie tun, können sie sogar besser sein. Besonders in einer Sprache, die keinen nativen Debugger hat (geht das?).


7
Diese. Absolut das. Ich stelle fest, dass es sich bei Problemen zumindest für mich tendenziell um logische Fehler oder Interaktionen handelt, die ein Debugger nicht offensichtlicher machen würde. Man muss verstehen, warum etwas schief geht, nicht nur was .
Falscher Name

2
+1 ganz für going backwards. Ich habe oft die Erfahrung: „Hey - waittaminute, ist dies nicht der richtige Wert Wie hat diese wird das ?“, Und muß hin und her in dem Ausgang gehen , während Sie den Code zu lesen. Debugger sind rückwärts schlecht.
Izkata

Ja, GDB ist gut für die Untersuchung von Dumped Core, aber in solchen Situationen fand ich, dass die Verwendung von Print-Anweisungen wirklich hilfreich war.
Brian

Debugger sind nützlich, aber kurzlebig. Mit einem guten Protokollierungsframework kann ich meine Debugsitzung aufbauen. Verwenden Sie den Debugger, um die Situation besser zu verstehen, und ergänzen Sie ihn mit Druckanweisungen, um die Debugsitzung dauerhaft zu machen. Mit der Zeit verklage ich den Debugger immer weniger und werde immer produktiver
Newtopian

Ja, mit einem Stück Papier oder Whiteboard oder nur in Gedanken zu denken, ist der beste Weg, um Fehler zu beheben. Es korrigiert oft Ihren Denkprozess. Debugger ist manchmal ein einfacher Ausweg, der möglicherweise nicht das ursprüngliche Problem löst, warum Fehler in Ihrem Programm auftreten :)
Nishant

11

Einige Leute benutzen gdb in der Kommandozeile oder ein Plugin . Es gibt auch eigenständige GUI-Frontends für GDB, wie DDD . Abhängig von Ihrer Sprache gibt es sprachspezifische eigenständige Debugger-GUIs wie Winpdb für Python oder jswat für Java. Da sich diese Projekte nur auf das Debuggen konzentrieren, sind sie integrierten Debuggern oft überlegen.

Das andere dreckige kleine Geheimnis bei IDEs ist, dass sie alle es wert sind, einen benutzerdefinierten Editor anzugeben, sodass Sie Teile der IDE für bestimmte Aufgaben verwenden können, aber einen anständigen Editor für die Bearbeitung verwenden können. Es ist nicht ungewöhnlich, eine IDE nur zu starten, um ihren Debugger zu verwenden, insbesondere, wenn dies von allen Kollegen verwendet wird.


1
+1 Die andere Möglichkeit besteht natürlich darin, das Farbschema und die Tastenkombinationen im IDE-Editor
festzulegen

1
@ darvids0n, ich benutze IDEs seit über zwanzig Jahren und habe NOCH einen mit einem Editor gefunden, der sogar darauf hindeutet, vielleicht eines Tages daran zu denken, dass es irgendwann im nächsten Jahrhundert darum gehen könnte, zu versuchen, es zu versuchen Halten Sie GNU Emacs eine Kerze hin.
John R. Strohm

6

Einige Sprachen bieten eine REPL - das heißt, Sie können Code Zeile für Zeile schreiben und ausführen, während Sie ihn schreiben. Dies kann ein erster Schritt bei der Überprüfung eines Codeteils sein. Viele davon bieten auch Debugging-Möglichkeiten. Der GHC für Haskell enthält GHCi, mit dem ein Programm in der Befehlszeile interaktiv debuggt werden kann, ähnlich wie bei einer IDE.


2

Ich verstehe nicht, warum es eine Abneigung gegen das Debuggen mit printf-Anweisungen gibt. Es gab eine Zeit, in der es zu lange gedauert hat, ein Programm neu zu kompilieren und zu verknüpfen, aber heute dauert es nur noch Sekunden. Ich finde es sehr einfach, mit der Art der Ausgabe cout, printf, qDebug () usw. zu debuggen. Mit printf-Anweisungen können Sie den Verlauf aller Aktionen des Programms nachträglich analysieren, während Sie sich beim Ausführen im Debugger den Programmablauf manuell merken müssen. Mit printfs können Sie den Wert von Variablen in bestimmte Einheiten konvertieren und sie in hexadezimaler oder dezimaler Schreibweise anzeigen. Die printf-Anweisungen können auch die Namen der Routinen und Variablen sowie die Zeilennummern auflisten. Sie können abhängig von anderen Variablen nur bestimmte Array-Elemente auflisten. Sie können Indirektionen folgen. Sie können die Ausgabe sehr einfach steuern, Setzen Sie Zähler ein, drucken Sie nur zu bestimmten Zeiten durch eine Schleife, fügen Sie beim Debuggen Druckanweisungen hinzu und entfernen Sie sie, geben Sie sie auf verschiedenen Ebenen aus, schreiben Sie in Dateien usw. Der Verlauf Ihres Programms, der in eine Datei geschrieben wurde, ist viel einfacher zu sehen als in Versuchen Sie, sich alle Stellen zu merken, die Sie manuell durchlaufen haben, und notieren Sie sich möglicherweise den Inhalt von Variablen, die sich im Laufe der Zeit ändern, um herauszufinden, was das Programm getan hat. Und schließlich können Sie mit printf-Anweisungen diese für das zukünftige Debuggen dauerhaft ein- und ausschalten. Es ist viel einfacher, den Verlauf Ihres Programms zu sehen, das in eine Datei geschrieben wurde, als sich an alle Stellen zu erinnern, die Sie manuell durchlaufen haben, und möglicherweise den Inhalt von Variablen zu notieren, wenn sie sich im Laufe der Zeit ändern, um herauszufinden, was das Programm ist hat getan. Und schließlich können Sie mit printf-Anweisungen diese für das zukünftige Debuggen dauerhaft ein- und ausschalten. Es ist viel einfacher, den Verlauf Ihres Programms zu sehen, das in eine Datei geschrieben wurde, als sich an alle Stellen zu erinnern, die Sie manuell durchlaufen haben, und möglicherweise den Inhalt von Variablen zu notieren, wenn sie sich im Laufe der Zeit ändern, um herauszufinden, was das Programm ist hat getan. Und schließlich können Sie mit printf-Anweisungen diese für das zukünftige Debuggen dauerhaft ein- und ausschalten.


3
"Es gab eine Zeit, in der es zu lange gedauert hat, ein Programm neu zu kompilieren und zu verknüpfen, aber heute dauert es nur noch Sekunden". Hängt von Ihrer Sprache und Größe des Projekts ab. Wenn ich eine Header-Datei in meinem aktuellen Projekt ändere, dauert die Neuerstellung auf einem 32-CPU-Computer mit 256 GB RAM etwa 65 Minuten (ich mache keine Witze)
Nemanja Trifunovic

Die Leute haben keine "Abneigungen" gegen das Debuggen mit Print-Anweisungen, sie bevorzugen nur einen Debugger. Ich kenne viel mehr "printf-Leute", die niemals Debugger verwenden, als "debugger-Leute", die niemals mit printfs debuggen.
Karl Bielefeldt

1
Es ist überraschend schwierig, einen Debugger für ein ausreichend verteiltes System zu verwenden, aber es ist (mit einer gewissen Ungenauigkeit aufgrund von Taktsynchronisationsproblemen) möglich, Protokolle zu korrelieren. Wenn Ihr Softwaresystem aus Binärdateien besteht, die auf 100 verschiedenen Computern ausgeführt werden, ist das Protokollieren / "printf-Debuggen" möglicherweise einfacher als das Verwenden von Debuggern und der Versuch, alles in einem ausreichenden Sperrschritt zu halten, damit Sie keine anderen Probleme verursachen.
Vatine

2

jimwise hat die Frage recht gut beantwortet , aber ich dachte, ich sollte hinzufügen, dass der von Microsoft bereitgestellte Befehlszeilendebugger für Windows CDB heißt, wenn Sie sich für die Arbeit ohne eine vollständige IDE entscheiden . CDB wird mit mehreren anderen Tools ausgeliefert, einschließlich WinDBG , dem GUI-Äquivalent, wenn Sie das Windows SDK herunterladen.


4
Könnten Sie bitte näher erläutern, wie dies die gestellte Frage beantwortet?
Mücke

Du hast recht, allein beantwortet es die Frage nicht. Ich fand, dass die Antwort von @ jimwise eine gute Antwort auf die Frage war, enthielt jedoch keine Informationen darüber, wo ein Befehlszeilendebugger für Windows zu finden ist. Ich dachte mir, ich würde eine zusätzliche Antwort für diejenigen finden, die auf diese Frage stoßen und sich fragen, wie das unter Windows gemacht werden soll. Ich werde meine Antwort aktualisieren, um so viel zu sagen.
Drew Marsh

2

Normalerweise benutze ich keinen Debugger, vielleicht alle paar Wochen, aber es ist nicht das erste, zu dem ich gehe.

Das wichtigste Werkzeug in meinem Job ist so allgegenwärtig, dass ich es fast vergessen habe, es zu erwähnen - Stapelspuren. Über 90% der Probleme, auf die ich stoße, können durch Untersuchen eines Stack-Trace gelöst werden. Dieses Tool ist abhängig von Ihrer Sprache nicht immer sehr hilfreich, aber wenn sie von einer Sprache gut implementiert werden, können sie Ihnen erstaunlich viel Zeit sparen.

Ich denke, der zweithäufigste Weg, einfache Probleme zu entdecken, ist, dass es wahrscheinlich der Code ist, den ich gerade geändert habe. Ich führe ziemlich oft Unit-Tests durch, damit ich im Allgemeinen weiß, was ich gerade kaputt gemacht habe.

Für komplexere Entwicklungen und Fehlerbehebungen füge ich möglicherweise einige Protokollanweisungen auf Debug- oder Trace-Ebene hinzu. Ich halte Entwicklungsprobleme für einen guten Leitfaden, um Informationen zur Produktionsablaufverfolgung / Debug-Protokollierung zu finden. Dies führt mich zu folgenden Schritten:

Sie haben nicht immer einen Debugger zur Hand. In der Produktion ist es möglicherweise unmöglich, einen Debugger auszuführen (Heck, es ist möglicherweise unmöglich, auf Produktionsmaschinen zuzugreifen, außer auf Protokolle, je nachdem, wie sicher Ihr Unternehmen ist). Es gibt auch Sprachen, in denen das Einbinden eines Debuggers einfach zu lange dauert oder es einfach keine guten Debugger gibt.

Wenn Sie die ganze Zeit über mit Logik und Protokollierung auf Debug- / Trace-Ebene codiert haben, können Sie einfach Ihre hervorragenden Protokollanweisungen überprüfen (möglicherweise die Protokollstufe erhöhen), um das Problem zu ermitteln, ohne überhaupt auf die Hardware zuzugreifen.

Obwohl ich denke, dass Debugger ein leistungsfähiges Tool sind, lassen Sie sie nicht das einzige Tool in Ihrer Toolbox sein!


1

Es gibt keinen Grund, warum Sie den Debugger nicht zusammen mit einem eigenständigen Texteditor in einer IDE verwenden können. Früher habe ich! Zap zum Bearbeiten, JBuilder zum Debuggen auf einem anderen Computer und einen Dateiserver im Keller verwendet. Traditionell waren Debugger eigenständige Programme, ohne eine IDE mitzunehmen, und das funktioniert auch.

Es ist bemerkenswert, dass umfassende Tests das Debuggen verdrängen. Es lohnt sich, einen gemeldeten Fehler als Fehler in Ihren Tests und nicht in Ihrem Code zu betrachten.

Es gibt auch printf. Es kann nützlich sein, eine große Menge an "Protokollierung" zu erstellen und diese zu durchsuchen, anstatt für jede Zeile anzuhalten. Ich finde es besonders nützlich, wenn Sie Bibliotheksklassen ändern können, die Sie in der Produktion nicht ändern könnten, beispielsweise -Xbootclasspath/p:um Java-Bibliotheksklassen zu hacken.


"Es ist erwähnenswert, dass umfassende Tests das Debuggen verdrängen." - Ich würde sagen, reduziert, anstatt "verdrängt". Es gibt bestimmte Fälle, in denen das Ausführen von Code durch einen Debugger von Vorteil ist, selbst wenn TDD ausgeführt wird - z. B. wenn ein Test ein völlig unerwartetes Ergebnis liefert und es sehr nützlich sein kann, herauszufinden, wo genau der Fehler aufgetreten ist -, es sei denn, es liegt im kleinen Bereich Der Code, den Sie gerade geschrieben haben, bedeutet, dass Sie in Ihren vorherigen Tests einen Randfall verpasst haben, aber das passiert ...
Jules

1

Stimmen Sie zu, dass die besten Probleme außerhalb des Computers mit einem Stift und Papier gelöst werden können, oder denken Sie nur an das Problem. Dies ist hilfreicher als die Verwendung von Live-Debuggern. Es korrigiert oft Ihren Denkprozess.

Sie können pudb verwenden , eine Konsole mit einer einfachen Benutzeroberfläche. Sie können Ihren bevorzugten Debugger wie pdb oder ipdb auswählen, wenn Sie eine REPL eingeben und genauer untersuchen möchten.

Besuchen Sie auch das PythonDebuggingTools- Wiki, um eine umfassendere Sammlung verfügbarer Tools zu erhalten.


Die ursprüngliche Frage betraf Go und nicht Python.
TMN

Richtig, das habe ich irgendwie verpasst. Es tauchte bei meiner Suche auf, als ich nach einem Python-Debugger suchte.
Nishant
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.