1
|
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>
|