So verfolgen Sie Systemanrufe, die von einem Prozess mit Strace unter Linux getätigt wurden

So verfolgen Sie Systemanrufe, die von einem Prozess mit Strace unter Linux getätigt wurden

Es gibt Zeiten, in denen es nützlich ist, zu prüfen, was eine laufende Anwendung unter der Motorhaube tut und wie System es während ihrer Ausführung durchführt. Um eine solche Aufgabe unter Linux zu erfüllen, können wir die verwenden Strace Dienstprogramm. In diesem Artikel werden wir sehen, wie man es installiert, und wir werden die grundlegende Nutzung lernen.

In diesem Tutorial lernen Sie:

  • So installieren Sie Strace
  • So verwenden Sie Strace, um Systemanrufe zu verfolgen, die von einem Prozess getätigt wurden
  • So filtern Sie Spezifikationen Systemanrufe
  • So befinden Sie sich an einen bereits laufenden Prozess
  • So generieren Sie eine Systemanrufzusammenfassung
So verfolgen Sie Systemanrufe, die von einem Prozess mit Strace unter Linux getätigt wurden

Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Verteilungsunabhängige
Software Strace
Andere Vertrautheit mit der Befehlszeilenschnittstelle und Linux Process Management
Konventionen # - Linux -Commands, die mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mithilfe von verwendet werden sollen sudo Befehl
$-Linux-Commands, die als regulärer nicht privilegierter Benutzer ausgeführt werden sollen

Installation

Obwohl standardmäßig nicht installiert, die Strace Der Versorgungsunternehmen ist in den offiziellen Repositories aller wichtigen Linux -Verteilungen verfügbar. Dies bedeutet, dass wir es mit unserem Lieblingspaketmanager sehr einfach installieren können.

Wenn wir beispielsweise auf Fedora (oder einer anderen Verteilung in der Red Hat -Familie) laufen, müssen wir verwenden DNF:

$ sudo dnf install Strace installieren 


Wenn wir uns mit Debian oder Debian-basierten Verteilungen wie Ubuntu oder Linux Mint bequemer fühlen, können wir verwenden geeignet das gleiche Ergebnis erzielen:

$ sudo Apt installieren Sie Strace 

Wenn Arch Linux unsere Wahlverteilung ist, können wir verwenden Pacman So installieren Sie die Anwendung, die in der verfügbar ist extra Repository:

$ sudo pacman -s Strace 

Wenn die Software installiert ist, können wir vorwärts gehen und einige Beispiele für ihre Verwendung sehen.

Einführung von Strace

Wie wir bereits gesagt haben, Strace ist ein Tool, das verwendet wird, um die Systemanrufe zu verfolgen,. Systemaufrufe sind die grundlegende Schnittstelle zwischen einer Anwendung und dem Linux -Kernel. Wenn wir benutzen Strace, Der Name der Aufrufe eines Prozesses sowie deren Argumente und Rückgabeteile werden angezeigt Stderr (Standardfehlerdateideskriptor).

Lassen Sie uns eine grundlegende Verwendung von sehen Strace, Um mit seiner Ausgabe vertraut zu sein. In seiner grundlegendsten Verwendung rufen wir an Strace gefolgt von dem Programm, das wir ausführen möchten und das das Verhalten, das wir analysieren möchten. Für dieses Beispiel kopieren wir einfach eine Datei mit der Datei CP Befehl:

$ strace cp ~/.Bashrc Bashrc 

Die Ausgabe des Befehls ist ziemlich lang, und hier können wir ihn natürlich nicht im Detail analysieren. Lassen Sie uns einfach die erste Zeile sehen. Jede Zeile in der Strace Ausgabe enthält:

  • Der Systemanrufname
  • Die Argumente, die an den Systemaufruf in Klammern übergeben wurden
  • Der Systemanruf -Rückgabewert

Der erste Systemaufruf, den wir in der Ausgabe sehen können, ist ausführen. Dieser Anruf wird verwendet, um ein Programm mit einer bestimmten Argumente auszuführen. Das erste Argument, das von akzeptiert wurde execv ist der Pfad der Datei, die wir ausführen möchten; Die zweite ist eine Reihe von Zeichenfolgen, die die Argumente darstellen, die an das Programm übergeben werden (das erste Argument, durch Konvention der Name des Programms selbst).

In unserem Fall ist wie erwartet die Binärin, die aufgerufen wird /usr/bin/cp, und die an den Anruf übergebene Argumente sind: Der Name des Programms (CP), die Quelle und die Zielwände:

execve ("/usr/bin/cp", ["cp", "/home/egdoc/.bashrc "," bashrc "], 0x7fff53d4e4c0 / * 46 vars * /) = 0 

