staging.inyokaproject.org

Helft dem Wine-Projekt - findet Regressionen!

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

MalleRIM

Anmeldungsdatum:
2. September 2006

Beiträge: 724

Hallo,
Ich bin grad auf Winehq.org auf eine einfache Methode gestoßen, dem Wine-Projekt zu helfen, vor allem jetzt, in der Zeit des Code-Freezes auf dem Weg zu Wine-1.0. Und zwar Regression Testing mit git bisect. Die Benutzung ist denkbar einfach. Man lädt sich mit dem Programm git den wine-git-tree herunter. Man sagt git, welche Version die funktionsfähige ist und welche nichtmehr funktioniert. Git nutzt nun die Hälfte der Patches, die zwischen den beiden Versionen angewendet wurden. Diese zusammengesetzte Version muss nun kompiliert werden. Dann testet man sein Programm und sagt danach git, ob die Regression immernoch aufgetreten ist oder nicht. Die ganze Prozedur wiederholt sich nun, bis der entsprechende Patch gefunden wurde. Dann öffnet man einen Bugreport. Man braucht dafür nur sehr wenig wissen und muss seinen Rechner ein wenig rechnen lassen, den Rest macht git.
Hier ist eine Anleitung: http://wiki.winehq.org/RegressionTesting
Wenn jemand Probleme mit der englischen Sprache hat und trotzdem helfen möchte, kann ich den Artikel auch übersetzen 😉
kleiner Tipp zum Beschleunigen des Kompiliervorgangs: make -jX anstatt einfach nur make (wobei X die anzahl der CPUs/CPU-Kerne +1 ist) beschleunigt das Kompilieren, indem es mehrere Prozesse startet. Das verbraucht allerdings auch mehr RAM. Ich habe eine Dualcore-CPU und nutze daher make -j3
Ich teste gerade einige Regressionen, die in den letzten Wine-Versionen bei Warcraft III aufgetreten sind und werde danach eine Regression bei MS-Office 2007 testen, die zwischen 0.9.58 und 0.9.60 aufgetreten ist.
Wenn ihr Regressionen entdeckt, sucht unbedingt nach der Ursache und öffnet einen Bugreport im Wine Bugzilla, damit sich die Wine-Entwickler auf die Dinge konzentrieren können, die wir nicht können!

Gruß,
Malle

FallenWizard

Anmeldungsdatum:
14. April 2006

Beiträge: 198

Selbst bei einem hohen makeopts Wert würde das kompilieren lange dauern. Ich würde da eher ccache empfehlen. Damit ist Wine um ca 5 mal schneller rekompiliert.

MalleRIM

(Themenstarter)

Anmeldungsdatum:
2. September 2006

Beiträge: 724

Im Artikel wird die Benutzung von ccache schon empfohlen, deswegen habe ich das hier nicht mehr erwähnt.

Romi

Anmeldungsdatum:
18. Oktober 2005

Beiträge: Zähle...

Darf man von deinem Ergebnissen zu Warcraft 3 hören? Ich kann leider nur in alten Wine-Versionen (.9.43 glaube ich) ein Spiel im Battle.net eröffnen, in den neueren Version (0.9.6 als letztes getestet) geht das nicht (Das Problem tritt allerdings bei jedem auf). Meintest du diesen Fehler, und konntest du ihn finden?

adun Team-Icon

Avatar von adun

Anmeldungsdatum:
29. März 2005

Beiträge: 8606

Wichtig ist, dass es jetzt noch mit einer alten Version geht und das Problem demnach nicht am Battlenet liegt. Falls ja, dann wäre das eine von den gesuchten Regressionen.

osmanovic100

Anmeldungsdatum:
20. Oktober 2004

Beiträge: 438

Wenn jemand Probleme mit der englischen Sprache hat und trotzdem helfen möchte, kann ich den Artikel auch übersetzen

Viel Dank im voraus

MalleRIM

(Themenstarter)

Anmeldungsdatum:
2. September 2006

Beiträge: 724

@Romi: Nein, ich spiele WC3 nicht im Battle.net sondern nur auf LAN-Parties. Seit Wine 0.9.61 lässt sich WC3 nur noch mit einem Prefix starten, was schonmal von einer vorigen Version benutzt wurde - nicht gerade gut, sowas in einer Final zu haben, auch wenn das behebbar ist. Ich habe es durch Zufall entdeckt und bin der Sache auf den Grund gegangen, habe noch einige andere Unterschiede zwischen den Wine-Versionen 0.9.59 und 1.0-rc1 gefunden, die möglicherweise damit zusammenhängen. Ich bin mit der Suche noch nicht fertig. Am besten, du testest mal, ab welcher Version das nicht mehr geht und suchst dann mit git bisect nach dem Patch, der den Fehler verursacht hat. Das ist aber vielleicht gar nicht nötig, da die fehlende Battle.net-Funktion schon gemeldet wurde und bis 1.0 behoben werden soll. Schau dir mal den Bugreport an, vielleicht kannst du ja zusätzliche Informationen beisteuern 😉
@osmanovic100: werd mich dann mal an die Arbeit machen 😉

Romi

Anmeldungsdatum:
18. Oktober 2005

Beiträge: Zähle...

adun hat geschrieben:

Wichtig ist, dass es jetzt noch mit einer alten Version geht und das Problem demnach nicht am Battlenet liegt. Falls ja, dann wäre das eine von den gesuchten Regressionen.

Ja, das ist so.

Das ist aber vielleicht gar nicht nötig, da die fehlende Battle.net-Funktion schon gemeldet wurde und bis 1.0 behoben werden soll. Schau dir mal den Bugreport an, vielleicht kannst du ja zusätzliche Informationen beisteuern

Ich finde ihn gerade nicht. Hast du einen Link dazu?

MalleRIM

(Themenstarter)

Anmeldungsdatum:
2. September 2006

Beiträge: 724

Ist über zwei Klicks von der Winehq.org-Startseite zu erreichen 😉 Einfach auf den Link zu den für 1.0 angesetzten Bugs klicken und die liste absuchen 😉
http://bugs.winehq.org/show_bug.cgi?id=9787

MalleRIM

(Themenstarter)

Anmeldungsdatum:
2. September 2006

Beiträge: 724

Hier, die Übersetzung des Artikels (teilweise etwas unbeholfen übersetzt aber hoffentlich dennoch verständlich):
Regression Testing
Manchmal verursachen neue Patches, die Bugs beheben und neue Funktionen bereitstellen, neue Probleme. Das nennt man eine Regression. Aber da das Problem normalerweise bis zum nächsten Release nicht bemerkt wird, kann es schwer werden, den Patch zu finden, der für das Problem verantwortlich ist, da in dieser Zeit möglicherweise hunderte Patches aufgenommen wurden. Hier kommt regression testing ins Spiel.
Mit regression testing können Problempatches gefunden werden. Dafür wird das Programm git und dessen bisect-Befehl verwendet. Ein vertiefender Artikel über git und Wine kann unter GitWine gefunden werden. Dieser Artikel befasst sich nur mit regression testing.

Einrichtung
Erstmal musst du sicherstellen, dass git auf deinem System installiert ist:

git --version


Git sollte in Version 1.4.1 oder neuer installiert sein. Wenn nicht, installiere git über die Paketverwaltung deiner Distribution. Um git beispielsweise auf Ubuntu zu installieren, benutze den folgenden Befehl:

sudo apt-get install git-core


Und, um viel Zeit zu sparen, installiere ccache über die Paketverwaltung. Unter Ubuntu:

sudo apt-get install ccache


Sobald git und ccache installiert sind, kannst du mit dem folgenden Befehl den Wine-Quellcode herunterladen:

git clone git://source.winehq.org/git/wine.git wine-git
cd wine-git


Das wird einige Minuten dauern, da etwa 90MB Daten heruntergeladen werden müssen. Wenn du eine Firewall nutzt, musst du möglicherweise git: durch http: ersetzen. Jetzt hast du eine Kopie des repositorys und das testen kann beginnen.

