Tipps zum Debuggen mit sehr wenig Info? [geschlossen]

11

Ich habe ein Projekt mit einer ziemlich großen Codebasis geerbt, und der ursprüngliche Entwickler antwortet selten, wenn überhaupt, auf E-Mails. Es gibt eine Menge verschiedener Möglichkeiten, einige Dinge darin zu tun, und ich kenne nicht alle. Viel duplizierter Code entlang dieser Pfade (anstatt Funktionen, die beispielsweise von 5 Seiten enthalten sind, die relativ dasselbe tun, es ist Code, der über 5 Seiten kopiert wird) und einige subtile Probleme in der Datenbank (wir haben alle von Spaghetti-Code gehört , aber haben Sie jemals von einer Spaghetti-Datenbank gehört?)

All dies kann ich die meiste Zeit problemlos bewältigen.

Das Problem ist, wenn ein Client irgendwo einen Fehler findet. Normalerweise senden sie einen Screenshot der Endausgabe und sagen: "Könnten Sie sich das ansehen?" während Sie das spezifische Element auf der Seite hervorheben, das falsch ist, und manchmal das, was erwartet wurde. Es werden nur sehr wenige Informationen gegeben, und der Versuch, mit ihnen zu sprechen und mehr zu erhalten (z. B. was sie getan haben, um das Ergebnis zu erzielen), ist wie Zähne ziehen.

Im Grunde läuft es darauf hinaus:

  • Große und komplexe Codebasis, mit der ich nicht 100% vertraut bin
  • Viele, viele Möglichkeiten, wie etwas schief gehen kann
  • Sehr wenig Informationen darüber, wie ein Fehler entstanden ist

Hat jemand Tipps, Tricks, Vorschläge usw., wie man so etwas debuggt?

Tarka
quelle
"Haben Sie jemals von einer Spaghetti-Datenbank gehört?" Ich habe einmal an einem Arbeitsplatz gearbeitet, an dem sich die Datenbank des Produkts seit über zehn Jahren kontinuierlich weiterentwickelt hat, und es wurden kaum oder gar keine Anstrengungen unternommen, sie zu überarbeiten, wenn die Anforderungen wuchsen (und wuchsen und wuchsen und wuchsen). Ich hatte eine Mitarbeiterin, deren gesamte Aufgabe darin bestand, "die Datenbank zu verstehen, SQL-Abfragen zu erstellen, um alles Nützliche daraus zu extrahieren" - und sie war unverzichtbar. Ich fühle deinen Schmerz.
BlairHippo
Als Ergänzung [lesen Sie die "Psychic Debugging" -Postings auf Raymond Chens Blog] ( goo.gl/2KIH )!
Wizard79
Wie groß ist die Codebasis? Zehn KLOC oder 50 MLOC?
Basile Starynkevitch

Antworten:

11

Wenn ich so etwas bekomme, verlange ich normalerweise mehr Informationen. Ich bin mir nicht sicher, wie Sie dort arbeiten, aber wenn ich nicht genügend Informationen habe, um das Problem lokal zu reproduzieren, kann ich das mit "Nicht reproduzierbar" gekennzeichnete Ticket mit der Bitte um weitere Informationen zurücksenden, und sie wissen, dass bis dahin nichts behoben wird Ich kann es an meinem Ende brechen.

Wenn Ihre Kunden Probleme mit der Beschreibung von Schritten haben, bitten Sie sie um ein Screencap-Video. Es gibt einige kostenlose Produkte, mit denen sie erstellt werden können, z. B. Jing. Es macht es viel einfacher, wenn Sie genau sehen können, was sie getan haben.

EDIT: Jing war eine gute Idee, als ich das vor ein paar Jahren schrieb. Seitdem haben sie ihr Installationsprogramm so geändert, dass Ihr System mit "Bonus" -Crapware geladen wird, nach der Sie nie gefragt haben. Daher kann ich es nicht mehr empfehlen. Es gibt jedoch viele anständige Bildschirmrekorder.

Mason Wheeler
quelle
2
+1 Guter Rat, und ich würde ihn erweitern auf: Können sie den Fehler zuverlässig beheben oder ist er zeitweise? Wenn es zuverlässig passiert, können sie Sie durch die Schritte führen, die sie unternommen haben, um dorthin zu gelangen?
BlairHippo
1
Das Anzeigen in Protokolldateien kann ein wenig helfen.
Pramodc84
11

Ein guter Anfang könnte dieses Buch sein .

Alt-Text

Ich verwende die folgende Definition, da es so klingt, als ob der Entwickler nicht mehr da ist, um sie zu unterstützen.

Legacy-Code ist Quellcode, der sich auf einen nicht mehr unterstützten bezieht.

