Wenn Sie den Quellcode für dtruss gelesen haben:
cat `which dtruss`
Sie werden feststellen, dass die Anzahl der Argumente hartcodiert ist.
Eintrag:
syscall:::entry /(OPT_command && pid == $target) || (OPT_pid && pid == PID) || (OPT_name && NAME == strstr(NAME, execname)) || (OPT_name && execname == strstr(execname, NAME)) || (self->child)/ { /* set start details */ self->start = timestamp; self->vstart = vtimestamp; self->arg0 = arg0; self->arg1 = arg1; self->arg2 = arg2; /* count occurances */ OPT_counts == 1 ? @Counts[probefunc] = count() : 1; }
Rückkehr:
/* print 3 arg output - default */ syscall:::return /self->start/ { /* calculate elapsed time */ this->elapsed = timestamp - self->start; self->start = 0; this->cpu = vtimestamp - self->vstart; self->vstart = 0; self->code = errno == 0 ? "" : "Err#"; /* print optional fields */ /* OPT_printid ? printf("%5d/%d: ",pid,tid) : 1; */ OPT_printid ? printf("%5d/0x%x: ",pid,tid) : 1; OPT_relative ? printf("%8d ",vtimestamp/1000) : 1; OPT_elapsed ? printf("%7d ",this->elapsed/1000) : 1; OPT_cpu ? printf("%6d ",this->cpu/1000) : 1; /* print main data */ printf("%s(0x%X, 0x%X, 0x%X)\t\t = %d %s%d\n",probefunc,self->arg0, self->arg1,self->arg2,(int)arg0,self->code,(int)errno); OPT_stack ? ustack() : 1; OPT_stack ? trace("\n") : 1; self->arg0 = 0; self->arg1 = 0; self->arg2 = 0; }
Bestimmte Systemaufrufe haben ein spezielles Handling ( /* mmap has 6 arguments */
).
Ich habe eine Kopie des Skripts und kopier eingefügt in ein paar mehr self->arg*
und , 0x%X
.
Ich konnte die Standardeinstellung auf 6 Args ändern und eine Ausgabe wie folgt erzielen:
posix_spawn(0x700003AA66B4, 0x7FF7B215BF10, 0x700003AA6570, 0x700003AA6610, 0x700003AA6720, 0x0) = 0 0
Warum müssen wir args kopieren und einfügen, anstatt nur einen Zähler zu erhöhen: DTrace unterstützt keine Schleifen. Ich denke, weil es für das Tracing nicht akzeptabel ist, die Möglichkeit einer Endlosschleife im Kernel einzuführen.