Welche Inter Sperren Anrufe soll ich kontrollieren?
-
19-09-2019 - |
Frage
Ich bin Überwachung eines Prozesses mit strace
/ ltrace
in der Hoffnung auf finden und Intercept ein Anruf, der überprüft, und aktiviert möglicherweise eine Art global gemeinsame Sperre.
Während ich mit habe behandelt und vor über verschiedene Formen der Interprozessverriegelung auf Linux lesen, ich bin eine leere Zeichnung auf, was Anrufe zu suchen.
Zur Zeit meine einzige Verdächtige ist futex()
, die in dem Prozess Ausführung sehr früh kommt.
UPDATE0
Es gibt einige Verwirrung über das, was ich bin nach. Ich bin Überwachung ein bestehender Prozess für Anrufe in persistent Inter Speicher oder gleichwertig . Ich würde gerne wissen, was System und Bibliothek Anrufe zu suchen. Ich habe nicht die Absicht, diese selbst nennen, so natürlich futex()
wird kommen, ich bin sicher, dass viele Bibliotheken ihre Sperren Anrufe in Bezug auf diese umzusetzen, etc.
Update1
würde ich eine Liste von Funktionsnamen oder der Nummer einen Link zur Dokumentation, dass ich bei den ltrace
und strace
Ebenen (und Angabe, welche) überwachen soll. Jede andere gute Ratschläge, wie die globale Sperre im Auge zu verfolgen und zu lokalisieren wäre toll.
Lösung
Wenn Sie überwachten Prozess in valgrind starten können, dann gibt es zwei Projekte:
http://code.google.com/p/data -Rennen-Test / wiki / ThreadSanitizer
und Helgrind
http://valgrind.org/docs/manual/hg-manual.html
Helgrind kennt all die pthread Abstraktionen und verfolgt ihre Auswirkungen so genau wie möglich. Auf x86 und amd64-Plattformen, es versteht und teilweise Griffe implizite Sperr die sich aus der Verwendung des LOCK Befehlspräfix.
So können diese Tools erkennen selbst atomare Speicherzugriffe. Und sie werden pthread Nutzung überprüfen
Andere Tipps
Herd ist ein weiterer guter
-
Es gibt viele Systemaufrufe zur Verriegelung verwendet werden. Herde, fcntl und sogar erstellen
-
Wenn Sie pThreads / sem_ * Schlösser verwenden sie im User-Space ausgeführt werden können, so dass Sie nie sehen, wie sie in Strace als futex genannt wird nur für Operationen anhängig. Wie, wenn Sie tatsächlich müssen warten.
-
Manche Vorgänge können im User-Space nur durchgeführt werden - wie spinlocks - Sie werden nie sehen es sei denn, sie einige wartet Timer tun -. Backoff, so dass Sie nur Sachen wie Nanosleep sehen kann, wenn eine Sperre für andere wartet
Es gibt also keine „generische“ Art und Weise ist, sie zu verfolgen.
auf Systemen mit glibc ~> = 2,5 (glibc + nptl) Sie können Mitbenützung Prozess
semaphores (last parameter to sem_init), more precisely, posix unnamed semaphores
posix mutexes (with PTHREAD_PROCESS_SHARED to pthread_mutexattr_setpshared)
posix named semaphores (got from sem_open/sem_unlink)
system v (sysv) semaphores: semget, semop
Auf älteren Systemen mit glibc 2.2, 2.3 mit linuxthreads- oder auf Embedded-Systemen mit uClibc können Sie nur System v verwenden (sysv) Semaphore für iterprocess Kommunikation.
UPD1. Jede IPC und socker muss geprüft werden,