- 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
Großartig.
Hacker-News-Kommentare
Erfahrung mit der Arbeit an der Chromium-Codebasis
Probleme mit der C++-Erweiterung von VS Code
Erfahrung mit einem Chrome-Bug
Erste Erfahrung mit der Chromium-Codebasis
Build-Anforderungen von Chrome
printf-Debugging
Empfehlung zur Nutzung eines Online-Code-Browsers
Unterschied zwischen WorkletGlobalScope und WorkerGlobalScope
Vorschlag, Chromium-Bugs zu beheben
Erfahrung mit einem Bug beim Kopieren von Bildern