[Bug 191506] New: [dtrace] [dtruss] dtruss doesn't seem to work on -HEAD

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Mon Jun 30 05:23:52 UTC 2014


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=191506

            Bug ID: 191506
           Summary: [dtrace] [dtruss] dtruss doesn't seem to work on -HEAD
           Product: Base System
           Version: 11.0-CURRENT
          Hardware: Any
                OS: Any
            Status: Needs Triage
          Severity: Affects Only Me
          Priority: ---
         Component: bin
          Assignee: freebsd-bugs at FreeBSD.org
          Reporter: adrian at freebsd.org

Compiled up a fresh -HEAD as of the timestamp:

FreeBSD adrian-hackbox 11.0-CURRENT FreeBSD 11.0-CURRENT #1
b01e1c9(local/rss)-dirty: Mon Jun 30 04:51:05 UTC 2014    
adrian at adrian-hackbox:/usr/home/adrian/git/github/erikarn/freebsd-obj/usr/home/adrian/git/github/erikarn/freebsd/sys/RSS
 amd64

.. and then looked at using the userland dtrace bits. The first example i found
from:

https://wiki.freebsd.org/DTrace/userland

was to use dtruss, so I tried it.

It didn't work.

root at adrian-hackbox:/home/adrian/git/github/erikarn/freebsd-rss/rss-http #
dtruss -c date
dtrace: invalid probe specifier 
#pragma D option quiet
#pragma D option switchrate=10

/*
 * Command line arguments
 */
inline int OPT_command   = 1;
inline int OPT_follow    = 0;
inline int OPT_printid   = 0;
inline int OPT_relative  = 0;
inline int OPT_elapsed   = 0;
inline int OPT_cpu       = 0;
inline int OPT_counts    = 1;
inline int OPT_pid       = 0;
inline int OPT_name      = 0;
inline int OPT_trace     = 0;
inline int OPT_stack     = 0;
inline string NAME       = ".";
inline string TRACE      = ".";

dtrace:::BEGIN 
{
        /* print header */
        OPT_printid  ? printf("%-9s  ", "PID/LWP") : 1;
        OPT_relative ? printf("%8s ", "RELATIVE") : 1;
        OPT_elapsed  ? printf("%7s ", "ELAPSD") : 1;
        OPT_cpu      ? printf("%6s ", "CPU") : 1;
        printf("SYSCALL(args) \t\t = return\n");
}

/*
 * Save syscall entry info
 */
syscall:::entry
/((OPT_command || OPT_pid) && pid == $target) || 
 (OPT_name && execname == NAME) ||
 (OPT_follow && progenyof($target))/
{
        /* 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;
}

/*
 * Follow children
 */
syscall::fork*:return
/(OPT_follow && progenyof($target)) && (!OPT_trace || (TRACE == probefunc))/
{
        /* print output */
        self->code = errno == 0 ? "" : "Err#";
        OPT_printid  ? printf("%6d/%d:  ", pid, tid) : 1;
        OPT_relative ? printf("%8d:  ", vtimestamp/1000) : 1;
        OPT_elapsed  ? printf("%7d:  ", 0) : 1;
        OPT_cpu      ? printf("%6d ", 0) : 1;
        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);
}

/*
 * Check for syscall tracing
 */
syscall:::entry
/OPT_trace && probefunc != TRACE/
{
        /* drop info */
        self->start = 0;
        self->vstart = 0;
        self->arg0 = 0;
        self->arg1 = 0;
        self->arg2 = 0;
}

/*
 * Print return data
 */

/*
 * The following code is written in an intentionally repetative way.
 * The first versions had no code redundancies, but performed badly during
 * benchmarking. The priority here is speed, not cleverness. I know there
 * are many obvious shortcuts to this code, I have tried them. This style has
 * shown in benchmarks to be the fastest (fewest probes fired, fewest actions).
 */

/* print 3 args, return as hex */
syscall::sigprocmask: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("%6d/%d:  ", 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 = 0x%X %s%d\n", probefunc,
            (int)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;
}

/* print 3 args, arg0 as a string */
syscall::access*:return,
syscall::stat*:return, 
syscall::lstat*:return, 
syscall::readlink*:return,
syscall::open*: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("%6d/%d:  ", 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(\"%S\", 0x%X, 0x%X)\t\t = %d %s%d\n", probefunc,
            copyinstr(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;
}

/* print 3 args, arg1 as a string */
syscall::write:return,
syscall::pwrite:return,
syscall::*read*: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("%6d/%d:  ", 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, \"%S\", 0x%X)\t\t = %d %s%d\n", probefunc, self->arg0,
            stringof(copyin(self->arg1, self->arg2)), 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;
}

/* print 0 arg output */
syscall::*fork*: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("%6d/%d:  ", 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()\t\t = %d %s%d\n", probefunc,
            (int)arg0, self->code, (int)errno);
        OPT_stack ? ustack()    : 1;
        OPT_stack ? trace("\n") : 1;
        self->arg0 = 0;
        self->arg1 = 0;
        self->arg2 = 0;
}

/* print 1 arg output */
syscall::close: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("%6d/%d:  ", 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)\t\t = %d %s%d\n", probefunc, self->arg0,
            (int)arg0, self->code, (int)errno);
        OPT_stack ? ustack()    : 1;
        OPT_stack ? trace("\n") : 1;
        self->arg0 = 0;
        self->arg1 = 0;
        self->arg2 = 0;
}

/* print 2 arg output */
syscall::utimes:return,
syscall::munmap: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("%6d/%d:  ", 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)\t\t = %d %s%d\n", probefunc, self->arg0,
            self->arg1, (int)arg0, self->code, (int)errno);
        OPT_stack ? ustack()    : 1;
        OPT_stack ? trace("\n") : 1;
        self->arg0 = 0;
        self->arg1 = 0;
        self->arg2 = 0;
}

/* 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("%6d/%d:  ", 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;
}

/* program exited */
proc:::exit
/(OPT_command || OPT_pid) && pid == $target/
{
        exit(0);
}

/* print counts */
dtrace:::END
{
        OPT_counts == 1 ? printf("\n%-32s %16s\n", "CALL", "COUNT") : 1;
        OPT_counts == 1 ? printa("%-32s %@16d\n", @Counts) : 1;
}
: "/usr/lib/dtrace/errno.d", line 150: failed to resolve INP_IPV4: Unknown
variable name

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-bugs mailing list