ist jetzt verfügbar! Lesen Sie über die neuen Funktionen und Fehlerbehebungen vom November.

Problemlösung für Erweiterungsprobleme mit Bisect

16. Februar 2021 von Johannes Rieken, @johannesrieken

"Genau wie git-bisect, aber für VS Code-Erweiterungen."

Die wahre Stärke von Visual Studio Code sind seine Erweiterungen: Theme-Erweiterungen fügen Farben und Symbole hinzu, Sprach-Erweiterungen ermöglichen intelligente Code-Vervollständigung (IntelliSense) und Navigation, Debugger-Erweiterungen ermöglichen es Ihnen, Ihren Code auszuführen und Fehler leicht zu finden. Es gibt Erweiterungen, die Musik spielen, einige, die Aktienkurse anzeigen, und es gibt Erweiterungen, die die Zusammenarbeit über Standorte und Zeitzonen hinweg ermöglichen. Der VS Code Marketplace beherbergt mehr als 28.000 Erweiterungen, und es ist nicht ungewöhnlich, dass Benutzer 50 oder mehr Erweiterungen installiert haben. Bei so vielen Erweiterungen sind Fehler unvermeidlich. Anstatt zu leugnen, möchten wir die Fehlerbehebung vereinfachen.

"Schlechte" Erweiterungen

Wir lieben Erweiterungen und glauben nicht wirklich, dass es "schlechte" Erweiterungen gibt. Wie jede Software haben jedoch auch Erweiterungen Fehler und Funktionslücken. Lassen Sie uns also zur besseren Lesbarkeit und für künstliches Drama den Begriff "schlechte Erweiterungen" verwenden, d. h. eine Erweiterung, die abstürzen kann oder einfach unerwünschtes Verhalten zeigt. Glücklicherweise haben wir VS Code mit "schlechten" Erweiterungen im Hinterkopf entwickelt und führen sie daher in einem separaten Prozess aus. Diese Isolierung garantiert, dass VS Code weiterläuft, der Cursor immer blinkt und Sie Ihre Arbeit immer speichern können.

Zum Spaß und um die Demonstration von Extension Bisect zu erleichtern, haben wir die Erweiterung Extension Bisect Demo erstellt und veröffentlicht. Wenn sie installiert ist, setzt sie Ihren Cursor lästig zurück, wann immer Sie das Wort "bisect" erreichen. Sie können diese Erweiterung verwenden, um diesem Blogbeitrag zu folgen.

Aufwendiges Finden einer "schlechten" Erweiterung

Heute kann das Finden einer "schlechten" Erweiterung einfach oder schwierig sein. Öffnen Sie die Erweiterungsansicht (⇧⌘X (Windows, Linux Ctrl+Shift+X)), deaktivieren Sie eine Erweiterung, laden Sie das Fenster neu (Entwickler: Fenster neu laden) und prüfen Sie, ob das Problem weiterhin besteht. Wenn das Problem behoben ist, ist diese Erweiterung "schlecht" und Sie sind fertig. Andernfalls aktivieren Sie die Erweiterung erneut und wiederholen Sie den Vorgang mit der nächsten Erweiterung.

Disabling an extension step by step

Wenn Sie Glück haben, ist die erste Erweiterung die "schlechte"; wenn Sie Pech haben, ist es die letzte Erweiterung. In der Sprache der Informatik bedeutet dies, dass Sie bei N Erweiterungen im schlimmsten Fall das Verfahren O(N) (Ordnung N) wiederholen müssen und im Durchschnitt O(N/2). Da dieser Algorithmus von einem Menschen (Ihnen) ausgeführt wird, sind selbst kleine Werte von N mühsam. Hier ist das Dienstprogramm extension bisect hilfreich. Es ist im schlimmsten und durchschnittlichen Fall viel besser, da es Erweiterungen in Hälften deaktiviert.

Willkommen, Extension Bisect

Das Utility Extension Bisect in VS Code wurde vom Befehl git bisect inspiriert. Für Git-Benutzer ist dieser Befehl hilfreich, um herauszufinden, welcher Commit im Repository ein Problem eingeführt hat.

Nehmen wir ein Beispiel: Ich habe 24 Erweiterungen installiert und die 8. Erweiterung ist "schlecht". Wir wissen, dass der iterative Ansatz 8 Schritte erfordert. Was ist mit Bisect?

