| 1 | <HTML>
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 | <HEAD>
|
|---|
| 5 | <TITLE>
|
|---|
| 6 | Using The HotSpot Serviceability Agent
|
|---|
| 7 | </TITLE>
|
|---|
| 8 | </HEAD>
|
|---|
| 9 |
|
|---|
| 10 | <BODY TEXT="#000000" BGCOLOR="#FFFFFF">
|
|---|
| 11 | <H1>
|
|---|
| 12 | Using The HotSpot Serviceability Agent
|
|---|
| 13 | </H1>
|
|---|
| 14 |
|
|---|
| 15 | <P>
|
|---|
| 16 | <H2>
|
|---|
| 17 | Contents
|
|---|
| 18 | </H2>
|
|---|
| 19 | </P>
|
|---|
| 20 |
|
|---|
| 21 | <UL>
|
|---|
| 22 | <LI> <A HREF = "#INTRODUCTION">Introduction</A>
|
|---|
| 23 | <LI> <A HREF = "#SOURCES">Organization of the sources</A>
|
|---|
| 24 | <LI> <A HREF = "#RUNNING">Running HSDB</A>
|
|---|
| 25 | <LI> <A HREF = "#NOTES">Notes</A>
|
|---|
| 26 | </UL>
|
|---|
| 27 |
|
|---|
| 28 | <H2>
|
|---|
| 29 | <A NAME="INTRODUCTION">
|
|---|
| 30 | Introduction
|
|---|
| 31 | </A>
|
|---|
| 32 | </H2>
|
|---|
| 33 |
|
|---|
| 34 | <P>
|
|---|
| 35 | The HotSpot Serviceability Agent (SA) is a set of Java APIs which
|
|---|
| 36 | mirror the internal APIs of the HotSpot VM and which can be used to
|
|---|
| 37 | examine the state of a HotSpot VM.
|
|---|
| 38 | </P>
|
|---|
| 39 |
|
|---|
| 40 | <P>
|
|---|
| 41 | The system understands the layout of certain VM data structures and is
|
|---|
| 42 | able to traverse these structures in an examination-only fashion; that
|
|---|
| 43 | is, it does not rely on being able to run code in the target VM. For
|
|---|
| 44 | this reason it transparently works with either a running VM or a core
|
|---|
| 45 | file.
|
|---|
| 46 | </P>
|
|---|
| 47 |
|
|---|
| 48 | <P>
|
|---|
| 49 | The system can reconstruct information about Java frames on the stack
|
|---|
| 50 | and objects in the heap. Many of the important data structures in the
|
|---|
| 51 | VM like the CodeCache, Universe, StubQueue, Frames, and VFrames have
|
|---|
| 52 | been exposed and have relatively complete (or at least useful)
|
|---|
| 53 | implementations.
|
|---|
| 54 | </P>
|
|---|
| 55 |
|
|---|
| 56 | <P>
|
|---|
| 57 | A small graphical debugger called HSDB (the "HotSpot Debugger") has
|
|---|
| 58 | been written using these APIs. It provides stack memory dumps
|
|---|
| 59 | annotated with method invocations, compiled-code inlining (if
|
|---|
| 60 | present), interpreted vs. compiled code, interpreter codelets (if
|
|---|
| 61 | interpreted), and live oops from oop-map information. It also provides
|
|---|
| 62 | a tree-based oop inspector. More information will be added as
|
|---|
| 63 | necessary; please <A HREF = "mailto:kenneth.russell@eng">send
|
|---|
| 64 | email</A> with suggestions on what would be useful.
|
|---|
| 65 | </P>
|
|---|
| 66 |
|
|---|
| 67 | <P>
|
|---|
| 68 | The SA currently only works on Solaris. It uses dbx to connect to the
|
|---|
| 69 | remote process or core file and communicates with a small piece of
|
|---|
| 70 | code (an "import module") loaded into the debugger.
|
|---|
| 71 | </P>
|
|---|
| 72 |
|
|---|
| 73 | <H2>
|
|---|
| 74 | <A NAME="SOURCES">
|
|---|
| 75 | Organization of the sources
|
|---|
| 76 | </A>
|
|---|
| 77 | </H2>
|
|---|
| 78 |
|
|---|
| 79 | <P>
|
|---|
| 80 | The Java-side source code, which is the bulk of the SA, is in
|
|---|
| 81 | src/share/vm/agent. The organization of the sun.jvm.hotspot package
|
|---|
| 82 | hierarchy mirrors the organization in the VM. This should allow
|
|---|
| 83 | engineers familiar with the HotSpot sources to quickly understand how
|
|---|
| 84 | the SA works and to make modifications if necessary. To build these
|
|---|
| 85 | sources, cd to src/share/vm/agent and type "make".
|
|---|
| 86 | </P>
|
|---|
| 87 |
|
|---|
| 88 | <P>
|
|---|
| 89 |
|
|---|
| 90 | The SA on Solaris works by communicating with a small piece of code
|
|---|
| 91 | (an "import module") loaded into dbx. The source code for this import
|
|---|
| 92 | module is in src/os/solaris/agent. To build this library, cd to
|
|---|
| 93 | src/os/solaris/agent and type "make 32bit" or "make 64bit". The
|
|---|
| 94 | distinction is necessary because the SPARC version of dbx ships with
|
|---|
| 95 | two versions of its executable, and depending on which architecture
|
|---|
| 96 | (v8 or v9) the debugger is running on selects the appropriate
|
|---|
| 97 | executable. The SA tries the v8 version first, but if you are running
|
|---|
| 98 | on a v9 machine you must provide both versions to the SA.
|
|---|
| 99 | </P>
|
|---|
| 100 |
|
|---|
| 101 | <P>
|
|---|
| 102 |
|
|---|
| 103 | The system is currently hardwired to look on jano for its dbx
|
|---|
| 104 | executable and import module. The relevant directory structure looks
|
|---|
| 105 | like this:
|
|---|
| 106 |
|
|---|
| 107 | <UL>
|
|---|
| 108 | <LI> .../hotspot/sa/
|
|---|
| 109 | <UL>
|
|---|
| 110 | <LI> solaris/
|
|---|
| 111 | <UL>
|
|---|
| 112 | <LI> sparc/
|
|---|
| 113 | <UL>
|
|---|
| 114 | <LI> bin/
|
|---|
| 115 | <UL>
|
|---|
| 116 | <LI> dbx: symlink to (v8) dbx 7.0 executable
|
|---|
| 117 | </UL>
|
|---|
| 118 | </UL>
|
|---|
| 119 | <UL>
|
|---|
| 120 | <LI> lib/
|
|---|
| 121 | <UL>
|
|---|
| 122 | <LI> libsvc_agent_dbx.so: 32-bit version of import module
|
|---|
| 123 | </UL>
|
|---|
| 124 | </UL>
|
|---|
| 125 | <LI> sparcv9/
|
|---|
| 126 | <UL>
|
|---|
| 127 | <LI> lib/
|
|---|
| 128 | <UL>
|
|---|
| 129 | <LI> libsvc_agent_dbx.so: 32-bit version of import module
|
|---|
| 130 | </UL>
|
|---|
| 131 | </UL>
|
|---|
| 132 | </UL>
|
|---|
| 133 | </UL>
|
|---|
| 134 | </UL>
|
|---|
| 135 | </P>
|
|---|
| 136 |
|
|---|
| 137 | <P>
|
|---|
| 138 | The code which builds up path names to these executables is contained
|
|---|
| 139 | in sun.jvm.hotspot.HotSpotAgent.java. There are hardcoded paths in
|
|---|
| 140 | this file to jano, but the rest of the system is isolated from this.
|
|---|
| 141 | </P>
|
|---|
| 142 |
|
|---|
| 143 | <P>
|
|---|
| 144 | (It would be nice to have a panel in the debugger allowing
|
|---|
| 145 | configuration of all of the known operating systems' options; right
|
|---|
| 146 | now Solaris is the only supported OS, making that easier.)
|
|---|
| 147 | </P>
|
|---|
| 148 |
|
|---|
| 149 | <H2>
|
|---|
| 150 | <A NAME="RUNNING">
|
|---|
| 151 | Running HSDB
|
|---|
| 152 | </A>
|
|---|
| 153 | </H2>
|
|---|
| 154 |
|
|---|
| 155 | <P>
|
|---|
| 156 | An installation of HSDB has been placed on jano. To access it, add the
|
|---|
| 157 | following directory to your PATH:
|
|---|
| 158 | </P>
|
|---|
| 159 |
|
|---|
| 160 | <P>
|
|---|
| 161 | <PRE>
|
|---|
| 162 | /net/jano/export/disk05/hotspot/sa/bin/common
|
|---|
| 163 | </PRE>
|
|---|
| 164 | </P>
|
|---|
| 165 |
|
|---|
| 166 | <P>
|
|---|
| 167 | To start the debugger, type "hsdb".
|
|---|
| 168 | </P>
|
|---|
| 169 |
|
|---|
| 170 | <P>
|
|---|
| 171 | Alternatively, you can start a local build of the debugger by building
|
|---|
| 172 | the sources in src/share/vm/agent, cd'ing to that directory, and
|
|---|
| 173 | typing "java sun.jvm.hotspot.HSDB".
|
|---|
| 174 | </P>
|
|---|
| 175 |
|
|---|
| 176 | <P>
|
|---|
| 177 | There are three modes for the debugger: attaching to a local process,
|
|---|
| 178 | opening a core file, and attaching to a remote "debug server". The
|
|---|
| 179 | remote case requires two programs to be running on the remote machine:
|
|---|
| 180 | the rmiregistry (see the script "start-rmiregistry" in this directory;
|
|---|
| 181 | run this in the background) and the debug server (see the script
|
|---|
| 182 | "start-debug-server"), in that order. start-rmiregistry takes no
|
|---|
| 183 | arguments; start-debug-server takes as argument the process ID or the
|
|---|
| 184 | executable and core file names to allow remote debugging of. Make sure
|
|---|
| 185 | you do NOT have a CLASSPATH environment variable set when you run
|
|---|
| 186 | these scripts. (The classes put into the rmiregistry are in sun.*, and
|
|---|
| 187 | there are permissions problems if they aren't placed on the boot
|
|---|
| 188 | classpath.)
|
|---|
| 189 | </P>
|
|---|
| 190 |
|
|---|
| 191 | <P>
|
|---|
| 192 | NOTE that the SA currently only works against VMs on Solaris/SPARC.
|
|---|
| 193 | Remote debugging of Solaris/SPARC VMs on arbitrary platforms is
|
|---|
| 194 | possible using the debug server; select "Connect to debug server..."
|
|---|
| 195 | in HSDB.
|
|---|
| 196 | </P>
|
|---|
| 197 |
|
|---|
| 198 | <P>
|
|---|
| 199 | Once the debugger has been launched, the threads list is displayed.
|
|---|
| 200 | The current set of functionality allows:
|
|---|
| 201 | </P>
|
|---|
| 202 |
|
|---|
| 203 | <UL>
|
|---|
| 204 | <LI> Browsing of the annotated stack memory ("Stack Memory" button). It
|
|---|
| 205 | is currently annotated with the following information:
|
|---|
| 206 | <UL>
|
|---|
| 207 | <LI> Method names of the Java frames and their extents (supporting
|
|---|
| 208 | inlined compiled methods)
|
|---|
| 209 | <LI> Locations and types of oops, found using the oop map information
|
|---|
| 210 | from compiled methods (interpreter oop maps coming soon)
|
|---|
| 211 | <LI> If a Java frame was interrupted by a signal (e.g., because of a
|
|---|
| 212 | crash), annotates the frame with the signal name and number
|
|---|
| 213 | <LI> Interpreter codelet descriptions for interpreted frames
|
|---|
| 214 | </UL>
|
|---|
| 215 | <LI> Finding which thread or threads caused a crash (currently
|
|---|
| 216 | identified by the presence of a signal handler frame)
|
|---|
| 217 | <LI> Browsing of oops using the Oop Inspector.
|
|---|
| 218 | <LI> Browsing of the java.lang.Thread object's oop.
|
|---|
| 219 | <LI> Object histogram and inspection of objects therein.
|
|---|
| 220 | </UL>
|
|---|
| 221 | </P>
|
|---|
| 222 |
|
|---|
| 223 | <P>
|
|---|
| 224 | More functionality is planned. Please <A HREF =
|
|---|
| 225 | "mailto:kenneth.russell@eng">send email</A> with suggestions on what
|
|---|
| 226 | would be useful, with any questions or comments, or if the debugger
|
|---|
| 227 | crashes.
|
|---|
| 228 | </P>
|
|---|
| 229 |
|
|---|
| 230 | <H2>
|
|---|
| 231 | <A NAME="NOTES">
|
|---|
| 232 | Notes
|
|---|
| 233 | </A>
|
|---|
| 234 | </H2>
|
|---|
| 235 |
|
|---|
| 236 | <P>
|
|---|
| 237 | HSDB does not suspend the system at a safepoint, but at an arbitrary
|
|---|
| 238 | point. This means that many of the invariants in the VM's code are not
|
|---|
| 239 | followed.
|
|---|
| 240 | </P>
|
|---|
| 241 |
|
|---|
| 242 | <P>
|
|---|
| 243 | As it happens, most of the places where the code ported over from the
|
|---|
| 244 | VM has failed involve the topmost frame on the stack. Some
|
|---|
| 245 | modifications have been made to allow the system to recognize
|
|---|
| 246 | problematic situations.
|
|---|
| 247 | </P>
|
|---|
| 248 |
|
|---|
| 249 | <P>
|
|---|
| 250 | Certainly, not all of the failure modes of the debugger have been
|
|---|
| 251 | found. Please <A HREF = "mailto:kenneth.russell@eng">send email</A> if
|
|---|
| 252 | HSDB throws an exception. The best debugging aid in these situations
|
|---|
| 253 | is a core file since it is a static view of the VM to which we can
|
|---|
| 254 | then adapt the debugger code, as opposed to having to try to suspend
|
|---|
| 255 | the VM over and over to reproduce the failure. gcore (1) is a useful
|
|---|
| 256 | tool. (NOTE: do not try gcore with any application using the DGA X
|
|---|
| 257 | server extension (example: Java2Demo); the kernel will panic. See bug
|
|---|
| 258 | 4343237.)
|
|---|
| 259 | </P>
|
|---|
| 260 |
|
|---|
| 261 | </BODY>
|
|---|
| 262 | </HTML>
|
|---|