> The comments at the top of sys/vtrace.h explains the background, but
> doesn't state in detail how to use it. In particular, what the type
> and the format of the arguments are.
>
> For example, to monitor this (in uts/common/inet/ip/ip.c)
>         TRACE_1(TR_FAC_IP, TR_IP_RPUT_START, "ip_input_start: q %p", q);

The digit given in the TRACE_?() macros specify how many arguments
are being provided, so with TRACE_1() there is 1 argument. Unfortunately,
the vtrace probes don't have their argument type information exported
so you can't use the args[] array to access them or the '-v' flag
to dtrace(1M). In this case you need to use the source to look at the
arguments and then either use the source or mdb(1) to look at the types.
Then you cast the arguments accordingly.

So, with your example of vtrace:ip:ip_input:TR_IP_RPUT_START, this
takes a single argument of a queue_t pointer as you state. To use
this just do something like:

vtrace:ip:ip_input:TR_IP_RPUT_START
{
        this->queue = (queue_t *)arg0;
        printf("High Water = %d\n", this->queue->q_hiwat);
}

As I said, to find the definition of a queue_t, either use the
source or mdb:

# mdb -k
Loading modules: [ unix genunix dtrace specfs ufs scsi_vhci sd isp 
pcisch sgsbbc ip hook neti sctp arp fctl nca lofs zfs random ipc sppp 
cpc ptm nfs fcip logindmux ]
 > ::print -t queue_t
{
    struct qinit *q_qinfo
    struct msgb *q_first
    struct msgb *q_last
    struct queue *q_next
    struct queue *q_link
<chop>

Hope this helps.

Jon.
_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to