Das folgende Video zeigt, wie Extension Bisect über den Befehl Hilfe: Extension Bisect starten gestartet und dann entweder Jetzt gut oder Dies ist schlecht ausgewählt wird, bis die "schlechte" Erweiterung identifiziert ist. Sobald sie identifiziert ist, haben Sie die Möglichkeit, ein Problem für diese Erweiterung zu melden.

The extension bisect process

Hier ist Schritt für Schritt, wie die "schlechte" Erweiterung gefunden wurde

  1. Bisect teilt 24 Erweiterungen in zwei Hälften von jeweils 12 Erweiterungen auf und deaktiviert alle 12 Erweiterungen der zweiten Hälfte.
  2. In diesem Beispiel ist die 8. Erweiterung die "schlechte", daher ist sie in der ersten Hälfte und nicht deaktiviert. Die Dinge funktionieren immer noch nicht wie erwartet. Da immer noch ein Problem besteht, wiederholt Extension Bisect den Vorgang und teilt die ersten 12 Erweiterungen in zwei Teile auf: 6 sind aktiviert und 6 sind deaktiviert. Alle anderen Erweiterungen werden ebenfalls wieder aktiviert.
  3. Die 8. Erweiterung ist jetzt deaktiviert. Die Dinge sind jetzt gut. Das bedeutet, Bisect kann mit der zweiten Hälfte (Erweiterungen 6-11) fortfahren und diese in 3 aktivierte und 3 deaktivierte Erweiterungen aufteilen.
  4. Jetzt wird die 8. Erweiterung wieder aktiviert und das Problem tritt erneut auf. Das bedeutet, Bisect fährt mit der ersten Hälfte fort. Es teilt diese in 1 aktivierte und 2 deaktivierte Erweiterungen auf.
  5. Die 8. Erweiterung ist jetzt deaktiviert, die Dinge sind wieder gut und Bisect fährt mit der zweiten Hälfte fort und teilt sie in 1 aktivierte und 1 deaktivierte Erweiterung auf.
  6. Die 8. Erweiterung ist die einzige deaktivierte Erweiterung, und das Problem ist verschwunden. Das bedeutet, wir haben die "schlechte" Erweiterung gefunden und sind fertig.

Schnellere Fehlerbehebung

Wir sehen, dass Bisect den Suchraum in jedem Schritt halbiert. Die Schritte laufen nun in logarithmischer Zeit, was zu einer durchschnittlichen und schlimmsten Fallleistung von O(log N) führt. Das ist ziemlich gut, da es gut skaliert. Bei 24 Erweiterungen benötigen Sie 4 bis 5 Schritte, um eine "schlechte" Erweiterung zu finden. Bei 38 Erweiterungen ist nur 1 Schritt mehr erforderlich. Der Best-Case ist jedoch schlechter, da Sie mit dem iterativen Ansatz Glück haben und die "schlechte" Erweiterung in der ersten Runde finden können.

Beachten Sie, dass Extension Bisect darauf angewiesen ist, dass Sie korrekte Rückmeldungen geben. Sie können es und sich selbst leicht täuschen, indem Sie immer mit Jetzt gut (schiebt die Schuld auf die letzte Erweiterung) oder Dies ist schlecht (findet keine Erweiterung) antworten.

Eine weitere nützliche Erkenntnis ist, dass Extension Bisect zunächst die vollständige Liste der aktivierten Erweiterungen berücksichtigt. Das bedeutet, dass Sie eine bekannte "gute" Erweiterung von Bisect ausschließen können, indem Sie sie vor dem Start deaktivieren und danach wieder aktivieren. Tun Sie dies jedoch nur, wenn Sie sicher sind, dass die Erweiterung nicht die "schlechte" ist.

Zuletzt bemerken Sie möglicherweise, dass Bisect einen zusätzlichen Schritt durchführt (log2(N) + 1). Das liegt daran, dass es in der ersten Runde mit der Deaktivierung aller Erweiterungen beginnt. Dieser erste Schritt ist notwendig, da Sie möglicherweise ein Problem sehen, das von VS Code selbst verursacht wird und nicht von einer Erweiterung, und wir möchten Sie nicht unnötig in die Irre führen.

Das war's. Wir hoffen, dass Sie Extension Bisect nie verwenden müssen. Wenn Sie jedoch auf ein Problem stoßen, das möglicherweise mit einer Erweiterung zusammenhängt, hoffen wir, dass wir die Fehlerbehebung einfacher, schneller und angenehmer gestalten können.

Viel Spaß beim Programmieren,

Johannes Rieken, VS Code Principal Software Engineer @johannesrieken

© . This site is unofficial and not affiliated with Microsoft.