Wie funktioniert 'strace'?

2

Vor kurzem habe ich verwendet mv, um eine große Menge von Dateien von meiner Festplatte auf ein Flash-Laufwerk zu verschieben. Ich habe vergessen, eine ausführliche Flagge hinzuzufügen, damit ich keine Ahnung hatte, "wo" der Umzug war und wie viele Transfers noch übrig waren.

Ich fand das straceDienstprogramm und entschied mich, es für meinen MV-Prozess zu verwenden. Mit Hilfe von konnte ps -ef | grep mvich die PID des Prozesses finden und lief dann strace -p [PID]. Hier ist ein Beispiel von dem, was ich bekommen habe:

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{c,$\246]\204\342\261\"\374K\234\264\17\26\346\246\327\347m"..., 32768) = 32768

und dann einige:

fcntl(3, F_GETFD)                       = 0
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 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", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 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, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 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 das Kernel-Aufrufe? Wenn ja, was meinen sie (ich weiß, was Lesen und Schreiben tun, aber was sind diese Zahlen)?

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

n0pe
quelle
3
Möglicherweise interessieren Sie sich mehr für die Ausgabe von lsof -p <pid>, die Ihnen geöffnete Dateien und Zuordnungen eines Prozesses zeigt.
3.

Antworten:

5

Also, was genau gibt mir Strace?

Was straceSie erhalten, sind Systemaufrufe - Anrufe, die den Kernel anfordern, können etwas tun, was der Prozess selbst nicht kann, z. B. das Öffnen von Dateien. (ex fcntl, closeetc sind in Ihrer Spur zu finden).

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

fcntl (3, F_GETFD) = 0

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

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

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

  1. Das Beobachten von Feuerunterbrechungen scheint nicht so nützlich zu sein.
  2. Das Beobachten der Anweisungen, die der Prozessor ausführt, scheint ein wenig leise und immer noch nicht so nützlich zu sein. Ehrlich gesagt, wenn ich das wollte, würde ich mein Programm einfach in einem sehr langsamen Emulator ausführen , mit dem ich beobachten kann, welche Assembly interpretiert wird.

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

new123456
quelle
2

Sie haben so ziemlich die richtige Antwort in Ihrer ursprünglichen Frage.

Das Standardverhalten von straceist, zu melden, welche Systemaufrufe für diesen Prozess ausgeführt werden, es werden auch aufgerufene Signale gemeldet und welcher Handler dieses Signal behandelt hat.

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

Die Argumente, die diesen syscalls weitergegeben wurden , werden gezeigt - oft abgestumpften, da die Rohdaten Kilo sein kann / Mega / Giga - Bytes groß) fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) (die ...schenkt das Abschneiden). Was diese Werte darstellen, ist von Syscall zu Syscall unterschiedlich, aber man zeigt, was sie darstellen (vorausgesetzt, Sie verfügen über die grundlegenden Manpages für die auf Ihrem System installierten Sys-Aufrufe). man 2 fstatzeigt die Handbuchseite des Programmierers für fstat und erläutert die Argumente.

Und das Ergebnis dieses Systemaufrufs getdents64(3, /* 22 entries */, 32768) = 1008 1008in diesem Fall. Der Wert dieses Ergebniscodes wird auf der man (1) -Seite des jeweiligen Systemaufrufs in der gleichen Weise dokumentiert, wie die Argumente detailliert sind. Beachten Sie in diesem Fall, dass /* 22 entries */es sich um eine andere Kürzungsoperation handelt, die mit erweitert werden kann -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 mehr der an den Befehl übergebenen Argumente zu sehen) und Ausdrucksfilterung -e.

edit hat einige Anmerkungen zu anderen Forms hinzugefügt, bei denen das Argument abgeschnitten wurde.

Drav Sloan
quelle