Der / * 46 vars */ Notation bedeutet, dass 46 Variablen, die aus dem Anrufprozess geerbt wurden (in der execv Funktion Die Umgebung wird von extern genommen Umwelt Variable). Schließlich haben wir das Rückgabewert, was in diesem Fall ist 0 (Eigentlich die Geschäftsführer Funktion Familie gibt einen Wert nur zurück, wenn ein Fehler auftritt.

Filterung nur bestimmte Systemaufrufe

Beim Benutzen Strace Manchmal möchten wir möglicherweise nur spezielle Systemanrufe im Auge behalten, die von einem Prozess getätigt wurden. In diesen Situationen können wir das verwenden -e Option, gefolgt von einem Ausdruck, der angibt, welche Systemaufrufe verfolgt werden sollten. Angenommen, wir führen den gleichen Befehl aus, den wir im vorherigen Beispiel verwendet haben, aber wir wollen nur das lesen Systemaufrufe, die in der Ausgabe angezeigt werden sollen, würden wir ausführen:

$ strace -e lesen cp ~/.Bashrc Bashrc 

Wie erwartet nur lesen Anrufe werden gemeldet:

Die Ausgabe des „Strace -e lesen cp ~/.Bashrc Bashrc ”Befehl übrigens, der, der, der lesen Systemaufruf erfordert drei Argumente: Der erste ist a Dateideskriptor mit der Datei verbunden, die gelesen werden sollte; der zweite ist das Puffer in die die Datei gelesen werden sollte, und der dritte ist die Anzahl der Bytes das sollte gelesen werden. Bei Erfolg gibt die Funktion die Anzahl der aus der Datei gelesenen Bytes zurück.

Anbringen von Strace bei einem Laufprozess

Bis jetzt haben wir uns angerufen Strace An die Ausführung des Befehls und die Spur an ihn weitergeben; Was ist, wenn wir einen vorhandenen und bereits laufenden Prozess verfolgen möchten?? In diesem Fall müssen wir anrufen Strace mit dem -P (oder --anfügen) Option und übergeben die PID (Prozess -ID) des Prozesses, an den wir ihn beibringen möchten.

Um die PID eines Programms zu finden, können wir unter den anderen Lösungen das verwenden PIDOF Dienstprogramm. Für dieses Beispiel werden wir Strace einer laufenden Instanz von anbringen Gnom-terminaler Server:

$ pidof gnom-terminal-server 121316 


Der PIDOF Befehl zurückgegeben 121316, Welches ist die Haltung des Gnom-terminalen Servers. Wenn wir das wissen, können wir anbringen Strace zum Prozess:

$ strace -p 121316 

Der obige Befehl gibt zunächst etwas zurück wie:

Die Ausgabe des Befehls „Strace -P 121316“ Die obige (abgeschnittene) Ausgabe wird "on the Fly" aktualisiert, wenn Systemaufrufe ausgeführt werden. Zu "abnehmen" Strace Wir können einfach drücken Strg+c auf der Tastatur; Wir werden über die „Ablösung“ informiert, aber der verfolgte Prozess wird weiterhin ausgeführt:
Strace: Prozess 121316 abgelöst 

Verfolgungsignale

Dank an Strace Wir können auch beobachten, wann ein Prozess ein Signal empfängt und wie es darauf reagiert. Lass es mich demonstrieren. Zunächst starten wir einen langjährigen Prozess als Spitze, Welches ist ein Prozessmonitor:

$ top 

Wir als anbringen Strace nach dem Erhalt seiner PID, was in diesem Fall ist 44825:

$ strace -p 44825 

An dieser Stelle Strace beginnt mit der Verfolgung der Systemanrufe von verfolgt von Spitze, aber auch die von ihm erhaltenen Signale. Um es zu beweisen, senden wir eine Sigterm zu pid 44825:

$ Kill 44825 

Wie erwartet wird das Ereignis in der gemeldet Strace Ausgang:

--- Sigterm si_signo = sigterm, si_code = si_user, si_pid = 44888, si_uid = 1000 --- 

In der obigen Ausgabe Si_signo ist die Anzahl der gelieferten Signale (sigterm = 15), Si_code Enthält einen Code, der die Ursache des Signals identifiziert (si_user = 0): In diesem Fall wurde das Signal von einem Benutzerprozess generiert. Der si_pid Und Si_Uid Fields -Bericht jeweils die PID des Sendungsprozesses und dessen Uid.

Speichern Sie die Ausgabe von Strace in einer Datei

Wenn wir das verwenden Option (kurz für --OUPUT) Beim Start Strace, Wir können ihre Ausgabe in eine Datei umleiten und einen Pfad als Argument übergeben, z. B.:

$ strace -p 121316 -O Strace_Output Strace: Prozess 121316 beigefügt 

Der STACE_OUTPUT Die Datei wird erstellt und die Ausgabe von Strace wird darin geschrieben sein. Um das Update in der Datei anzusehen, können wir die verwenden Schwanz: Normalerweise liest dieser Befehl die letzten 10 Zeilen einer Datei und beendet, aber wenn wir sie mit dem nennen -F Option (kurz für --folgen) Wir können beobachten, wie neue Inhalte angehängt sind:

$ tail -f strace_output 


Drucken Sie eine Zusammenfassung der Systemaufrufe aus

Der Strace Das Dienstprogramm verfügt über eine sehr nützliche Funktion: Die Fähigkeit, eine Zusammenfassung aller Systemanrufe zu generieren, die von einem bestimmten Prozess getätigt wurden. Wenn wir einen solchen Bericht generieren wollen, müssen wir nur das Programm mit dem aufrufen -C oder --nur zusammenfassende Möglichkeit. Nehmen wir als Beispiel die CP Befehl, den wir zuvor verwendet haben:

$ strace -c cp ~/.Bashrc Bashrc 

Der obige Befehl generiert diesen Bericht:

% Zeit Sekunden usecs/Anrufe Fehler SYSCALL ------ ----------- ----------- ---------- ---- ------ ---------------- 25.71 0.000298 7 38 13 Openat 19.24 0.000223 4 51 mmap 11.48 0.000133 4 28 Schließen 9.92 0.000115 57 2 1 Newfstatat 7.94 0.000092 10 9 Mprotect 6.99 0.000081 3 25 fstat 2.85 0.000033 3 11 Read 2.76 0.000032 16 2 Munmap 2.50 0.000029 14 2 STATFS 1.90 0.000022 22 1 Schreiben 1.55 0.000018 2 8 PRED64 1.38 0.000016 8 2 1 Zugang 1.04 0.000012 4 3 BRK 0.78 0.000009 4 2 RT_Sigaction 0.60 0.000007 7 1 FUTEX 0.52 0.000006 3 2 1 arch_prctl 0.43 0.000005 5 1 RT_SIGPROCMASK 0.43 0.000005 5 1 set_tid_address 0.43 0.000005 5 1 Fadvise64 0.43 0.000005 5 1 set_robust_list 0.43 0.000005 5 1 prlimit64 0.26 0.000003 3 1 1 Stat 0.26 0.000003 3 1 1 lseek 0.17 0.000002 2 1 GetEUID 0.00 0.000000 0 1 Execve ------ ----------- ----------- ---------- --------- ---------------- 100.00 0.001159 5 196 18 Gesamt 

Wie Sie sehen können, da wir eine Zusammenfassung generiert haben, ist der normale Ausgang von Strace wird nicht angezeigt. Wenn wir die Zusammenfassung generieren möchten, aber dennoch die reguläre Ausgabe des Programms erhalten möchten, müssen wir die verwenden -C Option stattdessen, was die Kurzform von ist --Zusammenfassung.

Schlussfolgerungen

In diesem Tutorial haben wir gelernt, wie man installiert und verwendet Strace, Ein schönes Dienstprogramm, das für Debugging -Zwecke nützlich ist, und allgemeiner, um die von einem Prozess ausgeführten Systemaufrufe im Auge zu behalten. Wir haben gesehen, wie die Ausgabe von Strace ist organisiert, wie Sie ein Programm starten und die Systemaufrufe verfolgen, wie Sie anhängen Strace zu einem bereits laufenden Prozess und wie Signale, die durch einen Prozess empfangen werden, benachrichtigt werden; Schließlich haben wir gesehen, wie man eine Zusammenfassung aller Anrufe eines Prozesses erstellt. Hier kratzten wir kaum die Oberfläche dessen, was wir tun können Strace: Wenn Sie mehr darüber erfahren möchten, lautet der Rat wie immer das Handbuch, das Handbuch zu lesen!

Verwandte Linux -Tutorials:

  • Dinge zu installieren auf Ubuntu 20.04
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
  • Linux -Konfigurationsdateien: Top 30 am wichtigsten
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Dinge zu installieren auf Ubuntu 22.04
  • Hung Linux System? Wie man zur Befehlszeile entkommt und…
  • So verwenden Sie den Befehl TCPDump unter Linux
  • Kann Linux Viren bekommen?? Erforschung der Verwundbarkeit von Linux…
  • Dinge zu tun nach der Installation Ubuntu 22.04 Jammy Quallen…
  • Mint 20: Besser als Ubuntu und Microsoft Windows?