0N/A#!/usr/sbin/dtrace -Zs
0N/A/*
2362N/A * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
0N/A *
0N/A * Redistribution and use in source and binary forms, with or without
0N/A * modification, are permitted provided that the following conditions
0N/A * are met:
0N/A *
0N/A * - Redistributions of source code must retain the above copyright
0N/A * notice, this list of conditions and the following disclaimer.
0N/A *
0N/A * - Redistributions in binary form must reproduce the above copyright
0N/A * notice, this list of conditions and the following disclaimer in the
0N/A * documentation and/or other materials provided with the distribution.
0N/A *
2362N/A * - Neither the name of Oracle nor the names of its
0N/A * contributors may be used to endorse or promote products derived
0N/A * from this software without specific prior written permission.
0N/A *
0N/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
0N/A * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
0N/A * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
0N/A * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
0N/A * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
0N/A * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
0N/A * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
0N/A * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
0N/A * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
0N/A * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
0N/A * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0N/A */
0N/A
0N/A/*
0N/A*/
0N/A
0N/A/*
0N/A * Usage:
0N/A * 1. monitors.d -c "java ..."
0N/A * 2. monitors.d -p JAVA_PID
0N/A *
0N/A * The script traces monitor related probes.
0N/A *
0N/A * Notes:
0N/A * - These probes are disabled by default since it incurs performance
0N/A * overhead to the application. To trace the monitor-* probes, you need
0N/A * to turn on the ExtendedDTraceProbes VM option.
0N/A * You can either start the application with -XX:+ExtendedDTraceProbes
0N/A * option or use the jinfo command to enable it at runtime as follows:
0N/A *
0N/A * jinfo -flag +ExtendedDTraceProbes <java_pid>
0N/A *
0N/A */
0N/A
0N/A#pragma D option quiet
0N/A#pragma D option destructive
0N/A#pragma D option defaultargs
0N/A#pragma D option aggrate=100ms
0N/A
0N/A
0N/Aself string thread_name;
0N/Aself char* str_ptr;
0N/A
0N/A:::BEGIN
0N/A{
0N/A SAMPLE_NAME = "hotspot monitors tracing";
0N/A
0N/A printf("BEGIN %s\n\n", SAMPLE_NAME);
0N/A}
0N/A
0N/A/*
0N/A * hotspot:::thread-start, hotspot:::thread-stop probe arguments:
0N/A * arg0: char*, thread name passed as mUTF8 string
0N/A * arg1: uintptr_t, thread name length
0N/A * arg2: uintptr_t, Java thread id
0N/A * arg3: uintptr_t, native/OS thread id
0N/A * arg4: uintptr_t, is a daemon or not
0N/A */
0N/Ahotspot$target:::thread-start
0N/A{
0N/A self->str_ptr = (char*) copyin(arg0, arg1+1);
0N/A self->str_ptr[arg1] = '\0';
0N/A self->thread_name = (string) self->str_ptr;
0N/A
0N/A printf("thread-start: id=%d, is_daemon=%d, name=%s, os_id=%d\n",
0N/A arg2, arg4, self->thread_name, arg3);
0N/A
0N/A threads[arg2] = self->thread_name;
0N/A}
0N/A
0N/A
0N/Ahotspot$target:::thread-stop
0N/A{
0N/A self->str_ptr = (char*) copyin(arg0, arg1+1);
0N/A self->str_ptr[arg1] = '\0';
0N/A self->thread_name = (string) self->str_ptr;
0N/A
0N/A
0N/A printf("thread-stop: id=%d, is_daemon=%d, name=%s, os_id=%d\n",
0N/A arg2, arg4, self->thread_name, arg3);
0N/A}
0N/A
0N/A/*
0N/A *
0N/A * hotspot::monitor-contended-enter, hotspot::monitor-contended-entered
0N/A *
0N/A * arg0: uintptr_t, the Java thread identifier for the thread peforming
0N/A * the monitor operation
0N/A * arg1: uintptr_t, a unique, but opaque identifier for the specific
0N/A * monitor that the action is performed upon
0N/A * arg2: char*, a pointer to mUTF-8 string data which contains the
0N/A * name of the class of the object being acted upon
0N/A * arg3: uintptr_t, the length of the class name (in bytes)
0N/A */
0N/A
0N/Ahotspot$target:::monitor-contended-enter
0N/A{
0N/A /* (uintptr_t thread_id, uintptr_t monitor_id,
0N/A char* obj_class_name, uintptr_t obj_class_name_len) */
0N/A
0N/A self->str_ptr = (char*) copyin(arg2, arg3+1);
0N/A self->str_ptr[arg3] = '\0';
0N/A self->class_name = (string) self->str_ptr;
0N/A
0N/A monitors[arg1] = self->class_name;
0N/A
0N/A monitors_enter[arg1] = arg0;
0N/A printf("%s: -> enter monitor (%d) %s\n",
0N/A threads[arg0], arg1, monitors[arg1]);
0N/A}
0N/A
0N/Ahotspot$target:::monitor-contended-entered
0N/A{
0N/A /* (uintptr_t thread_id, uintptr_t monitor_id, char* obj_class_name,
0N/A uintptr_t obj_class_name_len) */
0N/A
0N/A monitors_entered[arg1] = arg0;
0N/A printf("%s: <- entered monitor (%d) %s\n",
0N/A threads[arg0], arg1, monitors[arg1]);
0N/A}
0N/A
0N/A
0N/A:::END
0N/A{
0N/A printf("\nEND of %s\n", SAMPLE_NAME);
0N/A}
0N/A
0N/Asyscall::rexit:entry,
0N/Asyscall::exit:entry
0N/A/pid == $target/
0N/A{
0N/A exit(0);
0N/A}