[prev in list] [next in list] [prev in thread] [next in thread] 

List:       opensolaris-dtrace-discuss
Subject:    Re: [dtrace-discuss] Can DTrace tell me if my process is 32 or 64
From:       Jim Mauro <James.Mauro () Sun ! COM>
Date:       2008-07-23 17:59:01
Message-ID: 48877165.8060103 () sun ! com
[Download RAW message or body]

You could use curpsinfo->pr_dmodel is a predicate.

probe
/ curpsinfo->pr_dmodel == 1/
{
    32-bit process
}

probe
/ curpsinfo->pr_dmodel == 2/
{
    64-bit process
}


/jim


Bruce Chapman wrote:
> I had a simple D script that looks for use of the DP_POLL ioctl with a long timeout \
> for any process on the system, but I could not find an easy way to determine \
> whether to use dvpoll or dvpoll32 structures to do so.  An ugly hack based upon \
> pointer location/value works, but is clearly unacceptable (this was in a single \
> probe syscall::ioctl:entry/arg1==0xd001/ ): 
> nfds = (dvpoll->dp_nfds > 1000000) ?    dvpoll32->dp_nfds : dvpoll->dp_nfds;
> 
> Since I could find no way for DTrace to help me out here I looked at source code \
> and found that dpioctl takes a mode argument that has a bitmask which will indicate \
> DATA_MODEL, so I modified the script to use that, which works and should be stable, \
> but it seems DTrace should provide coders with it's own way of determining the \
> data_model to save people such gyrations.  Also, though this script works fine on \
> S10 FCS SPARC/x86 up to snv_86 (Indiana), it fails on snv_93 (image updated Indiana \
> - it works on a 32 kernel snv_95 machine but I haven't found a 64 bit snv_95 to try \
> it on) with : 
> dtrace: failed to compile script ./ioctl_DP_POLL.d: line 25: operands have \
> incompatible types: "dblk_t" != "union" 
> Is this a known DTrace bug in snv_93 or just more restrictive type checking (seems \
> like a bug...if not, can someone get the script to work in snv_93?) 
> Anyway, here's the script that works on all S10 versions through snv_86 but is more \
> complicated than it would be if DTrace had a mechanism of letting me know if the \
> binary being traced was 32 or 64 bit : 
> #!/usr/sbin/dtrace -s
> #pragma D option quiet
> 
> struct dvpoll    *      dvpoll;
> struct dvpoll32  *      dvpoll32;
> 
> BEGIN {
> printf("If timeout is -1 or big, you could get hit by bugid 6724237\n");
> prev_timeout = -2;
> prev_fd = prev_nfds = prev_pid = -1;
> }
> syscall::ioctl:entry /arg1 == 0xd001/ {
> self->fd=arg0;
> }
> fbt:poll:dpioctl:entry {
> self->bitsize64 = (arg3 & 0x00200000); /* model.h: DATA_MODEL_LP64 */
> }
> fbt:poll:dpioctl:entry /self->bitsize64/ {
> dvpoll=copyin(arg2, sizeof(*dvpoll));
> self->nfds = dvpoll->dp_nfds;
> self->timeout = dvpoll->dp_timeout;
> }
> fbt:poll:dpioctl:entry /!(self->bitsize64)/ {
> dvpoll32=copyin(arg2, sizeof(*dvpoll32));
> self->nfds = dvpoll32->dp_nfds;     /* DTrace broken in SNV_93? */
> self->timeout = dvpoll32->dp_timeout;
> }
> fbt:poll:dpioctl:entry
> / (self->fd != prev_fd) || (self->nfds != prev_nfds) ||
> (self->timeout != prev_timeout) || (prev_pid != pid) /{
> printf("%s pid=%d/%d calling ioctl(%d, DP_POLL, nfds=%d timeout=%d)\n",
> execname, pid, tid, self->fd, self->nfds, self->timeout);
> prev_pid = pid;
> prev_fd = self->fd;
> prev_nfds = self->nfds;
> prev_timeout = self->timeout;
> self->fd = self->nfds = self->timeout = self->bitsize64 = 0;
> }
> 
> 
> --
> This message posted from opensolaris.org
> _______________________________________________
> dtrace-discuss mailing list
> dtrace-discuss@opensolaris.org
> 
_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic