bisect – Probleme Debuggen mit Binärer Suche
Absolut keine Neuheit, aber weil ich es gerade gebraucht habe und man die binäre Suche – die man zumindest aus der Datenstrukturen-Vorlesung kennen sollte ;-) – so schön in der Praxis anwenden kann und das eigentlich jeder kennen sollte, möchte ich das mal kurz erwähnen.
Problemstellung? Im aktuellem grml-Build habe ich festgestellt, dass es in der aktuellen udev-Version ein Problem mit der linux-raid-Erkennung via vol_id gibt. In irgendeiner Version von udev kam also ein Changeset hinzu, das dieses Problem verursacht. Durch die Verwendung von git-bisect war das Problem sehr schnell eingegrenzt und ich konnte Upstream das Changeset nennen, welches das Problem versursacht.
Der Ablauf:
Source holen: % git clone git://www2.kernel.org/pub/scm/linux/hotplug/udev.git % cd udev bisect initialisieren: % git bisect start % make clean ; make ; $TESTEN Der aktuelle Source (master-Branch) macht den Stress? Dann als böse markieren: % git bisect bad Auf eine funktionierende Version stellen (siehe 'git log', $commit-id auswählen und als $branch_name markieren): % git checkout -b $branch_name $commit-id Klappt das mit $commit-id noch? Testen und als gut markieren: % make clean ; make ; $TESTEN % git bisect good
Jetzt geht das Spiel mit “git bisect [good|bad] ; make clean ; make ; $TESTEN” so lange, bis man ein ‘$commit-id is first bad commit […]’ erhält. Das geht ziemlich schnell [O(log n)] und man hat dann auch schon den konkreten Übeltäter gefunden. :)
Ach ja, mein favorisiertes Versionkontrollsystem (mercurial) bietet ebenfalls eine Bisect-Extension.