Ich verstehe, dass der strace
Befehl verwendet ptrace(PTRACE_PEEKUSER, child, __builtin_offsetof(struct user, regs.orig_eax))
, um den Index eines Systemaufrufs zu finden, bei dem das Trace-Kind gefangen ist. Um den Index dann in den Namen der syscall-Funktion zu übersetzen, wurden Tabellen erstellt, die aus dem Greifen der in der Installation vorhandenen Linux-Quellcode-Header bestehen.
Diese Methode muss undokumentiert und fehleranfällig sein, da Speicherort und Syntax von Quellcodedeklarationen nicht dokumentiert sind, durch Greifen ermittelt werden müssen und sich auf unbekannte Weise ändern können. Habe ich Recht, das zu sagen?
Wenn dem so ist, warum sollte strace
ich dann nicht die folgende Methode anwenden, die meiner Meinung nach einfacher ist, sich nur auf die Dokumentation stützt und somit narrensicher ist.
strace
Sendet zu Beginn des ersten Laufs nach dem Neustart einen Test-Syscall, einen für jede Syscall-Funktion, fängt diesen ab und beobachtet, welchen Syscall-Index das untergeordnete System verwendet. Das ergibt eine vollständige und korrekte benutzerdefinierte Tabelle, die in einer Datei gespeichert werden kann, die weiteren Aufrufen von bekannt ist strace
.
Ich bin sicher, dass diese Methode in Betracht gezogen worden sein muss, da es nichts besonders Geniales ist. Es muss also etwas falsch daran sein. Was ist falsch??
open(foobar.txt, O_RDONLY)
Keine undokumentierten Sachen erforderlich
strace
glaube ich ). Ich muss also sicherstellen, dass die Tabelle strace
beim Neustart gelöscht wird , wenn sie gespeichert wird, da sie nicht bei jedem Aufruf neu berechnet werden soll. Sicherlich muss es in Linux eine Möglichkeit geben, festzustellen, ob ich nach dem Neustart zum ersten Mal angerufen werde. Sicherlich muss es eine Datei geben, die beim Neustart berührt / erstellt wird, damit ich meinen Zeitstempel damit vergleichen kann?
open(foobar.txt, O_RDONLY)
dass genau ein Systemaufruf erfolgt und das ist SYS_open
? Es könnte verwenden SYS_openat
. Dies kann dazu führen, dass andere Systemaufrufe als Teil der verzögerten Bindung im dynamischen Linker stattfinden, wenn dies der erste Aufruf von ist open
. Oder es handelt sich um andere Systemaufrufe, die intern für einen anderen Zweck verwendet werden. Es gibt keine triviale Eins-zu-Eins-Zuordnung, die Sie zwischen Bibliotheksaufrufen und Systemaufrufen annehmen können.