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?
Antworten:
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 wiedbx
.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.
quelle
pdb
ist dies tatsächlich besser als jeder IDE-Debugger, den ich gefunden habe.ipdb
ist besser als das;)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?).
quelle
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.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.
quelle
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.
quelle
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.
quelle
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.
quelle
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!
quelle
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.quelle
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.
quelle