14 Punkte von GN⁺ 2024-08-27 | 2 Kommentare | Auf WhatsApp teilen
  • Durch die erstmalige Behebung eines Bugs im Webbrowser Chromium/Google Chrome zu einem großen Open-Source-Projekt beigetragen.
  • Es war eine einzigartige Erfahrung, die sich stark von früherer Open-Source-Arbeit unterschied.
  • Um Entwicklerinnen und Entwicklern zu helfen, die ähnliche Arbeiten versuchen möchten, wurde der gesamte Prozess dokumentiert.

Der Bug

  • Der behobene Bug betraf ein Integrationsproblem zwischen den Netzwerk-Anfragen von Chromium Devtools und Worklets wie AudioWorklet, die außerhalb des Main-Threads laufen.
  • Von Worklets erzeugte Netzwerk-Anfragen wurden im Netzwerk-Tab der Devtools überhaupt nicht angezeigt.
  • Die Option „Disable Cache“ wurde ignoriert, sodass veralteter Code während der Entwicklung nicht aus dem Cache entfernt wurde.
  • Das Problem trat in mehreren Projekten wiederholt auf und entsprach mindestens drei Fehlerberichten.
  • Eine minimale Reproduktion war einfach und konnte erzeugt werden, indem ein AudioWorkletProcessor mit einem Skript erstellt wurde, für das Cache-Header gesetzt waren, und die Seite anschließend neu geladen wurde.

Chromium-Code herunterladen und bauen

  • Der erste Schritt zur tatsächlichen Behebung des Bugs war, Chromium erstmals von Grund auf zu bauen.
  • Glücklicherweise gab es ausführliche Dokumentation dazu, wie man auf den wichtigsten Betriebssystemen baut.
  • Trotz eines leistungsstarken Computers dauerte der erste Build mehr als 45 Minuten, verbrauchte über 50 GB RAM und erforderte mehr als 100 GB Festplattenspeicher.
  • Inkrementelle Builds waren schnell und wurden in unter 10 Sekunden abgeschlossen.
  • Der Build braucht zwar Zeit, war aber eine komfortable Aufgabe, die nach der Installation aller nötigen Voraussetzungen weitgehend automatisch ablief.

Den Bug finden und beheben

  • Nachdem die Build-Umgebung funktionierte, begann die Erkundung des Codes.
  • Die Chromium-Codebasis ist enorm groß, und es war schwierig, ihre Gesamtstruktur zu erfassen.
  • Viele indirekte Referenzen und die starke Modularisierung erschwerten die Navigation im Code, zudem wurde dynamischer Dispatch umfassend genutzt.
  • Mithilfe von printf-Debugging wurden Netzwerk-Anfragen von ihrem Startpunkt bis zu dem Moment verfolgt, in dem sie tatsächlich erzeugt oder aus dem Cache geladen wurden.
  • Das Problem entstand, weil InspectorNetworkAgent für Worklet-Ziele nicht erzeugt wurde.
  • Zur Behebung wurde InspectorNetworkAgent so geändert, dass statt WorkerGlobalScope nun WorkerOrWorkletGlobalScope akzeptiert wird.
  • Diese Änderung allein reichte jedoch nicht aus; nach zusätzlicher Prüfung des TypeScript-Codes im Devtools-Frontend wurde festgestellt, dass für Type.Worklet Capability.Networking fehlte.
  • Nach dem Hinzufügen war das Problem vollständig behoben.

Tests und Code-Review

  • Nach dem Aufräumen der Debug-Logs und einer letzten Prüfung des Diff wurde der Prozess für Review und Merge des Codes durchlaufen.
  • Es wurde ein Konto auf der Code-Review-Seite Chromium Gerrit erstellt und die CLA unterschrieben.
  • Ein Reviewer wurde ausgewählt, der geschriebene Code überprüft und die erforderlichen Tests ergänzt.
  • Unter Bezug auf mehrere JavaScript-Tests für die Netzwerk-Inspektionsfunktion der Devtools wurden neue Tests geschrieben.
  • Am Ende gab es im Code-Review die Freigabe „LGTM“, und der PR wurde gemergt.

