[dtrace-discuss] USDT probe problems?

James McIlree jmcilree at apple.com
Thu Dec 7 13:14:10 PST 2006


	I've run into some potential oddness when trying to use
USDT probes. I've boiled it down into a small test case, which I've
included below.

	Here is some sample output:

/home/ovrskeek> ./usdt
floatArg: 1.000000 doubleArg: 1.500000 longLongArg: feeaadd00000001
floatArg: 2.000000 doubleArg: 2.500000 longLongArg: feeaadd00000002
floatArg: 3.000000 doubleArg: 3.500000 longLongArg: feeaadd00000003
floatArg: 4.000000 doubleArg: 4.500000 longLongArg: feeaadd00000004

/home/ovrskeek# dtrace -n 'fooProvider*:::longLongProbe  
{ trace(args[0]); }'
dtrace: description 'fooProvider*:::longLongProbe ' matched 1 probe
CPU     ID                    FUNCTION:NAME
   1  52718               main:longLongProbe                 2
   1  52718               main:longLongProbe                 3
   1  52718               main:longLongProbe                 4

/home/ovrskeek# dtrace -n 'fooProvider*:::floatProbe  
{ trace(args[0]); }'
dtrace: invalid probe specifier fooProvider*:::floatProbe  
{ trace(args[0]); }: in action list: translator for args[0] from float  
to float is not defined

/home/ovrskeek# dtrace -n 'fooProvider*:::doubleProbe  
{ trace(args[0]); }'
dtrace: invalid probe specifier fooProvider*:::doubleProbe  
{ trace(args[0]); }: in action list: translator for args[0] from  
double to double is not defined

	From poking around in the source code, it appears the
first problem is related to how USDT arguments are read from the stack.

	I wasn't certain if the second two were an oversight,
or an intentional guard against using floats/doubles (which may
take ABI groveling to find).

	Doctor, doctor, it hurts when I use long long's in my
USDT probes :-). Any advice?

	James McIlree


----------- fooProvider.d -------------------

provider fooProvider {
         probe floatProbe(float);
         probe doubleProbe(double);
         probe longLongProbe(long long);
};

------------ usdt.c ------------------------

#include <stdio.h>
#include "fooProvider.h"

int main() {
         float floatArg = 1.0f;
         double doubleArg = 1.5;
         long long longLongArg = 0x0FEEAADD00000001LL;

         while (1) {
                 FOOPROVIDER_FLOATPROBE(floatArg);
                 FOOPROVIDER_DOUBLEPROBE(doubleArg);
                 FOOPROVIDER_LONGLONGPROBE(longLongArg);

                 printf("floatArg: %f doubleArg: %f longLongArg: %llx 
\n", (double)floatArg, doubleArg, (unsigned long long)longLongArg);
                 floatArg++;
                 doubleArg++;
                 longLongArg++;

                 sleep(1);
         }

         return 0;
}



More information about the dtrace-discuss mailing list