Bisect benutzen
Angenommen, du hast einen Bug, der nach einem Upgrade von Wine 0.9.36 auf Wine 0.9.37 aufgetreten ist. Die folgenden Befehle richten git ein, um den Bug zu finden:

git bisect start
git bisect good wine-0.9.36
git bisect bad wine-0.9.37


Manchmal kann es sein, dass du bereits weißt, in welcher Komponente der Fehler war, wenn, dann kannst du git dies mitteilen. Um git beispielsweise zu sagen, dass der Fehler in der wined3d dll liegt, dass sie in Wine 0.9.38 funktionierte und aktuell nicht funktioniert, benutze folgende Befehle:

git bisect start dlls/wined3d
git bisect good wine-0.9.38
git bisect bad


Jetzt wird git dir sagen, dass du jetzt X Änderungen zu testen hast. Keine Sorge, so viele Tests müssen nicht durchgeführt werden ☺. Git wird den Status des Quellcodes genau zwischen die beiden Versionen, die du testest, setzen. Wenn du zum Beispiel 100 Änderungen zu testen hast, wird es den Quellcode auf den Status der 50. Änderung setzen. Wir sind fast soweit, Wine zu kompilieren, erstmal müssen wir das ganze konfigurieren:

CC="ccache gcc" ./configure --verbose


Wenn du einen 64bit-Prozessor hast, musst du anders vorgehen, um Fehler zu vermeiden. Normalerweise reicht der folgende Befehl:

CC="ccache gcc -m32" ./configure --verbose


Oft, es sei denn du hast schon einmal Wine kompiliert, beendet configure mit Fehlern wegen fehlender Abhängigkeiten. Stelle sicher, dass alle Abhängigkeiten installiert sind uns kompiliere erneut. Dies musst du wiederholen, bis du keine Fehler mehr erhälst. Um benötigte Abhängigkeiten zu installieren, musst du auf Ubuntu/Debian dies ausführen:

sudo apt-get build-dep wine wine-dev


oder

sudo apt-get install git-core flex bison libstdc++6-dev libartsc0-dev libasound2-dev libaudio2 libaudiofile0 libc6-dev libesd-alsa0 libesd0-dev libgcc1 libgl1-mesa-glx libgl1-mesa-dev libglib2.0-0 libglu1-mesa-dev libgphoto2-2-dev libgphoto2-port0 libice6 liblcms1-dev libldap2-dev libsm6 libx11-6 libxau6 libxext6 libxml2-dev libxslt1.1 libxt6 libxxf86vm1 msttcorefonts build-essential


Dies wird alle Abhängigkeiten finden und sie automatisch installieren. Sobald du alle Abhängigkeiten hast, führe aus:

CC="ccache gcc" ./configure --verbose && make clean && make


Dies wird eine Weile dauern, je nach Geschwindigkeit deiner Hardware. Manche Computer brauchen nur 3 Minuten, manche können Stunden brauchen. Bei mir dauert das etwa 20 Minuten. Sobald Wine kompiliert ist, bist du fast fertig für das Testen. Zur Sicherheit brauchen wir ein sauberes .wine-Verzeichnis:

mv ~/.wine ~/.wine-backup


Das eigentliche Programm testen
Installiere das Programm:

./wine program_install.exe


und führe es aus:

./wine "C:\Program Files\Program Name\program.exe"


Überprüfe, ob dein Fehler immernoch auftritt. Wenn ja, dann weißt du, dass der Patch, der das Problem verursacht, irgendwo in der ersten Hälfte der Patches ist und nicht in der zweiten Hälfte. Um git dies mitzuteilen führe diesen Befehl aus:

git bisect bad


Wenn der Bug nicht auftrat, weißt du, dass der Fehler in der zweiten Hälfte der Patches seine Ursache hatte. Führe dafür dies aus:

git bisect good


das wird den Status des Quellcodes in die Mitte der übrigen Patches setzen. Nun musst du Wine neu kompilieren und erneut nach dem Bug suchen. Nach einigen Tests wird git letztendlich den fehlerhaften Patch erkennen. Dies sieht etwa folgendermaßen aus:

a460a2df43aa8eae10b1db028c6020829b009c54 is first bad commit
commit a460a2df43aa8eae10b1db028c6020829b009c54
Author: Stefan Doesinger <stefandoesinger@gmx.at>
Date:   Sat Jun 9 14:27:41 2007 +0200
wined3d: Store the gl information in a per adapter structure and initialize it only once.
:040000 040000 d8ae35832fcdbca8de07acae73b9e21564ced413
1720cc38fb598110071c9ee4f21f8f61b6f764c3 M      dlls


Achte darauf, dass es heißt:

a460a2df43aa8eae10b1db028c6020829b009c54 is first bad commit


Wenn du das siehst:

Bisecting: 0 revisions left to test after this


DANN BIST DU NOCH NICHT FERTIG!
Sobald der Patch identifiziert wurde, poste diese Information im Bugzilla in den entsprechenden Bugreport (wenn dort keiner ist, öffne einen). Vergewissere dich, dass du den Autoren das Patches der CC-Liste hinzufügt hast. Diese Informationen erlaubt es den Entwicklern, Probleme sehr viel schneller zu beheben.
Wenn du testest und alle bisects "good" sind (der Fehler tritt nicht auf) und eine Ausgabe erhälst, die "Release 0.9.xx" enthält, so wie dies:

b821e839bb33ac8f56939cc582010ecf4d9c25d4 is first bad commit
commit b821e839bb33ac8f56939cc582010ecf4d9c25d4
Author: Alexandre Julliard <julliard@winehq.org>
Date:   Fri Mar 21 16:41:33 2008 +0100
    Release 0.9.58.
:100644 100644 9123c03a3138b05cb8ebb5271f554bb76510cd09 3b88d88dcdfc8e148f8e7e0858bf0ca62c0bdff3 M  ANNOUNCE
:100644 100644 900c8932cb5aad58e928a5c3192ab95967dc0664 e001d501bec609c31c5a91ab185a06ef1662f4c8 M  ChangeLog
:100644 100644 5614cdd9b3c6af6d44027f067fcc423e49c49c91 36e035642c055736e2f833210f5db334a6706486 M  VERSION
:100755 100755 a516335cb3e4c67298f285adbdb2ede09da133be 51a9fd0b9741b28a588e2dd3bb57ae2be8805af2 M  configure


...dann musst du bisect zurücksetzen und das entsprechende Release als dein erstes "good" bisect setzen ("wine-0.9.xx"). Diese bisect-Ausgabe ist nur eine Versionskennzeichnung, das bedeutet, dass keine wirkliche Code-Änderung dein Problem verursacht hat. Alle "guten" bisect, die du gesetzt hast, zeigen git, dass der Code in Ordnung ist, bis wine-0.9.xx. Git entfernt nun den gesamten code bis auf die Versionskennzeichnung, welches die letzte Revision vor der nächsten Versionskennzeichnung wäre.
Das Bisect zurücksetzen
Wenn du den Test abgeschlossen hast, willst du vielleicht etwas anderes testen. Um dein git-repository zurückzusetzen, führe das Folgende aus:

git bisect reset


Wenn du versuchst ein neues bisect vor diesem Schritt zu starten, wirt git bisect start mit die Fehlermeldung "won't bisect on seeked tree" ausgeben.
Den Git-Tree patchen
Angenommen, ein Entwickler postet einen Patch, den du ausprobieren sollst. Auch wenn das kompliziert klingt, ist es sehr einfach. Du musst nur den Patch herunterladen und in deinen wine-git-Ordner kopieren. Dann führe den aus:

patch -p1 < patch_name.diff


Das wird den Quellcode patchen. Etwas wie dies wird ausgegeben werden:

dlls/wined3d has been patched.


Danach musst du einfach neu kompilieren:

./configure && make clean && make depend && make


und dein Programm erneut ausführen:

./wine "C:\Program Files\Program Name\program.exe"


