30 Stimmen

Gibt es Muster für die Fehlersuche?

Ich weiß, dass es viele beliebte und nützliche Design Patters gibt.

Gibt es so etwas auch für Debugging-Szenarien? Vielleicht keine Muster, aber Methoden, die kategorisiert sind und die wiederholt für ähnliche Fälle verwendet werden können.

4 Stimmen

Um Ihre Frage zu beantworten: Ja. Es gibt verschiedene Debugging-Strategien, die je nach Art des Problems angewendet werden. Wenn Sie einen Katalog dieser Strategien haben möchten, sollten Sie dies zu einem Community-Wiki machen.

0 Stimmen

Es wird ein Gemeinschafts-Wiki werden, wenn es nötig ist :)

6 Stimmen

Bei fast jeder Frage, die ich in den letzten Wochen eröffnet habe, hat jemand darum gebeten, dass der Beitrag in ein Gemeinschafts-Wiki aufgenommen wird. Ich denke, die Leute sollten sich um ihre eigenen Angelegenheiten kümmern und die Person, die die Frage gestellt hat, respektieren.

1voto

Robert Gowland Punkte 7229

Das sind nur ein paar, die ich gefunden habe:

  • Wenn zwei identische Systeme unterschiedliche Ergebnisse erzeugen, ist zu prüfen dass (in der Reihenfolge der Wahrscheinlichkeit):
    • Die Versionen aller Komponenten sind, in zwischen den beiden Systemen identisch Systemen identisch,
    • Die Konfiguration ist identisch zwischen den beiden Systemen, und
    • Es gibt keine Restdaten auf einem System, die die auf dem anderen System nicht vorhanden waren.
  • gdb und gcc parsen Code besser als ich. Lassen Sie Software ihre Arbeit tun, damit Sie erledigen können.
  • Wenn an einem Ende eines Prozesses Daten herauskommen, die nicht den Erwartungen entsprechen, sollten Sie die Daten entlang des gesamten Prozesses überprüfen, um sicherzustellen, dass sie den Erwartungen entsprechen, anstatt sich auf eine Funktion im Prozess zu konzentrieren, die dem eigentlichen Problem nachgelagert ist.
  • Konzentrieren Sie sich nicht auf einen bestimmten Teil des Codes, wenn Sie nicht überprüft haben, ob er die Ursache des Fehlers ist.
  • Mehr Schlaf bekommen. Alert-Debugging ist immer effektiver.

Mehr dazu finden Sie auf meiner Website unter Softwareentwicklung -> Debugging, falls Sie daran interessiert sind.

1voto

skiphoppy Punkte 89474

Dies ist eigentlich keine Debugging-Technik, aber ich denke, wir müssen eine Debugging-Voraussetzung erwähnen, die, wenn sie nicht erfüllt ist, Ihre Arbeit sehr erschweren wird.

Eine sinnvolle Fehlersuche ist erst möglich, wenn der Fehler reproduzierbar ist und ein Schritt-für-Schritt-Rezept vorliegt. Wenn Sie einen schlechten Fehlerbericht bekommen, kann es sein, dass Sie das Rezept selbst herausfinden müssen, aber wenn Sie jemanden unterstützen, sollten Sie ihn wissen lassen, dass es länger dauern wird, das Rezept herauszufinden, als wenn er es für Sie tut, und dass es vielleicht sogar unmöglich ist. Ein nützlicher Fehlerbericht muss die drei Fragen beantworten, die ich die Fehlerbericht-Formel nenne: 1) Was haben Sie getan? 2) Was haben Sie erwartet, was passieren würde? 3) Was ist stattdessen passiert?

Natürlich sind einige Wanzen Heisenbugs, die offenbar vorübergehend sind. Sie sollten dennoch versuchen, eine Aussage zu treffen wie: "Wenn ich Folgendes tue, tritt in etwa 10 % der Fälle dieses unerwünschte Ergebnis ein."

Sobald Sie das Rezept haben, besteht der nächste Schritt oft darin, es auf einen minimalen Testfall zu reduzieren, wie andere bereits erwähnt haben.

1 Stimmen

Nicht nur reproduzierbar, sondern auch in einer angemessenen Zeitspanne. Ich musste einmal einen Fehler aufspüren, der in der Regel trat erst nach etwa 45 Minuten nach dem Start eines CPU-intensiven Programms auf. Schließlich habe ich etwas getan (ich erinnere mich nicht), um diese Zeitspanne auf <5 Minuten zu reduzieren, bevor ich die Ursache des Fehlers in den Griff bekam.

