Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Oct 2013 13:06:58 -0700
From:      John-Mark Gurney <jmg@funkthat.com>
To:        freebsd-dtrace@FreeBSD.org
Subject:   new issues w/ dtrace aborting...
Message-ID:  <20131017200658.GG56872@funkthat.com>

next in thread | raw e-mail | index | archive | help
I'm see this failure which is reproducable:
# dtrace -s ./disklatencycmd.d -x evaltime=postinit -c ./catall
Tracing... Hit Ctrl-C to end.

Now, I have spent some time trying to debug this error and have
gotten a stack trace:
#0  dt_divide_128 (dividend=0x7fffffffd240, divisor=0, quotient=0x7fffffffd240)
    at /usr/src/cddl/lib/libdtrace/../../../cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c:221
#1  0x0000000800a8d343 in dt_stddev (data=0x802bb3e48, normal=1)
    at /usr/src/cddl/lib/libdtrace/../../../cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c:372
#2  0x0000000800a9549a in dt_aggregate_valcmp (lhs=<value optimized out>, 
    rhs=<value optimized out>)
    at /usr/src/cddl/lib/libdtrace/../../../cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c:120
#3  0x0000000800a93821 in dt_aggregate_varvalcmp (lhs=0x804679240, 
    rhs=0x804679260)
    at /usr/src/cddl/lib/libdtrace/../../../cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c:950
#4  0x0000000801a3d6aa in qsort () from /lib/libc.so.7
#5  0x0000000800a93c88 in dt_aggregate_walk_sorted (dtp=0x80281d000, 
    func=0x800a8f7d0 <dt_print_agg>, arg=0x7fffffffd498, 
    sfunc=<value optimized out>)
    at /usr/src/cddl/lib/libdtrace/../../../cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c:1275
#6  0x0000000800a951c6 in dtrace_aggregate_print (dtp=0x80281d000, 
    fp=<value optimized out>, func=<value optimized out>)
    at /usr/src/cddl/lib/libdtrace/../../../cddl/contrib/opensolaris/lib/libdtrace/common/dt_aggregate.c:1880
#7  0x000000000040387f in main (argc=<value optimized out>, 
    argv=0x7fffffffd700)
    at /usr/src/cddl/usr.sbin/dtrace/../../../cddl/contrib/opensolaris/cmd/dtrace/dtrace.c:1921

Now the weird part is that between frame 3 and frame 0, the address of
lhs/data changes, yet if you look at the code, it is passing the pointer
straight through w/o modification...  The value pointed to by lhs is
valid and non-zero, but in frame 0 the different pointer is now zero..

The script catall:
#!/bin/sh -

#since dtrace has issues:
find /mnt -type f -exec cat {} + > /dev/null

The directory /mnt has a FS that only contains a recent export of HEAD..
I also umount/mount before each run to make sure the disk cache is clear,
otherwise it's possible that all the data will be cached in memory, and
not perform any io...

It looks like it's an issue w/ clear(@stddev) as this is the script I've
reduced it to reproduce the failiure:
#pragma D option quiet
#pragma D option dynvarsize=16m
        
io:::start  
{
        start_time[arg0] = timestamp;
}
        
io:::done
/this->start = start_time[arg0]/
{
        this->delta = (timestamp - this->start) / 1000;
        @stddev[args[1]->device_name, args[1]->unit_number] = stddev(this->delta
);
        start_time[arg0] = 0;
}

dtrace:::END
{
        clear(@stddev);
}

Obviously for this to be useful, you'd print out the stddev, but the
abort happens either way...

Thanks.

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20131017200658.GG56872>