[dtrace-discuss] "dtrace -c" and HotSpot extended probes
Chip Bennett
cbennett at laurustech.com
Wed Aug 16 16:32:05 PDT 2006
Hi Katya,
This is the same error that you get when referencing the args array in a
probe clause that has a probe specification that matches more than one
probe. The actual error code for this message is D_ARGS_MULTI, which
makes it seem even more likely. Apparently, since the args array is
typed by probe, the D compiler doesn't know what to do with "args" when
the clause is connected to more than one probe.
I don't know if there are other conditions that can cause this error,
but just out of curiosity, if you add the "-l" flag to your run, how
many probes end up matching "hotspot$target:::object-alloc".
This is based on a lot of assumptions on my part, so I could be all wet
here.
Chip
Ekaterina Pavlova wrote:
> Hello,
>
> We have strange problems with using dtrace '-c' option.
>
> I have very simple object_allocation_stat.d script (attached) which
> trace hotspot:::object-alloc.
> These probes are part of HotSpot JVM (JDK 6.0).
> When I try to run it I observe following error:
>
>> object_allocation_stat.d -c "JDK6/bin/java -XX:+ExtendedDTraceProbes
>> -version"
> dtrace: failed to compile script ./hotspot/object_allocation_stat.d:
> line 53: args[ ] may not be referenced because probe description
> hotspot5226:::object-alloc matches an unstable set of probes
>
>
> However, if I attach object_allocation_stat.d to already running Java
> process no any errors are happening.
>
> At the same time I have similar script called class_loading_stat.d
> which trace hotspot:::class-[un]loaded probes.
> When I try to run it I don't have any errors:
>
>> class_loading_stat.d -c "JDK6/bin/java -XX:+ExtendedDTraceProbes
>> -version"
> Loaded classes by package:
> 1 java/lang/annotation
> 1 java/nio/charset/spi
> 1 sun/net/www
> 1 sun/net/www/protocol/file
> 1 sun/net/www/protocol/jar
> ...
>
> The only difference between hotspot:::object-alloc and
> hotspot:::class-[un]loaded probes is that hotspot:::object-alloc are
> available only if ExtendedDTraceProbes flag is present
> (-XX:+ExtendedDTraceProbes).
>
> Also, entire hotspot provider, probes, and args are all marked as
> 'evolving', not stable,
> but that doesn't explain why it works for some of the scripts or when
> we pause and attach.
>
>
> Does anybody have any ideas why "...matches an unstable set of probes"
> error is thrown?
>
> Thanks a lot,
> -katya
>
>
> ------------------------------------------------------------------------
>
> #!/usr/sbin/dtrace -Zs
>
> #pragma D option quiet
> #pragma D option destructive
> #pragma D option defaultargs
> #pragma D option aggrate=100ms
>
> /*
> * Usage:
> * 1. class_loading_stat.d -c "java ..." INTERVAL_SECS
> * 2. class_loading_stat.d -p JAVA_PID INTERVAL_SECS
> *
> * This script collects statistics about loaded and
> * unloaded Java classes and dump current state to stdout every INTERVAL_SECS seconds.
> * If INTERVAL_SECS is not set then 10 seconds interval is used.
> *
> */
>
> self char *str_ptr;
> self string class_name;
> self string package_name;
>
> int INTERVAL_SECS;
>
> :::BEGIN
> {
> printf("BEGIN Java classes loading tracing\n");
>
> INTERVAL_SECS = $1 ? $1 : 10;
> SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
>
> LOADED_CLASSES_CNT = 0;
> UNLOADED_CLASSES_CNT = 0;
> }
>
> /*
> * hotspot:::class-loaded, hotspot:::class-unloaded probe arguments:
> * arg0: char*, class name passed as mUTF8 string
> * arg1: uintptr_t, class name length
> * arg2: void*, class loader ID, which is unique identifier for
> * a class loader in the VM.
> * arg3: uintptr_t, class is shared or not
> */
> hotspot$target:::class-loaded
> {
> LOADED_CLASSES_CNT ++;
>
> self->str_ptr = (char*) copyin(arg0, arg1+1);
> self->str_ptr[arg1] = '\0';
> self->class_name = (string) self->str_ptr;
>
> self->package_name = dirname(self->class_name);
>
> /* printf("class-loaded: class=%s, loader=%x\n", self->class_name, arg2); */
>
> @classes_loaded[self->package_name] = count();
> }
>
> hotspot$target:::class-unloaded
> {
> UNLOADED_CLASSES_CNT ++;
>
> self->str_ptr = (char*) copyin(arg0, arg1+1);
> self->str_ptr[arg1] = '\0';
> self->class_name = (string) self->str_ptr;
>
> self->package_name = dirname(self->class_name);
>
> @classes_unloaded[self->package_name] = count();
> }
>
> hotspot$target:::vm-shutdown
> {
> exit(0);
> }
>
> syscall::rexit:entry,
> syscall::exit:entry
> /pid == $target/
> {
> exit(0);
> }
>
> tick-1sec
> / timestamp > SAMPLING_TIME /
> {
> printf("------------------------------------------------------------------------\n");
> printf("%Y\n", walltimestamp);
> printf("------------------------------------------------------------------------\n");
>
> printf("Loaded classes by package:\n");
> printa("%10 at d %s\n", @classes_loaded);
>
> printf("\n");
> printf("Unloaded classes by package:\n");
> printa("%10 at d %s\n", @classes_unloaded);
>
> printf("\n");
> printf("Number of loaded classes: %10d\n", LOADED_CLASSES_CNT);
> printf("Number of unloaded classes: %10d\n", UNLOADED_CLASSES_CNT);
>
> SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
> }
>
>
> :::END
> {
> printf("------------------------------------------------------------------------\n");
> printf("%Y\n", walltimestamp);
> printf("------------------------------------------------------------------------\n");
>
> printf("Loaded classes by package:\n");
> printa("%10 at d %s\n", @classes_loaded);
>
> printf("\n");
> printf("Unloaded classes by package:\n");
> printa("%10 at d %s\n", @classes_unloaded);
>
> printf("\n");
> printf("Number of loaded classes: %10d\n", LOADED_CLASSES_CNT);
> printf("Number of unloaded classes: %10d\n", UNLOADED_CLASSES_CNT);
>
> printf("\nEND hotspot tracing.\n");
> }
>
>
> ------------------------------------------------------------------------
>
> #!/usr/sbin/dtrace -Zs
>
> #pragma D option quiet
> #pragma D option destructive
> #pragma D option defaultargs
> #pragma D option bufsize=16m
> #pragma D option aggrate=100ms
>
> /*
> * Usage:
> * 1. object_allocation_stat.d -c "java ..." TOP_RESULTS_COUNT INTERVAL_SECS
> * 2. object_allocation_stat.d -p JAVA_PID TOP_RESULTS_COUNT INTERVAL_SECS
> *
> * This script collects statistics about TOP_RESULTS_COUNT (default is 25) object allocations
> * every INTERVAL_SECS (default is 60) seconds.
> *
> * Notes:
> * - these probes are available only with '-XX:+ExtendedDTraceProbes' option,
> * so pass this option too.
> * - This script SLOWS DOWN your java application. So, not be surprised :)
> *
> */
>
> self char *str_ptr;
> self string class_name;
>
> long long ALLOCATED_OBJECTS_CNT;
>
> int INTERVAL_SECS;
>
> :::BEGIN
> {
> TOP_RESULTS_COUNT = $1 ? $1 : 25;
> INTERVAL_SECS = $2 ? $2 : 60;
>
> ALLOCATED_OBJECTS_CNT = 0;
>
> SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
> }
>
> /*
> * hotspot:::object-alloc probe arguments:
> * arg0: uintptr_t, Java thread id
> * arg1: char*, a pointer to mUTF-8 string containing the name of
> * the class of the object being allocated
> * arg2: uintptr_t, the length of the class name (in bytes)
> * arg3: uintptr_t, the size of the object being allocated
> */
> hotspot$target:::object-alloc
> {
> ALLOCATED_OBJECTS_CNT ++;
>
> self->str_ptr = (char*) copyin(arg1, args[2]+1);
> self->str_ptr[args[2]] = '\0';
> self->class_name = (string) self->str_ptr;
>
>
> @allocs_count[self->class_name] = count();
> @allocs_size[self->class_name] = sum(args[3]);
>
> /*
> printf("%s:\t[%u] class_name=%s (len=%u), size=%u\n",
> probename, args[0], self->class_name, args[2], args[3]);
> */
> }
>
> tick-1sec
> / timestamp > SAMPLING_TIME /
> {
> printf("\n");
> printf("------------------------------------------------------------------------\n");
> printf("%Y\n", walltimestamp);
> printf("------------------------------------------------------------------------\n");
>
> printf("\n");
> printf("Top %d allocations by size:\n", TOP_RESULTS_COUNT);
> trunc(@allocs_size, TOP_RESULTS_COUNT);
> printa("%10 at d %s\n", @allocs_size);
>
> printf("\n");
> printf("Top %d allocations by count:\n", TOP_RESULTS_COUNT);
> trunc(@allocs_count, TOP_RESULTS_COUNT);
> printa("%10 at d %s\n", @allocs_count);
>
> printf("\nTotal number of allocated objects: %d\n", ALLOCATED_OBJECTS_CNT);
>
> SAMPLING_TIME = timestamp + INTERVAL_SECS * 1000000000ull;
> }
>
>
> syscall::rexit:entry,
> syscall::exit:entry
> /pid == $target/
> {
> exit(0);
> }
>
> :::END
> {
> printf("\n");
> printf("------------------------------------------------------------------------\n");
> printf("%Y\n", walltimestamp);
> printf("------------------------------------------------------------------------\n");
>
> printf("\n");
> printf("Top %d allocations by size:\n", TOP_RESULTS_COUNT);
> trunc(@allocs_size, TOP_RESULTS_COUNT);
> printa("%10 at d %s\n", @allocs_size);
>
> printf("\n");
> printf("Top %d allocations by count:\n", TOP_RESULTS_COUNT);
> trunc(@allocs_count, TOP_RESULTS_COUNT);
> printa("%10 at d %s\n", @allocs_count);
>
> printf("\nTotal number of allocated objects: %d\n", ALLOCATED_OBJECTS_CNT);
> }
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> dtrace-discuss mailing list
> dtrace-discuss at opensolaris.org
More information about the dtrace-discuss
mailing list