bestimmte Prozesse und/oder PIDs in Ftrace herausfiltern?

bestimmte Prozesse und/oder PIDs in Ftrace herausfiltern?

Ich bin nicht sicher, ob ich das richtig sehe (bitte korrigieren Sie mich, wenn ich falsch liege), aber Folgendes ist mein Verständnis von ftrace.

In /sys/kernel/debug/tracing befinden sich die folgenden Dateien:

set_ftrace_filter

die nur die darin aufgeführten Funktionen verfolgt,

set_ftrace_notrace

das nur die darin NICHT aufgeführten Funktionen verfolgt und

set_ftrace_pid

Dadurch werden nur die Prozesse verfolgt, die die PID enthalten.

Meine Frage ist:Gibt es eine Möglichkeit, es so zu konfigurieren, dass ftrace nur Prozesse verfolgt, die KEINE bestimmte PID (oder keinen bestimmten Prozessnamen) haben?

Analogie:

set_ftrace_filter: set_ftrace_notrace :: set_ftrace_pid:X

TutXexistiert, und wenn ja, wie verwende ich es?

Wenn ich zum Beispiel alle Prozesse außer dem mit PID 48 verfolgen möchte, gibt es eine Möglichkeit, etwas Bedeutungsvolles einzugeben?nicht 48in set_ftrace_pid?

Ich habe die Dokumentation gelesen und im Internet gesucht, kann jedoch weder herausfinden, wie dies erreicht werden kann, noch ob dies möglich ist.

Warum ich das mache:Ich habe ein Programm, das Systemaufrufe auf Kernelebene verfolgt, aber ich möchte die PID des Programms (und die PIDs seiner untergeordneten Elemente, falls später erforderlich) in einen Filter schreiben, damit sie nicht in die Ablaufverfolgungsdaten aufgenommen werden. Beim Lesen der Ablaufverfolgung könnte ich die PID beim Lesen jedes Ablaufverfolgungsdatensatzes überprüfen und entscheiden, ob dieser Datensatz verwendet werden soll oder nicht. Ich würde diesen Overhead jedoch lieber nicht für jeden gelesenen Datensatz hinzufügen, wenn es eine Möglichkeit gibt, dies zu vermeiden.

Vielen Dank für Ihre Zeit!

Antwort1

Ich habe herausgefunden, wie ich das, was ich beschrieben habe, machen kann, aber es war ein bisschen kontraintuitiv, also poste ich die Antwort hier für Leute, die bei ihrer Suche auf diese Seite stoßen könnten (tl:dr;am Boden). Soweit ich weiß,es gibt keine pauschale Möglichkeit, Prozesse mit einer bestimmten PID einfach aus ftrace herauszufiltern, wie es so einfach zu machen ist, ihm zu sagen, dass NUR Prozesse mit einer bestimmten PID berücksichtigt werden sollen, aber in meinem Fall interessieren mich nur die Rohsystemaufrufe (sys_enter) und ich habe herausgefunden, wie man Datensätze mit bestimmten PIDs aus der Einbeziehung für diese ausschließt, und zwar so:

Das ftrace-Verzeichnis ist:

/sys/kernel/debug/tracing/

Darin befindet sich ein Verzeichnis namens "Veranstaltungen." Von hier aus können Sie alle Dinge sehen, die ftrace verfolgen kann, aber für meinen Fall gehe ich zu "Rohsystemaufrufe."

InnerhalbRohsystemaufrufe," die beiden Unterverzeichnisse sindsys_enterUndsys_exit.

In sys_enter (und sys_exit) befinden sich die folgenden Dateien:

aktivieren

Filter

Format

Ausweis

auslösen

"Filter" ist das, was uns im Moment am meisten interessiert, aberFormatenthält nützliche Informationen zu den Feldern eines Eintrags, der von ftrace erstellt wird, wenn sys_enter aktiviert ist:

name: sys_enter
ID: 17
format:
    field:unsigned short common_type;   offset:0;   size:2; signed:0;
    field:unsigned char common_flags;   offset:2;   size:1; signed:0;
    field:unsigned char common_preempt_count;   offset:3;   size:1; signed:0;
    field:int common_pid;   offset:4;   size:4; signed:1;

    field:long id;  offset:8;   size:8; signed:1;
    field:unsigned long args[6];    offset:16;  size:48;    signed:0;

Hier kümmern wir uns umgemeinsame_pid.

Wenn Sie möchten, dass Ihr Trace Datensätze aus einem Prozess mit PID auslässtNbearbeiten

/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter

Lesen:

common_pid != n

Wenn das Programm, das Sie beim Tracing ignorieren möchten, mehrere Threads oder mehrere Prozesse hat, verwenden Sie einfach den Operator &&. Angenommen, Sie möchten Prozesse mit PIDs ausschließen.N,Ö, UndPwürden Sie die Datei so bearbeiten, dass sie lautet:

common_pid != n && common_pid != o && common_pid != p

Um einen Filter zu löschen, schreiben Sie einfach "0" zur Datei:

echo "0" > /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter

...würde es tun.

aktivierenmuss enthalten "1" für das Ereignis, das Sie verfolgen, sowietracing_onim ftrace-Verzeichnis. Schreiben in0schaltet die Rückverfolgung dieses Ereignisses (oder die gesamte Rückverfolgung im Fall vontracing_on) aus.

Zum Schreiben in diese Dateien sind Root-Berechtigungen erforderlich.

Das ist so ziemlich alles, was mir einfällt. Vielen Dank an alle, die das gelesen/abgestimmt haben, und ich hoffe, meine Antwort hilft jemandem. Wenn jemand eine Möglichkeit kennt, die meine Vorgehensweise dumm aussehen lässt, kann er mich gerne darauf hinweisen.

kurz und knapp:um Datensätze aus Prozess 48 herauszufiltern, schreiben Sie:

common_pid != 48

...Zu

/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/filter

Filtern Sie mehrere PIDs (z. B. 48, 49, 53, 58), indem Sie stattdessen Folgendes schreiben:

common_pid != 48 && common_pid != 49 && common_pid != 53 && common_pid !=58

Ersetzen Sie „events/raw_syscalls/sys_enter“ durch das gewünschte Ereignis und ersetzen Sie meine Zahlen durch die PIDs, die Sie ignorieren möchten.

verwandte Informationen