Gordon
quelle
Trauriger Teil ist, dass dies nicht einmal Legacy-Code ist. Ich bin mir ziemlich sicher, dass das meiste, woran ich arbeite, Anfang dieses Jahres begonnen wurde.
Tarka
3
@ Slokun - Die Definition von "Legacy Code" im Buch ist nicht ganz die gleiche wie die traditionelle Definition. Es ist ein sehr gutes Buch.
Austin Salonen
4

Ich hatte vor einigen Jahren ein ähnliches Problem und der größte Anstieg der Produktivität und der Code-Bereinigung war die Integration der Fehlerverfolgung in das System.

Wir haben Fogbugz verwendet (ich nehme an, sie machen immer noch Fogcreek!) Und wir konnten einen Mechanismus zur Ausnahmebehandlung erstellen, bei dem der Benutzer jedes Mal, wenn eine Ausnahme ausgelöst wurde, eine Taste drücken konnte und diese sofort in unserem System angemeldet wurde - keine Anrufe mehr und keine Screenshots mehr. Mit dieser Option nehmen Sie die benötigten Informationen, anstatt zu versuchen, sie aus dem Benutzer zu extrahieren. Klingt so, als würde Ihnen eine Variante etwas Gutes tun, insbesondere mit einer Screenshot-Aufnahmeoption.

Das andere, was Sie tun möchten, ist das Hinzufügen der Protokollierung. Möglicherweise möchten Sie jeden Methodenaufruf mit Argumentwerten protokollieren. Da es so klingt, als würden Sie mit Legacy-Code arbeiten (Code ohne Tests), können Sie mit dieser Protokollierung geeignete Komponententests hinzufügen, damit Sie keine Probleme wiederholen.

Austin Salonen
quelle
Für eine große, bereits vorhandene Codebasis wird das Hinzufügen einer guten Protokollierung eine HÖLLE von viel Arbeit sein. +1, da dies möglicherweise die einzig praktikable Option ist, wenn die Fehler nur sporadisch auftreten.
BlairHippo
@BlairHippo: Aus meiner Erfahrung ist es das, aber das ist der Preis, den Sie mit einer Codebasis zahlen, die er beschreibt. Es ist fast so miserabel wie zunächst in einer solchen Codebasis zu arbeiten ...
Austin Salonen
Die Protokollierung ist schwierig. Das Hinzufügen einer automatisierten Ausnahmeprotokollierung ist trivial und den (minimalen) Aufwand tausendmal wert. Oder zumindest in Delphi. Ich bin mir nicht sicher, welche Lösungen für andere Sprachen existieren, aber es sollte für keine Sprache mit anständiger Ausnahmebehandlung zu schwierig sein.
Mason Wheeler
1

Mein ernsthaftester Rat ist, mit dem Refactoring zu beginnen, wo Sie können. Ich kann nicht zählen, wie oft ich eine Neukopie der Funktionalität gesehen habe, nur um herauszufinden, dass es sich nicht zu 100% um eine vollständige Kopie handelt. Es war 99,9% Kopie und 1 kleiner, kleiner Fehler, der zu einem Fehler führte. Fügen Sie allen Unit-Tests hinzu, und wenn Sie eine QS-Abteilung haben, versuchen Sie, einige automatisierte Testskripte für die Teile des Codes zu erstellen, an denen Sie arbeiten.

Überprüfen Sie andererseits, wie viel Protokollierung in den Code eingefügt werden kann. Das heißt, wenn die Protokollierung nicht sehr umfangreich ist, können Sie dem Code ein Flag hinzufügen, um eine ausführlichere Protokollierung für Ihre eigenen Debugging-Zwecke zu erhalten. Dies ist etwas, das ein Benutzer ein- und ausschalten kann, wenn Sie einen Dialog in Gang setzen können. Es hat mir öfter geholfen, als ich zählen kann. Normalerweise bekomme ich "es funktioniert nicht" ohne ein Bild des Problems. Ich sage nur "Sende mir die Protokolldatei."

Wheaties
quelle
0

Schreiben Sie zunächst Unit-Tests. Wählen Sie eine Klasse oder eine Funktion aus und schreiben Sie eine Reihe von Tests, die Ihrer Meinung nach funktionieren sollten. Wenn die Tests fehlschlagen, finden Sie heraus, warum. Wenn es ein Fehler ist - beheben Sie ihn. Wenn sich Ihre Erwartungen als falsch herausstellen, finden Sie heraus, was die Sache tatsächlich tut, und ändern Sie die Tests entsprechend.

Sobald Sie eine Reihe anständiger Tests mit Arbeitseinheiten durchgeführt haben, verfügen Sie über ein Sicherheitsnetz für einige Umgestaltungen, um den Code sauberer zu machen.

Wiederholen Sie den Vorgang, bis Sie die Codebasis verstanden haben.

Dies sollten Sie natürlich im Voraus tun, nicht als Reaktion auf einen Fehlerbericht.

Dima
quelle