2012-05-01 5 views
7

Ich möchte Synchronisierungsoperationen wie Sperren, Sempahores, Barrieren einer Multithread-Anwendung aufzeichnen, so dass ich die aufgezeichnete Anwendung später zum Debuggen wiedergeben kann.Wie kann ich eine Multithread-Anwendung wiedergeben?

Auf dem Weg ist es, Ihre eigene Sperre, Sempaphore, Zustandsvariablen etc .. Funktionen, die auch Protokollierung, aber ich denke, das ist ein Overkill, da unten unter sie müssen einige gemeinsame Synchronisationsoperationen verwenden.

Also meine Frage ist, welche Synchronisationsoperationen ich protokollieren sollte, so dass ich minimale Änderungen an meinem Programm benötige. Mit anderen Worten: Welches sind die Funktionen oder Makros in glibc- und Systemaufrufen, über die alle diese Synchronisationsoperationen erstellt werden? Damit ändere ich nur diese zum Loggen und Abspielen.

+0

Wie können alle Synchronisierungsvorgänge aufgezeichnet werden, um die aufgezeichnete Anwendung wiederzugeben? Es gibt viel mehr für ein Programm als die Reihenfolge der Synchronisationsoperationen, besonders wenn es aufgrund fehlender Synchronisation Race-Bedingungen gibt (was auch die Art von Problem ist, für die ich mir vorstellen kann, dass Sie Debugging-Hilfe haben möchten). –

+0

Für den Moment vergessen Sie die Rennbedingungen. Ich weiß, dass sie auch wichtig sind. – pythonic

+0

['strace (1)'] (http://linux.die.net/man/1/strace) kann hilfreich sein, aber es fängt keine Synchronisationsoperationen auf, die vollständig im Benutzerbereich stattfinden, ohne zum Kernel überzugehen, wie z als unbestätigte Mutex-Sperren. –

Antwort

1

Das Beste, was ich mit GDB von debuggt in 'Record' Modus denken kann:

Nach dieser Seite: GDB Process Record Threading-Unterstützung ist im Gange, aber es könnte nicht vollständig sein, noch.


Weniger streng Ihre Frage zu beantworten, kann ich vorschlagen

Auf anderen Plattformen mehrere andere Threading Kontrolleure vorhanden sind, aber ich habe nicht viel bekam Erfahrung mit ihnen.

1

In Ihrem Fall eine effektive Methode der "Protokollierung" Systemaufrufe auf Linux kann die LD_PRELOAD Trick zu verwenden, und überspringe die tatsächlichen Systemaufrufe mit Ihren eigenen Versionen der Anrufe, die die Verwendung des Anrufs protokollieren und dann zu dem tatsächlichen Systemaufruf weiterleiten. Ein weiteres Beispiel ist here in Linux Journal.

Wie Sie an diesen Links sehen können, besteht der grundlegende Kern des "Tricks" darin, dass Sie das System Ihre eigene dynamische Bibliothek vor anderen Systembibliotheken wie Pthreads usw. laden und dann die Aufrufe maskieren können zu diesen Bibliotheksfunktionen, indem Sie Ihre eigenen Versionen dieser Funktionen als Präzedenzfall platzieren. Sie können dann innerhalb Ihrer übergeordneten Funktion die Verwendung der ursprünglichen Funktion protokollieren und die Argumente an den tatsächlichen Anruf weiterleiten, den Sie zu protokollieren versuchen.

Das nette Ding über diese Methode ist, dass es so ziemlich jeden Anruf fängt, den Sie machen können, sowohl eine Funktion, die vollständig im Benutzerland bleibt, als auch eine Funktion, die einen Kernel-Aufruf machen wird.

Verwandte Themen