Wie funktioniert "strace"?

2556
n0pe

Vor kurzem habe ich mveine große Anzahl von Dateien von meiner Festplatte auf ein Flash-Laufwerk verschoben. Ich habe vergessen, eine verbose Flagge hinzuzufügen, sodass ich keine Ahnung hatte, "wo" der Zug war und wie viele Transfers übrig waren.

Ich habe das straceDienstprogramm gefunden und beschlossen, es in meinem MV-Prozess zu verwenden. Mit ps -ef | grep mvkonnte ich die pid des Prozesses finden und dann lief strace -p [PID]. Hier ist ein Beispiel von dem, was ich bekam:

write(4, "\325\0\0s\1\1\224\0\0\0\0\0109\27\0\0\201\327\0\0\240H:\310xgM\337\274\26\"\273"..., 32768) = 32768 read(3, "\6\3319H\r\207\345\257\301JL)\2601C\t\303\22(\214\353\211\230;{\6\214\355nh@F"..., 32768) = 32768 write(4, "\6\3319H\r\207\345\257\301JL)\2601C\t\303\22(\214\353\211\230;{\6\214\355nh@F"..., 32768) = 32768 read(3, "ZK\301\332\263\214@\177\3352$\374\277];\255\265\364\240d\275\307P\237*\364\23\206\31\306\244\256"..., 32768) = 32768 write(4, "ZK\301\332\263\214@\177\3352$\374\277];\255\265\364\240d\275\307P\237*\364\23\206\31\306\244\256"..., 32768) = 32768 read(3, ".\341\355\32\366\7\365\244\4\4\221) = 0 fcntl(3, F_GETFL) = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW) fcntl(3, F_SETFD, FD_CLOEXEC) = 0 fcntl(3, F_DUPFD, 3) = 4 fcntl(4, F_GETFD) = 0 fcntl(4, F_SETFD, FD_CLOEXEC) = 0 getdents64(3, /* 4 entries */, 32768) = 120 getdents64(3, /* 0 entries */, 32768) = 0 close(3) = 0 newfstatat(4, "The Pick of Destiny",, AT_SYMLINK_NOFOLLOW) = 0 openat(4, "The Pick of Destiny", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3 fcntl(3, F_GETFD) = 0 fcntl(3, F_SETFD, FD_CLOEXEC) = 0 fstat(3, ) = 0 fcntl(3, F_GETFL) = 0x38800 (flags O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW) fcntl(3, F_SETFD, FD_CLOEXEC) = 0 fcntl(3, F_DUPFD, 3) = 5 fcntl(5, F_GETFD) = 0 fcntl(5, F_SETFD, FD_CLOEXEC) = 0 getdents64(3, /* 22 entries */, 32768) = 1008 getdents64(3, /* 0 entries */, 32768) = 0 close(3) = 0 

Also, was genau gibt mir strace? Sind diese Kernel-Aufrufe? Wenn ja, was bedeuten sie (ich weiß, was Lesen und Schreiben tun, aber wie lauten diese Zahlen)?

Bonusfrage: Gibt es eine Möglichkeit für mich, etwas "niedriger" zu sehen, als es mir die Strace zeigt? CPU-Aufrufe vielleicht?

2
Möglicherweise interessieren Sie sich für die Ausgabe von `lsof -p `, zeigt Ihnen geöffnete Dateien und Zuordnungen eines Prozesses. jkj vor 12 Jahren 3
@jkj - Danke, das ist großartig n0pe vor 12 Jahren 0

2 Antworten auf die Frage

4
new123456

Also, was genau gibt mir strace?

Was stracedir gibt ist Systemaufrufe - Anrufe, die den Kernel tun etwas fordern, dass der Prozess selbst nicht, wie das Öffnen von Dateien tun. (ex fcntl, closeusw. finden Sie in Ihrer Spur).

Wenn ja, was bedeuten sie (ich weiß, was Lesen und Schreiben tun, aber wie lauten diese Zahlen)?

fcntl (3, F_GETFD) = 0

Übersetzt in: Systemaufruf (fcntl) mit Argumenten (3, F_GETFD), der einen Wert (0) zurückgibt .

Bonusfrage: Gibt es eine Möglichkeit für mich, etwas "niedriger" zu sehen, als es mir die Strace zeigt? CPU-Aufrufe vielleicht?

Sie meinen entweder 1) CPU-Interrupts oder 2) Montageanweisungen. Ich weiß es nicht ehrlich, aber:

  1. Es scheint, als wäre es nicht nützlich, Interrupts beim Feuer zu beobachten.
  2. Das Beobachten der Anweisungen, die der Prozessor ausführt, scheint ein wenig niedrig und dennoch nicht so nützlich. Ehrlich gesagt, wenn ich das wollte, würde ich mein Programm in einem wirklich langsamen Emulator ausführen, der es mir ermöglicht zu beobachten, welche Assemblierung interpretiert wird.

strace hat eine Manpage - ich schlage vor, Sie lesen sie, wenn Sie Details zu ihrer Funktionsweise wünschen.

2
Drav Sloan

In Ihrer ursprünglichen Frage haben Sie die richtige Antwort.

Standardmäßig stracewird gemeldet, welche Systemaufrufe für diesen Prozess ausgeführt werden. Außerdem werden die aufgerufenen Signale und der Handler, der dieses Signal verarbeitet hat, gemeldet.

In Ihrem Beispiel sind die syscalls aufgerufen wird am Anfang der Zeile: fcntl(), getdents64() close()usw.

Die Argumente, die an diese Systemaufrufe übergeben wurden, werden angezeigt - häufig abgeschnitten, da die Rohdaten Kilo / Mega / Gigabyte groß sein können fstat(3, ) (das ...spendet die Kürzung). Welche Werte dieser Wert darstellt, ist von Systemaufruf zu Systemaufruf unterschiedlich, aber man wird anzeigen, was er darstellt (vorausgesetzt, Sie verfügen über die grundlegenden Manpages, die sich auf die auf Ihrem System installierten Sys-Aufrufe beziehen). man 2 fstatzeigt die Handbuchseite des Programmierers für fstat und die Argumente an.

Und das Ergebnis dieses Systems getdents64(3, /* 22 entries */, 32768) = 1008 1008in diesem Fall. Der Wert dieses Ergebniscodes wird auf der man (1) -Seite des jeweiligen Systemaufrufs auf dieselbe Weise dokumentiert, wie die Argumente detailliert beschrieben werden. Beachten Sie in diesem Fall, dass /* 22 entries */es sich um eine weitere Kürzungsoperation von strace handelt. Diese kann mit erweitert werden -e abbr=none.

Beachten Sie, dass stracenicht ein universeller Befehl ist, einige Versionen von Unix - Nutzung truss, ktraceund dumpähnliche Debuggen auf einen Prozess durchzuführen. Sie sollten auch einen Blick auf die Manpage Strace nehmen, es mit einigen erweiterten Optionen kommt (vielleicht wird dies Ihr schließen Bonus - Frage ) wie -i(Druck den Befehlszeiger) -v(Ausführlichkeit) -a(den Standort wechseln - Säule - des Ergebnisses Teil um weitere Argumente anzuzeigen, die an den Befehl übergeben wurden, und die Ausdrucksfilterung -e.

edit fügte einige Notizen über das Abschneiden anderer Argumente hinzu.