Erkennung der Arten von Synchronisierungsprimitiven im universellen Wettlaufsdetektor Helgrind+
- Type:Diplomarbeit
- Supervisor:
Dr. Ing. Ali Jannesari
- Person in Charge:Christophe Schmaltz
-
Das Erkennen von Nebenläufigkeitsfehler ist ein schwieriges Problem, das immer mehr an Bedeutung gewinnt. Wettlauferkenner leisten gute Hilfe, sind aber bislang nur auf die Synchronisationsprimitiven bestimmter Programmbibliotheken ausgelegt. Wettlauferkenner unterstützen üblicherweise nur ein gewisser Satz an Programmbibliotheken. Wird eine nicht vorgesehene Programmbibliothek benutzt oder werden Synchronisationsprimitiven selbst implementiert, werden diese Synchronisierungen vom Wettlauferkenner nicht erkannt, was zu einer großen Menge an Falschmeldungen führen kann. Unser Ziel war es daher einen hybridenWettlauferkenner zu implementieren, der ohne Vorwissen über intern benutzte Synchronisierungsprimitive arbeitet, sondern allein auf Basis von bereitz kompiliertem Code diese ausfindig macht. Wir haben mittels Spin-Read Erkennung die Synchronisierungsprimitiven ausmachen können. Aufgrund der Annahme, dass der Lesezugriff auf einer Spin-Variable, im Sinne der happens-before Beziehung, nach dem vorhergehenden Schreibzugriff geschieht, wurde ein universeller Wettlauferkenner erstellt. Ein hybrider Wettlauferkenner wie Helgrind+ benutzt aber, zum erkennen von Wettläufen, eine Kombination aus Lockset-Algorithmus und happens-before Analyse, um die Schedule-Abhängigkeit des happens-before Algorithmus zu kontern. Wir haben also ein Algorithmus entwickelt, der auf Grund einer Beobachtung des Laufzeitverhaltens ermittelt welche Spin-Variablen zu Sperren gehören. Getestet wurde unser Ansatz auf einer Sammlung verschiedener Funktionen; sowohl solche die grundsätzlichen Synchronisierungsmechanismen enthalten, um deren erkennung zu überprüfen, als auch solche die “normale” Schleifen enthalten, um sicherzustellen das nicht zu viele falsche “Spin-Variablen” instrumentiert werden. Dabei konnten wir feststellen, dass unsere Erweiterung eine sehr gute Leistung bringt. Es ist nun möglich, effizient Synchronisierungsprimitiven aufzudecken, die durch den Benutzer selbst oder in eine Programmbibliothek implementiert wurden. Dadurch erspart man sich die langwierige und fehleranfällige Annotation vom Code die für andere Tools nötig wäre.