0 Stimmen

Es besteht auch die Möglichkeit, dass der Fehler auf mehr als eine Weise reproduziert werden kann. Ich denke, dies sollte ebenfalls in Betracht gezogen werden.

0 Stimmen

Ja, wenn es mehr als ein Weg ist, dann haben Sie zwei konzeptionelle Fehlerberichte und zwei Testfälle. Beide sollten auf einen minimalen Testfall heruntergebrochen werden. Sie können einen machen und dann den ganzen Weg gehen, um ihn zu beheben und sehen, ob der andere ein Problem ist, oder Sie können beide zuerst minimieren und dann versuchen zu beheben.

0voto

skiphoppy Punkte 89474

Andere (Xynth, Broam, Moshe) haben die Notwendigkeit erwähnt, einen minimalen Testfall zu erhalten, der hoffentlich in Ihre Unit-Test-Suite eingefügt werden kann. Ich stimme zu. Sobald Sie den Fehler gefunden haben, können Sie zusätzliche Faktoren oder sogar Code (wie von Bob vorgeschlagen) entfernen und bei jedem Schritt testen, ob der Fehler verschwunden ist. Wenn er in Cron ist, führen Sie ihn manuell aus. Wenn er über die GUI ausgeführt wird, versuchen Sie es über eine Kommandozeile oder eine einfache Test-Suite.

Wenn Sie Probleme haben, ist der umgekehrte Ansatz oft nützlich: Erstellen Sie ein kleines, minimales Programm, das ein paar Dinge tut, die die fehlerhafte Routine tut. Testen Sie es und sehen Sie, ob Sie den Fehler haben. Versuchen Sie dann Schritt für Schritt, ein funktionierendes Programm zu schreiben, das das tut, was die fehlerhafte Routine tun soll. Irgendwann sehen Sie vielleicht, dass der Fehler auftritt, dann haben Sie Ihren Testfall. Oder Sie kommen bis zu einer erfolgreichen Routine. In diesem Fall beginnen Sie damit, diese Routine Zeile für Zeile in eine exakte Kopie Ihres Codes umzuwandeln und dabei zu testen, wann der Fehler auftritt.

0voto

Macke Punkte 23640

Spezialisierung auf das Debugging von OpenGL-Fragment-Shadern, die sehr undurchsichtig sind. Dumbing stuff down ist gut und notwendig, aber die Überprüfung der Ausgabe ist schwieriger als normale Anwendungsprogrammierung, so dass Sie einige Tricks benötigen:

  • Rendern Sie verschiedene Teile in r,g,b und verwenden Sie step(), wenn Sie genaue Wertänderungen überprüfen müssen. (Gut geeignet, um Fließkommafehler wie 1,001 oder -0,001 zu erkennen)
  • Lernen Sie, rgb als einen normalisierten xyz-Vektor zu interpretieren.
  • Texturmuster entfernen, Texturkoordinaten als Farben darstellen.
  • Ziehen Sie in Erwägung, verschiedene Variablen in verschiedenen Teilen des Bildschirms darzustellen und eine frei schwebende Kamera zu verwenden.

0voto

pencilCake Punkte 48249

Danke für alle Ideen. Sie waren wirklich hilfreich. Soweit ich weiß, gibt es keine bestimmte Liste von Mustern wie die Design Patterns, wenn es um die Behebung von Fehlern geht. Vielleicht hat ab einem gewissen Punkt jeder seinen eigenen Weg.

Wenn der Prozess kompliziert aussieht, versuche ich unter anderem, den Code umzuformulieren. Das gibt mir die Möglichkeit, das Verhalten des Codes zu überdenken, ihn besser zu verstehen und ihn vielleicht sogar wartbarer zu machen. Die Extract-Methode ist mein Favorit, um lesbare logische Einheiten zu erhalten.

Eine meiner Lieblingsbeschäftigungen ist es, wenn sich der Wert einer Eigenschaft auf unerwartete Weise ändert, einen Haltepunkt auf den Setter dieser Eigenschaft zu setzen. Ich weiß nicht, ob es möglich ist, dies mit impliziten Eigenschaftsverlangsamungen zu tun (bool myProperty {get; set;}).

Vielleicht wäre es besser, mit einem BUG-Katalog zu beginnen, in dem alle Arten von Fehlern mit Beschreibungen kategorisiert sind.

danke, burak ozdogan

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X