Zweites CL

  • Für die Änderung, die Capability.Network zu Worklet-Devtools-Zielen im Repository devtools_frontend hinzufügt, wurde ein weiteres CL erstellt.
  • Der Ablauf war ähnlich wie beim ersten PR, und nach bestandenen CI-Tests wurde es automatisch gemergt.

Release

  • Danach wurde gewartet, bis eine Version mit dem Fix in Chrome Canary veröffentlicht wurde.
  • Chrome Canary wird zweimal täglich aktualisiert, und schließlich konnte der Fix bestätigt werden.
  • Die vollständige Behebung dauerte mehr als einen Monat und sollte mit Chrome 130 in den stabilen Release-Kanal gelangen.

Ergebnis und Rückblick

  • Die Behebung des Bugs kostete Zeit und viel Aufwand, war aber eine sehr einzigartige Erfahrung.
  • Dabei konnte erlebt werden, wie Software in der Größenordnung von Chromium entwickelt wird.
  • Besonders motivierend war persönlich die Tatsache, dass der Code auf Hunderten Millionen (oder gar Milliarden) Geräten weltweit enthalten sein würde.
  • Durch diese Erfahrung wurde gelernt, wie man zu Chromium beiträgt, und künftig sollen weitere Bugfixes versucht werden.

2 Kommentare

 
huiya 2024-08-27

Großartig.

 
GN⁺ 2024-08-27
Hacker-News-Kommentare
  • Erfahrung mit der Arbeit an der Chromium-Codebasis

    • Code wurde mit Sublime Text als Plain Text bearbeitet
    • Mit VS Code kann man Funktionen definieren oder zu Deklarationen springen
    • Empfiehlt seinen Artikel Menschen, die einen Chromium-basierten Browser bauen möchten
  • Probleme mit der C++-Erweiterung von VS Code

    • Wegen der großen Codebasis funktioniert die C++-Erweiterung von VS Code nicht richtig
    • Es tritt ein Problem auf, bei dem die CPU-Kerne dauerhaft bei 100 % Auslastung hängen
    • Das Chromium Code Search-Tool ist nützlich
  • Erfahrung mit einem Chrome-Bug

    • Unter Linux tritt in Chromium-basierten Browsern ein Bug auf, bei dem "±±±±±±+..." eingegeben wird
    • In anderen Anwendungen tritt das nicht auf
    • Möchte den Bug reproduzieren und beheben
  • Erste Erfahrung mit der Chromium-Codebasis

    • Das erste Erkunden der Chromium-Codebasis war nicht schwierig
    • Hat beim Beheben eines Bugs zum Einfügen von Bildern unter Windows auf den Chrome-Code Bezug genommen
  • Build-Anforderungen von Chrome

    • Die Build-Anforderungen von Chrome sind sehr hoch
    • Eine leistungsstarke Workstation ist nötig
    • Auch Firefox braucht lange zum Bauen
  • printf-Debugging

    • Es ist nicht peinlich, printf-Debugging zu verwenden
    • printf-Debugging ist sehr effektiv
  • Empfehlung zur Nutzung eines Online-Code-Browsers

    • Empfiehlt das Navigieren im Code über einen Online-Code-Browser
    • Die URL cs.chromium.org ist leicht zu merken
  • Unterschied zwischen WorkletGlobalScope und WorkerGlobalScope

    • Es dauerte eine Weile, den Unterschied zwischen den beiden Begriffen zu verstehen
    • Die Benennung ist nicht gut
  • Vorschlag, Chromium-Bugs zu beheben

    • Empfiehlt, Chromium-Bugs zu beheben
    • Chrome wird schnell aktualisiert, daher kann ein Bug innerhalb von 4–6 Wochen behoben sein
    • Möchte Leute finden, die zur Fehlerbehebung beitragen
  • Erfahrung mit einem Bug beim Kopieren von Bildern

    • Beim Kopieren eines Bildes in die Zwischenablage friert die UI in Chromium-basierten Browsern ein
    • Die Ursache ist ein Problem bei der PNG-Kodierung
    • Das Problem wurde gelöst, indem die Komprimierungsstufe auf 0 gesetzt wurde
    • Firefox hat keine Verzögerung und legt die Originalbilddatei in die Zwischenablage