Siehst du, das war nicht besonders schwer! Wenn du irgendwelche anderen Programme testen willst, dann sollte dein tree nicht verpatcht sein. Um deinen git tree zurückzusetzen, führe aus:

git reset --hard origin


Das wird alle Änderungen, die du gemacht hast, zurücksetzen. Aber da du nur testest und nicht selbst patches schreibst, geht keine Arbeit verloren.
Git Updaten
Nach einigen Wochen, wenn ein Bug, den du verfolgt hast, als behoben gilt und du den neusten Entwicklungsstand testen möchtest, musst du dein Git-Repository updaten und die neue Version kompilieren:

git fetch ; git rebase origin


Nun kannst du einfach erneut kompilieren:

./configure && make clean && make depend && make


Und testen. Dein Programm sollte jetzt laufen!
Tests deaktivieren um die Kompilierung zu beschleunigen
Wenn man für Regressionstests kompiliert, wird ein Großteil der Zeit für die Kompilierung von Konformitäts-Tests verwendet. Auch wenn diese Tests wertvoll sind, werden sie nicht für das regression testing benötigt (wir wissen, etwas ist kaputt, also ist die Konformität irrelevant). Bis es ein Patch für eine solche Option in den Haupt-tree geschafft hat, wird ein kleiner Hack benötigt:

diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index d7b0976..2b4b779 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -332,7 +332,7 @@ SUBDIRS = \
        winequartz.drv \
        winex11.drv
-BUILDSUBDIRS   = $(BASEDIRS) $(EXTRADIRS) $(TESTSUBDIRS)
+BUILDSUBDIRS   = $(BASEDIRS) $(EXTRADIRS)
 INSTALLSUBDIRS = $(BASEDIRS) $(EXTRADIRS) $(IMPLIBSUBDIRS)
 DOCSUBDIRS     = $(BASEDIRS) $(EXTRADIRS)
diff --git a/programs/Makefile.in b/programs/Makefile.in
index 3c128e1..72dbdb8 100644
--- a/programs/Makefile.in
+++ b/programs/Makefile.in
@@ -41,7 +41,6 @@ SUBDIRS = \
        winemenubuilder \
        winemine \
        winepath \
-       winetest \
        winevdm \
        winhelp \
        winver \
--
1.4.4.2


Man muss allerdings aufpassen, wenn man diesen patch benutzt. Git-bisect mag es nicht, wenn man den tree während eines bisects verändert. Um also ordentlich zu bisecten und dennoch die tests zu deaktivieren, gehe wie folgendermaßen vor (es wird angenommen, der patch ist ~/wine-git/disable_test.diff):

  1. Schritt: $ git bisect start

  2. Schritt: $ git bisect bad wine-0.9.50

  3. Schritt: $ git bisect good wine-0.9.52

  4. Schritt: $ patch -p1 < disable_test.diff && CC="ccache gcc" ./configure && make clean && make depend && make && patch -p1 -R < disable_test.diff

Teste anschließend deine Anwendung und benutze "git bisect good" oder "git bisect bad" um den nächsten Test durchzuführen. Gehe danach immer wie im 4. Schritt vor, bis du den entsprechenden Patch gefunden hast. Der Patch zur Deaktivierung der Tests kann hier heruntergeladen werden.

Moderiert von adun:

Syntax repariert

osmanovic100

Anmeldungsdatum:
20. Oktober 2004

Beiträge: 438

Danke! ☺ werde daran Teil nehmen...

MalleRIM

(Themenstarter)

Anmeldungsdatum:
2. September 2006

Beiträge: 724

hatte einen Fehler bei der Formatierung gemacht, jetzt ist das mit der neuen Syntax völlig verhunzt :-/

..mo

Anmeldungsdatum:
25. April 2005

Beiträge: 510

MalleRIM schrieb:

hatte einen Fehler bei der Formatierung gemacht, jetzt ist das mit der neuen Syntax völlig verhunzt :-/

Wie konnte das denn passieren? Die ist doch so eingänglich und benutzerferundlich? 😉

Antworten |