Es tut mir leid, dass ich Code nicht zur Verfügung stellen kann, um dies zu reproduzieren. Mein Problem ist gerade, dass ich nicht weiß, wie man dieses Problem debuggt.gelegentlich fehlt PTRACE_EVENT_VFORK bei der Ausführung von Ptrace
Ich benutze ptrace mit PTRACE_O_TRACEFORK | PTRACE_O_TRACEEXEC | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE | PTRACE_O_TRACECLONE
, um einen Prozess zu verfolgen, und es ist Kinder (und die Kinder der Kinder). Der Mechanismus ist ähnlich wie strace
, aber mit etwas anderen Zwecken, da ich nur Dateien lese, die gelesen oder geändert werden.
Mein Code (in C geschrieben) funktioniert gut auf Debian Wheezy und Debian Jessie auf der x86-64-Architektur (und auch weniger getestet auf i386). Wenn ich versuche, auf einer Ubuntu Precise x86-64 virtuellen Maschine (die einen Kernel 3.2.0 verwendet) zu kompilieren und zu laufen, stoße ich in Schwierigkeiten.
Auf der Precise Maschine, ich manchmal feststellen, dass ich nicht erhalten eine PTRACE_EVENT_VFORK
unmittelbar nach einem vfork
Aufruf geschieht, sondern beginnen Ereignisse empfangen (ein paar SIGSTOP
Ereignisse und einige Systemaufrufe), ohne jemals die immer PTRACE_EVENT_VFORK
Ereignis. Ich sehe nichts Verdächtiges in den Systemaufrufen, die durchgeführt werden, und das Verhalten ist nicht vorhersehbar.
Ich bin mir nicht sicher, was ich versuchen sollte, dies auf einen minimalen Fehlerfall zu reduzieren, und ich habe wirklich keine Ahnung, was schief gehen könnte, noch nie zuvor dieses Verhalten von fehlenden Ereignissen gesehen. Es ist denkbar, dass der Unterschied nicht der Kernel ist, sondern die Build-Tools, die ich verfolge (was eine Kombination von python + gcc ist).
Irgendwelche Vorschläge?
Wenn hier niemand helfen kann, fragen Sie auf der Linux-Kernel-Mailingliste. (Unwahrscheinlich zu helfen, aber einen Versuch wert.) Als Alternative zu 'ptrace' könnten Sie den [LD_PRELOAD-Trick] (http://stackoverflow.com/q/426230/) verwenden, um Aufrufe von' open', 'abzufangen Lesen ',' Schreiben' und 'Schließen'. Und viel Glück; Das hört sich ekelhaft an. – Nemo
Ich habe LD_PRELOAD vermieden, da ich möchte, dass mein Code statisch verknüpfte Binärdateien verfolgen kann. Und ehrlich gesagt habe ich Angst vor Linux-Kernel! lol :) –
Ich stimme zu LD_PRELOAD ist kein vernünftiger/gültiger Weg, dies zu tun. Leider kenne ich die Ursache für die Vfork-Trace-Fehler nicht. Wenn Sie den seccomp-Verfolgungsmodus anstelle des herkömmlichen ptrace-Stils verwenden können, ist er möglicherweise weniger fehleranfällig und portabler. –