| <HTML> |
| |
| |
| <HEAD> |
| <TITLE> |
| Using The HotSpot Serviceability Agent |
| </TITLE> |
| </HEAD> |
| |
| <BODY TEXT="#000000" BGCOLOR="#FFFFFF"> |
| <H1> |
| Using The HotSpot Serviceability Agent |
| </H1> |
| |
| <P> |
| <H2> |
| Contents |
| </H2> |
| </P> |
| |
| <UL> |
| <LI> <A HREF = "#INTRODUCTION">Introduction</A> |
| <LI> <A HREF = "#SOURCES">Organization of the sources</A> |
| <LI> <A HREF = "#RUNNING">Running HSDB</A> |
| <LI> <A HREF = "#NOTES">Notes</A> |
| </UL> |
| |
| <H2> |
| <A NAME="INTRODUCTION"> |
| Introduction |
| </A> |
| </H2> |
| |
| <P> |
| The HotSpot Serviceability Agent (SA) is a set of Java APIs which |
| mirror the internal APIs of the HotSpot VM and which can be used to |
| examine the state of a HotSpot VM. |
| </P> |
| |
| <P> |
| The system understands the layout of certain VM data structures and is |
| able to traverse these structures in an examination-only fashion; that |
| is, it does not rely on being able to run code in the target VM. For |
| this reason it transparently works with either a running VM or a core |
| file. |
| </P> |
| |
| <P> |
| The system can reconstruct information about Java frames on the stack |
| and objects in the heap. Many of the important data structures in the |
| VM like the CodeCache, Universe, StubQueue, Frames, and VFrames have |
| been exposed and have relatively complete (or at least useful) |
| implementations. |
| </P> |
| |
| <P> |
| A small graphical debugger called HSDB (the "HotSpot Debugger") has |
| been written using these APIs. It provides stack memory dumps |
| annotated with method invocations, compiled-code inlining (if |
| present), interpreted vs. compiled code, interpreter codelets (if |
| interpreted), and live oops from oop-map information. It also provides |
| a tree-based oop inspector. More information will be added as |
| necessary; please <A HREF = "mailto:kenneth.russell@eng">send |
| email</A> with suggestions on what would be useful. |
| </P> |
| |
| <P> |
| The SA currently only works on Solaris. It uses dbx to connect to the |
| remote process or core file and communicates with a small piece of |
| code (an "import module") loaded into the debugger. |
| </P> |
| |
| <H2> |
| <A NAME="SOURCES"> |
| Organization of the sources |
| </A> |
| </H2> |
| |
| <P> |
| The Java-side source code, which is the bulk of the SA, is in |
| src/share/vm/agent. The organization of the sun.jvm.hotspot package |
| hierarchy mirrors the organization in the VM. This should allow |
| engineers familiar with the HotSpot sources to quickly understand how |
| the SA works and to make modifications if necessary. To build these |
| sources, cd to src/share/vm/agent and type "make". |
| </P> |
| |
| <P> |
| |
| The SA on Solaris works by communicating with a small piece of code |
| (an "import module") loaded into dbx. The source code for this import |
| module is in src/os/solaris/agent. To build this library, cd to |
| src/os/solaris/agent and type "make 32bit" or "make 64bit". The |
| distinction is necessary because the SPARC version of dbx ships with |
| two versions of its executable, and depending on which architecture |
| (v8 or v9) the debugger is running on selects the appropriate |
| executable. The SA tries the v8 version first, but if you are running |
| on a v9 machine you must provide both versions to the SA. |
| </P> |
| |
| <P> |
| |
| The system is currently hardwired to look on jano for its dbx |
| executable and import module. The relevant directory structure looks |
| like this: |
| |
| <UL> |
| <LI> .../hotspot/sa/ |
| <UL> |
| <LI> solaris/ |
| <UL> |
| <LI> sparc/ |
| <UL> |
| <LI> bin/ |
| <UL> |
| <LI> dbx: symlink to (v8) dbx 7.0 executable |
| </UL> |
| </UL> |
| <UL> |
| <LI> lib/ |
| <UL> |
| <LI> libsvc_agent_dbx.so: 32-bit version of import module |
| </UL> |
| </UL> |
| <LI> sparcv9/ |
| <UL> |
| <LI> lib/ |
| <UL> |
| <LI> libsvc_agent_dbx.so: 32-bit version of import module |
| </UL> |
| </UL> |
| </UL> |
| </UL> |
| </UL> |
| </P> |
| |
| <P> |
| The code which builds up path names to these executables is contained |
| in sun.jvm.hotspot.HotSpotAgent.java. There are hardcoded paths in |
| this file to jano, but the rest of the system is isolated from this. |
| </P> |
| |
| <P> |
| (It would be nice to have a panel in the debugger allowing |
| configuration of all of the known operating systems' options; right |
| now Solaris is the only supported OS, making that easier.) |
| </P> |
| |
| <H2> |
| <A NAME="RUNNING"> |
| Running HSDB |
| </A> |
| </H2> |
| |
| <P> |
| An installation of HSDB has been placed on jano. To access it, add the |
| following directory to your PATH: |
| </P> |
| |
| <P> |
| <PRE> |
| /net/jano/export/disk05/hotspot/sa/bin/common |
| </PRE> |
| </P> |
| |
| <P> |
| To start the debugger, type "hsdb". |
| </P> |
| |
| <P> |
| Alternatively, you can start a local build of the debugger by building |
| the sources in src/share/vm/agent, cd'ing to that directory, and |
| typing "java sun.jvm.hotspot.HSDB". |
| </P> |
| |
| <P> |
| There are three modes for the debugger: attaching to a local process, |
| opening a core file, and attaching to a remote "debug server". The |
| remote case requires two programs to be running on the remote machine: |
| the rmiregistry (see the script "start-rmiregistry" in this directory; |
| run this in the background) and the debug server (see the script |
| "start-debug-server"), in that order. start-rmiregistry takes no |
| arguments; start-debug-server takes as argument the process ID or the |
| executable and core file names to allow remote debugging of. Make sure |
| you do NOT have a CLASSPATH environment variable set when you run |
| these scripts. (The classes put into the rmiregistry are in sun.*, and |
| there are permissions problems if they aren't placed on the boot |
| classpath.) |
| </P> |
| |
| <P> |
| NOTE that the SA currently only works against VMs on Solaris/SPARC. |
| Remote debugging of Solaris/SPARC VMs on arbitrary platforms is |
| possible using the debug server; select "Connect to debug server..." |
| in HSDB. |
| </P> |
| |
| <P> |
| Once the debugger has been launched, the threads list is displayed. |
| The current set of functionality allows: |
| </P> |
| |
| <UL> |
| <LI> Browsing of the annotated stack memory ("Stack Memory" button). It |
| is currently annotated with the following information: |
| <UL> |
| <LI> Method names of the Java frames and their extents (supporting |
| inlined compiled methods) |
| <LI> Locations and types of oops, found using the oop map information |
| from compiled methods (interpreter oop maps coming soon) |
| <LI> If a Java frame was interrupted by a signal (e.g., because of a |
| crash), annotates the frame with the signal name and number |
| <LI> Interpreter codelet descriptions for interpreted frames |
| </UL> |
| <LI> Finding which thread or threads caused a crash (currently |
| identified by the presence of a signal handler frame) |
| <LI> Browsing of oops using the Oop Inspector. |
| <LI> Browsing of the java.lang.Thread object's oop. |
| <LI> Object histogram and inspection of objects therein. |
| </UL> |
| </P> |
| |
| <P> |
| More functionality is planned. Please <A HREF = |
| "mailto:kenneth.russell@eng">send email</A> with suggestions on what |
| would be useful, with any questions or comments, or if the debugger |
| crashes. |
| </P> |
| |
| <H2> |
| <A NAME="NOTES"> |
| Notes |
| </A> |
| </H2> |
| |
| <P> |
| HSDB does not suspend the system at a safepoint, but at an arbitrary |
| point. This means that many of the invariants in the VM's code are not |
| followed. |
| </P> |
| |
| <P> |
| As it happens, most of the places where the code ported over from the |
| VM has failed involve the topmost frame on the stack. Some |
| modifications have been made to allow the system to recognize |
| problematic situations. |
| </P> |
| |
| <P> |
| Certainly, not all of the failure modes of the debugger have been |
| found. Please <A HREF = "mailto:kenneth.russell@eng">send email</A> if |
| HSDB throws an exception. The best debugging aid in these situations |
| is a core file since it is a static view of the VM to which we can |
| then adapt the debugger code, as opposed to having to try to suspend |
| the VM over and over to reproduce the failure. gcore (1) is a useful |
| tool. (NOTE: do not try gcore with any application using the DGA X |
| server extension (example: Java2Demo); the kernel will panic. See bug |
| 4343237.) |
| </P> |
| |
| </BODY> |
| </HTML> |