4 Stimmen

strace/ltrace gibt inkonsistente Informationen aus

strace pwd :

getcwd("/root"..., 4096)                = 6

ltrace pwd :

getcwd(NULL, 0)                                     = "/root"

Warum ist der 1. Parameter NULL en ltrace ?

Es scheint, dass strace/ltrace sowohl die ptrace syscall, aber warum erhalten sie unterschiedliche Informationen?

4voto

kosklain Punkte 399

Richtig, sie verwenden beide ptrace und auch sie erhalten unterschiedliche Informationen. Dies ist, weil sie verwenden ptrace anders.

Wenn Sie einen Blick auf die ptrace man-Seite Sie werden sehen, dass es mehrere 'request'-Werte gibt, die das Verhalten von ptrace bestimmen.

Konkreter gesagt, wenn Sie ptrace um die Option vorher zu setzen PTRACE_O_TRACESYSGOOD können Sie zwischen den Traps, die zu Systemaufrufen führen, und den Traps, die nicht zu Systemaufrufen führen, unterscheiden.

3voto

Juan Cespedes Punkte 1269

ltrace zeigt den Aufruf der Bibliothek. In diesem Fall zeigt es die Funktion aus der libc die der Quellcode aufruft.

Wenn Sie sehen pwd finden Sie im Quelltext (coreutils-8.13, Datei lib/xgetcwd.c):

char *cwd = getcwd (NULL, 0);

Also, ltrace korrekt ist: pwd führt aus. getcwd(NULL, 0) . Laut der Linux-Manpage getcwd(3) :

getcwd() weist den Puffer dynamisch mit malloc(3) zu, wenn buf NULL ist.

Allerdings ist der Systemaufruf getcwd(2) benötigt immer ein erstes Argument ungleich NULL, um den Pfadnamen dorthin zu kopieren. Sie können sehen, wie dies in den libc-Quellen (eglibc-3.13, Datei sysdeps/unix/sysv/linux/getcwd.c) gemacht wird.

Der Aufruf der Bibliothek getcwd(NULL, 0) führt den Systemaufruf getcwd(path, alloc_size) , wobei path das Ergebnis eines vorangegangenen malloc() ist, und alloc_size ist die Seitengröße (4096).

Um dies zu bestätigen, führen Sie ltrace -S pwd werden Sie sowohl die Bibliotheksaufrufe als auch die Systemaufrufe sehen: Sie werden etwa Folgendes sehen

getcwd(NULL, 0 <unfinished ...>
SYS_getcwd("/root", 4096)                        = 6
<... getcwd resumed> )                           = "/root"

2voto

zvrba Punkte 23708

Denn der Systemaufruf und der Bibliotheksaufruf sind unterschiedlich. Lesen Sie die Manpage für die Funktion getcwd und Sie werden sehen, dass sie den folgenden Prototyp hat:

long getcwd(char *buf, unsigned long size);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X