Rückverfolgung
Bei der Rückverfolgung wird ein Endpunkt zu einem Ereignis gesucht, das mit der Funktion verknüpft ist (siehe unten). Dort wird ein Haltepunkt in den Debugger eingefügt. Die Funktion wird ausgelöst und wenn der Debugger stoppt. Der Aufrufstapel wird überprüft, um den Aufrufpfad zurückzuverfolgen. Während Sie den Call-Stack hinaufgehen, können Sie sich Notizen zu variablen Zuständen machen oder neue Haltepunkte setzen, um das Ereignis erneut zu untersuchen.
Die Funktion wird erneut ausgelöst und der Debugger stoppt an den neuen Haltepunkten. Sie können dann die Rückverfolgung wiederholen oder die Vorwärtsverfolgung durchführen, bis das Ziel gefunden wurde.
Für und Wider
- Es ist immer einfacher, den Call-Stack zu durchlaufen und zu sehen, wie Sie irgendwo hingekommen sind.
- Es kann Millionen von Bedingungen geben, die erfüllt sein müssen, bevor ein Endpunkt erreicht wird. Wenn Sie den Endpunkt bereits kennen, haben Sie sich viel Arbeit erspart.
- Wenn die Funktion fehlerhaft ist. Möglicherweise erreichen Sie den Endpunkt nie, und es kann Zeitverschwendung sein, herauszufinden, warum.
Endpunkterkennung
Um ein Feature zu debuggen, muss man wissen, wo im Quellcode das endgültige Ziel erreicht wird. Nur von diesem Punkt aus können Sie zurückverfolgen, um zu sehen, wie der Code dorthin gelangt ist . Ein Beispiel; Um zu verstehen, wie das Rückgängigmachen ausgeführt wird. Sie wissen, wo im Code Dinge rückgängig gemacht werden, aber Sie wissen nicht, wie die Dinge dahin kommen . Dies wäre ein Kandidat für das Zurückverfolgen, um herauszufinden, wie die Funktion funktioniert.
Vorwärtsverfolgung
Die Vorwärtsverfolgung lokalisiert einen Startpunkt für ein Ereignis, das mit einer Funktion verknüpft ist (siehe unten). Dort werden Protokollmeldungen in den Quellcode eingefügt oder Haltepunkte gesetzt. Dieser Vorgang wird wiederholt, wenn Sie sich weiter vom Startpunkt entfernen , bis Sie das Ziel für das Feature gefunden haben.
Für und Wider
- Dies ist der einfachste Ausgangspunkt, um ein Feature zu finden.
- Die Komplexität des Codes verringert die Wirksamkeit der Vorwärtsverfolgung. Je mehr Bedingungen im Code enthalten sind, desto größer ist die Chance, dass Sie in die falsche Richtung gehen.
- Die Vorwärtsverfolgung führt häufig dazu, dass Haltepunkte festgelegt werden, die durch nicht verwandte Ereignisse ausgelöst werden. Unterbrechen Sie den Debugging-Prozess und stören Sie Ihre Suche.
Starten Sie die Punktermittlung
Sie können Schlüsselwörter, Benutzeroberflächen-IDs (Schaltflächen-IDs, Fensternamen) oder einfach zu findende Ereignis-Listener für die Funktion verwenden. Sie können beispielsweise mit der Schaltfläche beginnen, die zum Auslösen einer Rückgängig- Funktion verwendet wird.
Prozess der Eliminierung
Sie können sich dies als den Mittelpunkt im Vergleich zu den Start- und Endpunktpositionen vorstellen. Sie führen einen Prozess der Beseitigung , wenn Sie bereits ein Stück Code wissen , verwendet in einem Feature, aber es ist weder der Anfang oder das Ende des Features.
Die Richtung, die Sie vom Mittelpunkt aus einschlagen, hängt von der Anzahl der Ein- und Ausgänge ab. Wenn der Codeabschnitt an vielen Stellen verwendet wird, kann das Zurückverfolgen von dieser Position aus sehr zeitaufwändig sein, da alle überprüft werden müssen. Anschließend verwenden Sie einen Eliminierungsprozess, um diese Liste zu reduzieren. Alternativ können Sie von diesem Punkt aus eine Vorwärtsverfolgung durchführen. Wenn sich der Codeabschnitt jedoch an vielen Stellen verzweigt, kann dies ebenfalls ein Problem sein.
Sie müssen die Positionsrichtungen reduzieren, indem Sie Pfaden nicht folgen, die für das Feature eindeutig nicht ausgeführt würden. Bewegen Sie sich über diesen Code hinaus und platzieren Sie Haltepunkte nur dort, wo es wahrscheinlich mit der Funktion zusammenhängt.
Das Debuggen in der Mitte erfordert häufig erweiterte IDE-Funktionen. Die Fähigkeit, Codehierarchie und Abhängigkeiten zu sehen. Ohne diese Werkzeuge ist es schwierig zu tun.
Für und Wider
- Mittelpunkte sind oft das erste Stückchen Code , das erscheint in den Kopf , wenn Sie die Funktion denken. Sie sagen sich: "Ah, das muss XXXX verwenden, um zu arbeiten."
- Mittelpunkte können Startpunkte am einfachsten aufdecken .
- Mittelpunkte können eine einfache Möglichkeit sein, den Pfad zu einem Feature zu ermitteln, wenn sie durch Synchronisation oder Threading-Änderungen verloren gehen.
- Mittelpunkte können Sie zu Code führen, mit dem Sie nicht vertraut sind. Es kostet Sie Zeit zu lernen, was los ist.