1 | <html>
|
---|
2 | <head>
|
---|
3 | <title>
|
---|
4 | JavaScript interface to Hotspot Serviceability Agent
|
---|
5 | </title>
|
---|
6 | </head>
|
---|
7 | <body>
|
---|
8 | <h1>JavaScript interface to Hotspot Serviceability Agent</h1>
|
---|
9 |
|
---|
10 | <p>
|
---|
11 | Serviceability Agent (SA) provides Java API and tools to diagnose HotSpot Virtual Machine and
|
---|
12 | Java apps running on it. SA is a snapshot debugger -- can be used to observe state of a frozen java process or java core dump.
|
---|
13 | </p>
|
---|
14 |
|
---|
15 | <h2>Existing SA APIs</h2>
|
---|
16 | <p>
|
---|
17 | There are two application programmer interfaces (APIs) for SA:
|
---|
18 | <dl>
|
---|
19 | <dt>1. Private java API
|
---|
20 | </dt>
|
---|
21 | <dd>
|
---|
22 | This tries to mimic hotspot VM's internal C++ classes and methods. Because VM data structures
|
---|
23 | are a moving target, this API can never be 'stable'! Besides, to use SA's private API knowledge of
|
---|
24 | HotSpot code base is essential.
|
---|
25 | </dd>
|
---|
26 | <dt>2. SA-JDI -- Java Debugger Interface read-only subset API
|
---|
27 | </dt>
|
---|
28 | <dd>
|
---|
29 | This is read-only subset of JDI (Java Debugger Interface)
|
---|
30 | This is a standardized interface to get java level state of a java process or java core dump. While this
|
---|
31 | interface is useful, this misses parts of java level state from target process or core such as
|
---|
32 | <ul>
|
---|
33 | <li>heap walking interface -- only objects traceable to static variables (of classes) and local
|
---|
34 | variables of stack frames can be accessed.
|
---|
35 | <li>re-constructing .class from debuggee are missing.
|
---|
36 | <li>re-constructing object mirrors for Java objects of the debuggee.
|
---|
37 | </ul>
|
---|
38 | </dd>
|
---|
39 | </dl>
|
---|
40 | </p>
|
---|
41 |
|
---|
42 | <h2>SA Scripting interface</h2>
|
---|
43 |
|
---|
44 | <p>
|
---|
45 | Traditionally, platform debuggers such as dbx, gdb and Solaris mdb (Module Debugger), provide a scripting
|
---|
46 | language interface. Scripting language interface provides easy-to-use, dynamically typed
|
---|
47 | interface to access data structures from debuggee. dbx and mdb even allow user to write
|
---|
48 | C/C++ modules to extend the scripting language commands.
|
---|
49 | </p>
|
---|
50 |
|
---|
51 | <p>
|
---|
52 | SA provides SOQL - Simple Object Query Language -- a SQL-like query language to access
|
---|
53 | Java heap as an object database. SA's main GUI (HSDB) also exposes scripting interface of underlying debugger such as dbx, windbg.
|
---|
54 | But to use this interface, user has to learn scripting interface of multiple debugger back-ends such as dbx, windbg.
|
---|
55 | And these scripting interfaces are 'raw' in the sense that no java state is exposed -- only C/C++ state of VM is exposed.
|
---|
56 | Higher level SA services are not available through scripting interface.
|
---|
57 | </p>
|
---|
58 |
|
---|
59 | <p>
|
---|
60 | <b>jsdb -- JavaScript Debugger</b> attempts to provide JavaScript interface to SA.
|
---|
61 | jsdb provides
|
---|
62 |
|
---|
63 | <ul>
|
---|
64 | <li>high-level hotspot (and SA) independent scripting interface
|
---|
65 | <li>low-level SA-aware scripting interface.
|
---|
66 | </ul>
|
---|
67 | </p>
|
---|
68 |
|
---|
69 | <h2>High level interface (Java State)</h2>
|
---|
70 |
|
---|
71 | <b>jsdb</b> is a command line <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">JavaScript</a> shell based on
|
---|
72 | <a href="http://www.mozilla.org/rhino/">Mozilla's Rhino JavaScript Engine</a>.
|
---|
73 | This command line utility attaches to Java process or core file or remote debug server and waits for user input.
|
---|
74 | This shell supports the following global functions and objects in addition to the standard JavaScript functions and
|
---|
75 | objects:
|
---|
76 |
|
---|
77 | <h3>jdsb globals</h3>
|
---|
78 |
|
---|
79 | <table border="1">
|
---|
80 | <tr>
|
---|
81 | <th>Function/Variable</th>
|
---|
82 | <th>Description</th>
|
---|
83 | </tr>
|
---|
84 | <tr>
|
---|
85 | <td>
|
---|
86 | address(jobject)
|
---|
87 | </td>
|
---|
88 | <td>
|
---|
89 | function that returns the address of the Java object as a string
|
---|
90 | </td>
|
---|
91 | </tr>
|
---|
92 | <td>
|
---|
93 | classof(jobject)
|
---|
94 | </td>
|
---|
95 | <td>
|
---|
96 | function that returns the JavaScript object that represents class object of the Java object
|
---|
97 | </td>
|
---|
98 | </tr>
|
---|
99 | <td>
|
---|
100 | dumpClass(jclass,[dir])
|
---|
101 | </td>
|
---|
102 | <td>
|
---|
103 | function that writes .class for the given Java Class. Optionally (second arg) accepts the directory where the
|
---|
104 | .class has to be written.
|
---|
105 | </td>
|
---|
106 | </tr>
|
---|
107 | <td>
|
---|
108 | help()
|
---|
109 | </td>
|
---|
110 | <td>
|
---|
111 | function that prints help message for global functions and objects
|
---|
112 | </td>
|
---|
113 | </tr>
|
---|
114 | <tr>
|
---|
115 | <td>
|
---|
116 | identityHash(jobject)
|
---|
117 | </td>
|
---|
118 | <td>
|
---|
119 | function that returns the identity hashCode of the Java object
|
---|
120 | </td>
|
---|
121 | </tr>
|
---|
122 | <tr>
|
---|
123 | <td>
|
---|
124 | mirror(jobject)
|
---|
125 | </td>
|
---|
126 | <td>
|
---|
127 | function that returns a local mirror of the Java object.
|
---|
128 | </td>
|
---|
129 | </tr>
|
---|
130 | <tr>
|
---|
131 | <td>
|
---|
132 | load([file1, file2,...])
|
---|
133 | </td>
|
---|
134 | <td>
|
---|
135 | function that loads zero or more JavaScript file(s). With no arguments, reads <stdin> for
|
---|
136 | JavaScript code.
|
---|
137 | </td>
|
---|
138 | </tr>
|
---|
139 | <tr>
|
---|
140 | <td>
|
---|
141 | object(string)
|
---|
142 | </td>
|
---|
143 | <td>
|
---|
144 | function that converts a string address into Java object
|
---|
145 | </td>
|
---|
146 | </tr>
|
---|
147 | <tr>
|
---|
148 | <td>
|
---|
149 | owner(jobject)
|
---|
150 | </td>
|
---|
151 | <td>
|
---|
152 | function that returns the owner thread of this monitor or null
|
---|
153 | </td>
|
---|
154 | </tr>
|
---|
155 | <tr>
|
---|
156 | <td>
|
---|
157 | sizeof(jobject)
|
---|
158 | </td>
|
---|
159 | <td>
|
---|
160 | function that returns the size of Java object in bytes
|
---|
161 | </td>
|
---|
162 | </tr>
|
---|
163 | <tr>
|
---|
164 | <td>
|
---|
165 | staticof(jclass, field)
|
---|
166 | </td>
|
---|
167 | <td>
|
---|
168 | function that returns the value of given field of the given Java class
|
---|
169 | </td>
|
---|
170 | </tr>
|
---|
171 | <tr>
|
---|
172 | <td>
|
---|
173 | print(expr1, expr2,...)
|
---|
174 | </td>
|
---|
175 | <td>
|
---|
176 | function that prints zero or more JavaScript expressions after converting those as strings
|
---|
177 | </td>
|
---|
178 | </tr>
|
---|
179 | <tr>
|
---|
180 | <td>
|
---|
181 | println(expr1, expr2..)
|
---|
182 | </td>
|
---|
183 | <td>
|
---|
184 | function that same as print, but prints a newline at the end
|
---|
185 | </td>
|
---|
186 | </tr>
|
---|
187 | <tr>
|
---|
188 | <td>
|
---|
189 | read([prompt])
|
---|
190 | </td>
|
---|
191 | <td>
|
---|
192 | function that reads a single line from standard input
|
---|
193 | </td>
|
---|
194 | </tr>
|
---|
195 | <tr>
|
---|
196 | <td>
|
---|
197 | quit()
|
---|
198 | </td>
|
---|
199 | <td>
|
---|
200 | function that quits the interactive load call as well as the shell
|
---|
201 | </td>
|
---|
202 | </tr>
|
---|
203 | <tr>
|
---|
204 | <td>
|
---|
205 | jvm
|
---|
206 | </td>
|
---|
207 | <td>
|
---|
208 | variable -- a JavaScript object that represents the target jvm that is being debugged
|
---|
209 | </td>
|
---|
210 | </tr>
|
---|
211 | </table>
|
---|
212 |
|
---|
213 | <h3>jvm object</h3>
|
---|
214 |
|
---|
215 | <p>
|
---|
216 | jvm object supports the following read-only properties.
|
---|
217 | </p>
|
---|
218 |
|
---|
219 | <table border="1">
|
---|
220 | <tr>
|
---|
221 | <th>
|
---|
222 | Property name
|
---|
223 | </th>
|
---|
224 | <th>
|
---|
225 | Description
|
---|
226 | </th>
|
---|
227 | </tr>
|
---|
228 | <tr>
|
---|
229 | <td>
|
---|
230 | threads
|
---|
231 | </td>
|
---|
232 | <td>
|
---|
233 | array of Java threads from the debuggee
|
---|
234 | </td>
|
---|
235 | </tr>
|
---|
236 | <tr>
|
---|
237 | <td>
|
---|
238 | heap
|
---|
239 | </td>
|
---|
240 | <td>
|
---|
241 | object representing the heap of the debuggee
|
---|
242 | </td>
|
---|
243 | </tr>
|
---|
244 | <tr>
|
---|
245 | <td>
|
---|
246 | type
|
---|
247 | </td>
|
---|
248 | <td>
|
---|
249 | string value that is either "Server" or "Client" or "Core" -- the flavour of debuggee VM
|
---|
250 | </td>
|
---|
251 | </tr>
|
---|
252 | <tr>
|
---|
253 | <td>
|
---|
254 | bootClassPath
|
---|
255 | </td>
|
---|
256 | <td>
|
---|
257 | string value of bootclasspath of the debuggee
|
---|
258 | </td>
|
---|
259 | </tr>
|
---|
260 | <tr>
|
---|
261 | <td>
|
---|
262 | cpu
|
---|
263 | </td>
|
---|
264 | <td>
|
---|
265 | string value of cpu on which the debuggee runs/ran
|
---|
266 | </td>
|
---|
267 | </tr>
|
---|
268 | <tr>
|
---|
269 | <td>
|
---|
270 | sysProps
|
---|
271 | </td>
|
---|
272 | <td>
|
---|
273 | name-value pairs (JavaScript associative array) of Java System properties of the debuggee
|
---|
274 | </td>
|
---|
275 | </tr>
|
---|
276 | <tr>
|
---|
277 | <td>
|
---|
278 | addressSize
|
---|
279 | </td>
|
---|
280 | <td>
|
---|
281 | int value -- 32 for 32 bit debuggee, 64 for 64 bit debuggee
|
---|
282 | </td>
|
---|
283 | </tr>
|
---|
284 | <tr>
|
---|
285 | <td>
|
---|
286 | os
|
---|
287 | </td>
|
---|
288 | <td>
|
---|
289 | string value of OS on which the debuggee runs/ran
|
---|
290 | </td>
|
---|
291 | </tr>
|
---|
292 | <tr>
|
---|
293 | <td>
|
---|
294 | buildInfo
|
---|
295 | </td>
|
---|
296 | <td>
|
---|
297 | internal build info string from debuggee
|
---|
298 | </td>
|
---|
299 | </tr>
|
---|
300 | <tr>
|
---|
301 | <td>
|
---|
302 | flags
|
---|
303 | </td>
|
---|
304 | <td>
|
---|
305 | name-value pairs (JavaScript associative array) of JVM command line flags of the debuggee
|
---|
306 | </td>
|
---|
307 | </tr>
|
---|
308 | <tr>
|
---|
309 | <td>
|
---|
310 | classPath
|
---|
311 | </td>
|
---|
312 | <td>
|
---|
313 | string value of classpath of the debuggee
|
---|
314 | </td>
|
---|
315 | </tr>
|
---|
316 | <tr>
|
---|
317 | <td>
|
---|
318 | userDir
|
---|
319 | </td>
|
---|
320 | <td>
|
---|
321 | string value of user.dir System property of the debuggee
|
---|
322 | </td>
|
---|
323 | </tr>
|
---|
324 | </table>
|
---|
325 |
|
---|
326 | <h3>heap object</h3>
|
---|
327 |
|
---|
328 | <p>
|
---|
329 | heap object represents Java heap of the debuggee VM
|
---|
330 | </p>
|
---|
331 | <table border="1">
|
---|
332 | <tr>
|
---|
333 | <th>
|
---|
334 | Function or property name
|
---|
335 | </th>
|
---|
336 | <th>
|
---|
337 | Description
|
---|
338 | </th>
|
---|
339 | </tr>
|
---|
340 | <tr>
|
---|
341 | <td>
|
---|
342 | capacity
|
---|
343 | </td>
|
---|
344 | <td>
|
---|
345 | byte size of capacity of the heap
|
---|
346 | </td>
|
---|
347 | </tr>
|
---|
348 | <tr>
|
---|
349 | <td>
|
---|
350 | used
|
---|
351 | </td>
|
---|
352 | <td>
|
---|
353 | byte size of used portion (of live objects) of the heap
|
---|
354 | </td>
|
---|
355 | </tr>
|
---|
356 | <tr>
|
---|
357 | <td>
|
---|
358 | forEachObject(func, [class], [include subtypes -- true|false])
|
---|
359 | </td>
|
---|
360 | <td>
|
---|
361 | This function accepts a callback function 'func' and optionally class name and boolean arguments.
|
---|
362 | This function calls the callback for each Java object in the debuggee's heap. The optional class
|
---|
363 | argument may be used to receive objects of given class only. The third arguments specifies whether
|
---|
364 | to include objects of subtype of given class [or interface] or not. The default value of class is "java.lang.Object"
|
---|
365 | and and that of the third argument is true. i.e., by default all objects are included.
|
---|
366 | </td>
|
---|
367 | </tr>
|
---|
368 | <tr>
|
---|
369 | <td>
|
---|
370 | forEachClass(func, [initiating loader -- true|false])
|
---|
371 | </td>
|
---|
372 | <td>
|
---|
373 | This function accepts a callback function 'func'. This function iterates through the classes of the debuggee and calls the
|
---|
374 | callback for each class. The second parameter tells whether to pass initiating loader to the iterator callback or not.
|
---|
375 | </td>
|
---|
376 | </tr>
|
---|
377 | </table>
|
---|
378 |
|
---|
379 | <h3>Accessing Java objects and arrays in script</h3>
|
---|
380 |
|
---|
381 | <p>
|
---|
382 | From a given Java object, we can access all fields of the Java object by usual '.' operator. i.e., if you got a Java object
|
---|
383 | called 'o' of type java.lang.Thread from debuggee, you can access 'stackSize' field by o.stackSize syntax. Similarly, length of Java array
|
---|
384 | objects can be accessed by length property. And array indexing follows usual syntax. i.e., n'th element of array 'a' is
|
---|
385 | accessed by a[n].
|
---|
386 | </p>
|
---|
387 |
|
---|
388 | <h3>jvm.threads array</h3>
|
---|
389 |
|
---|
390 | <p>
|
---|
391 | This is a JavaScript array of Java threads of the debuggee. As usual, 'length' property tells the number of threads and individual
|
---|
392 | threads may be accessed by index operator -- i.e, jvm.threads[0] returns the first thread.
|
---|
393 | </p>
|
---|
394 |
|
---|
395 | <h3>thread object</h3>
|
---|
396 |
|
---|
397 |
|
---|
398 | <p>
|
---|
399 | In addition to the fields of java.lang.Thread (or subclass) fields, thread objects have two additional properties.
|
---|
400 |
|
---|
401 | <ul>
|
---|
402 | <li>frames -- array of stack frame objects
|
---|
403 | <li>monitors -- array of monitor objects owned by the thread
|
---|
404 | </ul>
|
---|
405 |
|
---|
406 | </p>
|
---|
407 |
|
---|
408 | <h3>stack frame object</h3>
|
---|
409 |
|
---|
410 | <table border="1">
|
---|
411 | <tr>
|
---|
412 | <th>
|
---|
413 | Property name
|
---|
414 | </th>
|
---|
415 | <th>
|
---|
416 | Description
|
---|
417 | </th>
|
---|
418 | </tr>
|
---|
419 | <td>
|
---|
420 | thisObject
|
---|
421 | </td>
|
---|
422 | <td>
|
---|
423 | Object representing 'this' of the current frame [will be null for static methods]
|
---|
424 | </td>
|
---|
425 | </tr>
|
---|
426 | <tr>
|
---|
427 | <td>
|
---|
428 | locals
|
---|
429 | </td>
|
---|
430 | <td>
|
---|
431 | name-value pairs of local variables [JavaScript associative array]
|
---|
432 | </td>
|
---|
433 | </tr>
|
---|
434 | <tr>
|
---|
435 | <td>
|
---|
436 | line
|
---|
437 | </td>
|
---|
438 | <td>
|
---|
439 | Java source line number at which the frame is executing
|
---|
440 | </td>
|
---|
441 | </tr>
|
---|
442 | <tr>
|
---|
443 | <td>
|
---|
444 | bci
|
---|
445 | </td>
|
---|
446 | <td>
|
---|
447 | byte code index of the bytecode that the frame is executing
|
---|
448 | </td>
|
---|
449 | </tr>
|
---|
450 | <tr>
|
---|
451 | <td>
|
---|
452 | thread
|
---|
453 | </td>
|
---|
454 | <td>
|
---|
455 | thread to which this frame belongs
|
---|
456 | </td>
|
---|
457 | </tr>
|
---|
458 | <tr>
|
---|
459 | <td>
|
---|
460 | method
|
---|
461 | </td>
|
---|
462 | <td>
|
---|
463 | Java method that the frame is executing
|
---|
464 | </td>
|
---|
465 | </tr>
|
---|
466 | </table>
|
---|
467 |
|
---|
468 | <h3>method object</h3>
|
---|
469 |
|
---|
470 | <p>
|
---|
471 | method object represents a Java method of debuggee
|
---|
472 | </p>
|
---|
473 |
|
---|
474 | <table border="1">
|
---|
475 | <tr>
|
---|
476 | <th>
|
---|
477 | Property name
|
---|
478 | </th>
|
---|
479 | <th>
|
---|
480 | Description
|
---|
481 | </th>
|
---|
482 | </tr>
|
---|
483 | <tr>
|
---|
484 | <td>
|
---|
485 | isStatic
|
---|
486 | </td>
|
---|
487 | <td>
|
---|
488 | boolean - true for static methods and false for non-static methods
|
---|
489 | </td>
|
---|
490 | </tr>
|
---|
491 |
|
---|
492 | <tr>
|
---|
493 | <td>
|
---|
494 | isSynchronized
|
---|
495 | </td>
|
---|
496 | <td>
|
---|
497 | boolean - true for synchronized methods and false for non-synchronized methods
|
---|
498 | </td>
|
---|
499 | </tr>
|
---|
500 |
|
---|
501 | <tr>
|
---|
502 | <td>
|
---|
503 | isNative
|
---|
504 | </td>
|
---|
505 | <td>
|
---|
506 | boolean - true for native methods and false for non-native methods
|
---|
507 | </td>
|
---|
508 | </tr>
|
---|
509 |
|
---|
510 | <tr>
|
---|
511 | <td>
|
---|
512 | isProtected
|
---|
513 | </td>
|
---|
514 | <td>
|
---|
515 | boolean - true for protected methods and false for non-protected methods
|
---|
516 | </td>
|
---|
517 | </tr>
|
---|
518 |
|
---|
519 | <tr>
|
---|
520 | <td>
|
---|
521 | isPrivate
|
---|
522 | </td>
|
---|
523 | <td>
|
---|
524 | boolean - true for private methods and false for non-private methods
|
---|
525 | </td>
|
---|
526 | </tr>
|
---|
527 |
|
---|
528 | <tr>
|
---|
529 | <td>
|
---|
530 | isSynthetic
|
---|
531 | </td>
|
---|
532 | <td>
|
---|
533 | boolean - true for Javac generated synthetic methods and false for non-synthetic methods
|
---|
534 | </td>
|
---|
535 | </tr>
|
---|
536 |
|
---|
537 | <tr>
|
---|
538 | <td>
|
---|
539 | isPackagePrivate
|
---|
540 | </td>
|
---|
541 | <td>
|
---|
542 | boolean - true for package-private methods and false for non-package-private methods
|
---|
543 | </td>
|
---|
544 | </tr>
|
---|
545 |
|
---|
546 | <tr>
|
---|
547 | <td>
|
---|
548 | isPublic
|
---|
549 | </td>
|
---|
550 | <td>
|
---|
551 | boolean - true for public methods and false for non-public methods
|
---|
552 | </td>
|
---|
553 | </tr>
|
---|
554 |
|
---|
555 | <tr>
|
---|
556 | <td>
|
---|
557 | holder
|
---|
558 | </td>
|
---|
559 | <td>
|
---|
560 | an object that represents Class that contains this method
|
---|
561 | </td>
|
---|
562 | </tr>
|
---|
563 |
|
---|
564 | <tr>
|
---|
565 | <td>
|
---|
566 | signature
|
---|
567 | </td>
|
---|
568 | <td>
|
---|
569 | string -- signature of this method
|
---|
570 | </td>
|
---|
571 | </tr>
|
---|
572 |
|
---|
573 | <tr>
|
---|
574 | <td>
|
---|
575 | isObsolete
|
---|
576 | </td>
|
---|
577 | <td>
|
---|
578 | boolean - true for obsolete (hotswapped) methods and false for non-obsolete methods
|
---|
579 | </td>
|
---|
580 | </tr>
|
---|
581 |
|
---|
582 | <tr>
|
---|
583 | <td>
|
---|
584 | isStrict
|
---|
585 | </td>
|
---|
586 | <td>
|
---|
587 | boolean - true for strictfp methods and false for non-strictfp methods
|
---|
588 | </td>
|
---|
589 | </tr>
|
---|
590 |
|
---|
591 | <tr>
|
---|
592 | <td>
|
---|
593 | isFinal
|
---|
594 | </td>
|
---|
595 | <td>
|
---|
596 | boolean - true for final methods and false for non-final methods
|
---|
597 | </td>
|
---|
598 | </tr>
|
---|
599 |
|
---|
600 | <tr>
|
---|
601 | <td>
|
---|
602 | name
|
---|
603 | </td>
|
---|
604 | <td>
|
---|
605 | string - name of this method
|
---|
606 | </td>
|
---|
607 | </tr>
|
---|
608 | </table>
|
---|
609 |
|
---|
610 | <h3>class object</h3>
|
---|
611 |
|
---|
612 | <p>
|
---|
613 | A class object represents loaded Java class in debuggee VM. This represents java.lang.Class instance in the debuggee.
|
---|
614 | This is type of return value of classof global function. Also, method.holder property and field.holder are
|
---|
615 | of this type.
|
---|
616 | </p>
|
---|
617 |
|
---|
618 | <table border="1">
|
---|
619 | <tr>
|
---|
620 | <th>
|
---|
621 | Property name
|
---|
622 | </th>
|
---|
623 | <th>
|
---|
624 | Description
|
---|
625 | </th>
|
---|
626 | </tr>
|
---|
627 |
|
---|
628 | <tr>
|
---|
629 | <td>
|
---|
630 | name
|
---|
631 | </td>
|
---|
632 | <td>
|
---|
633 | name of this class
|
---|
634 | </td>
|
---|
635 | </tr>
|
---|
636 |
|
---|
637 | <tr>
|
---|
638 | <td>
|
---|
639 | superClass
|
---|
640 | </td>
|
---|
641 | <td>
|
---|
642 | class object representing super class of this class
|
---|
643 | </td>
|
---|
644 | </tr>
|
---|
645 |
|
---|
646 | <tr>
|
---|
647 | <td>
|
---|
648 | isArrayClass
|
---|
649 | </td>
|
---|
650 | <td>
|
---|
651 | boolean -- is the current class an array class?
|
---|
652 | </td>
|
---|
653 | </tr>
|
---|
654 |
|
---|
655 | <tr>
|
---|
656 | <td>
|
---|
657 | isStatic
|
---|
658 | </td>
|
---|
659 | <td>
|
---|
660 | boolean -- is the current class static or not
|
---|
661 | </td>
|
---|
662 | </tr>
|
---|
663 |
|
---|
664 | <tr>
|
---|
665 | <td>
|
---|
666 | isInterface
|
---|
667 | </td>
|
---|
668 | <td>
|
---|
669 | boolean -- is the current class an interface
|
---|
670 | </td>
|
---|
671 | </tr>
|
---|
672 |
|
---|
673 | <tr>
|
---|
674 | <td>
|
---|
675 | isAbstract
|
---|
676 | </td>
|
---|
677 | <td>
|
---|
678 | boolean -- is the current class abstract or not
|
---|
679 | </td>
|
---|
680 | </tr>
|
---|
681 |
|
---|
682 | <tr>
|
---|
683 | <td>
|
---|
684 | isProtected
|
---|
685 | </td>
|
---|
686 | <td>
|
---|
687 | boolean -- is the current class protected or not
|
---|
688 | </td>
|
---|
689 | </tr>
|
---|
690 |
|
---|
691 | <tr>
|
---|
692 | <td>
|
---|
693 | isPrivate
|
---|
694 | </td>
|
---|
695 | <td>
|
---|
696 | boolean -- is the current class private or not
|
---|
697 | </td>
|
---|
698 | </tr>
|
---|
699 |
|
---|
700 | <tr>
|
---|
701 | <td>
|
---|
702 | isPackagePrivate
|
---|
703 | </td>
|
---|
704 | <td>
|
---|
705 | boolean -- is the current class package private or not
|
---|
706 | </td>
|
---|
707 | </tr>
|
---|
708 |
|
---|
709 | <tr>
|
---|
710 | <td>
|
---|
711 | isSynthetic
|
---|
712 | </td>
|
---|
713 | <td>
|
---|
714 | boolean -- is the current class synthetic or not
|
---|
715 | </td>
|
---|
716 | </tr>
|
---|
717 |
|
---|
718 | <tr>
|
---|
719 | <td>
|
---|
720 | classLoader
|
---|
721 | </td>
|
---|
722 | <td>
|
---|
723 | object that represents ClassLoader object that loaded the current class
|
---|
724 | </td>
|
---|
725 | </tr>
|
---|
726 |
|
---|
727 |
|
---|
728 | <tr>
|
---|
729 | <td>
|
---|
730 | fields
|
---|
731 | </td>
|
---|
732 | <td>
|
---|
733 | array of static and instance fields of the current class
|
---|
734 | </td>
|
---|
735 | </tr>
|
---|
736 |
|
---|
737 | <tr>
|
---|
738 | <td>
|
---|
739 | protectionDomain
|
---|
740 | </td>
|
---|
741 | <td>
|
---|
742 | protection domain to which current class belongs
|
---|
743 | </td>
|
---|
744 | </tr>
|
---|
745 |
|
---|
746 | <tr>
|
---|
747 | <td>
|
---|
748 | isPublic
|
---|
749 | </td>
|
---|
750 | <td>
|
---|
751 | boolean -- is the current class public or not
|
---|
752 | </td>
|
---|
753 | </tr>
|
---|
754 |
|
---|
755 | <tr>
|
---|
756 | <td>
|
---|
757 | signers
|
---|
758 | </td>
|
---|
759 | <td>
|
---|
760 | array of signers for current class
|
---|
761 | </td>
|
---|
762 | </tr>
|
---|
763 |
|
---|
764 | <tr>
|
---|
765 | <td>
|
---|
766 | sourceFile
|
---|
767 | </td>
|
---|
768 | <td>
|
---|
769 | string -- name of the source file for current class
|
---|
770 | </td>
|
---|
771 | </tr>
|
---|
772 |
|
---|
773 | <tr>
|
---|
774 | <td>
|
---|
775 | interfaces
|
---|
776 | </td>
|
---|
777 | <td>
|
---|
778 | array -- interfaces implemented by current class
|
---|
779 | </td>
|
---|
780 | </tr>
|
---|
781 |
|
---|
782 | <tr>
|
---|
783 | <td>
|
---|
784 | isStrict
|
---|
785 | </td>
|
---|
786 | <td>
|
---|
787 | boolean -- is the current class strictfp or not
|
---|
788 | </td>
|
---|
789 | </tr>
|
---|
790 |
|
---|
791 | <tr>
|
---|
792 | <td>
|
---|
793 | methods
|
---|
794 | </td>
|
---|
795 | <td>
|
---|
796 | array of methods (static and instance) of the current class
|
---|
797 | </td>
|
---|
798 | </tr>
|
---|
799 |
|
---|
800 |
|
---|
801 | <tr>
|
---|
802 | <td>
|
---|
803 | isFinal
|
---|
804 | </td>
|
---|
805 | <td>
|
---|
806 | boolean -- is the current class final or not
|
---|
807 | </td>
|
---|
808 | </tr>
|
---|
809 |
|
---|
810 | <tr>
|
---|
811 | <td>
|
---|
812 | statics
|
---|
813 | </td>
|
---|
814 | <td>
|
---|
815 | name-value pairs (JavaScript associate array) of static fields of the current class
|
---|
816 | </td>
|
---|
817 | </tr>
|
---|
818 | </table>
|
---|
819 |
|
---|
820 | <h3>field object</h3>
|
---|
821 | <p>
|
---|
822 | field represents a static or instance field of some class in debuggee
|
---|
823 | </p>
|
---|
824 |
|
---|
825 | <table border="1">
|
---|
826 | <tr>
|
---|
827 | <th>
|
---|
828 | Property name
|
---|
829 | </th>
|
---|
830 | <th>
|
---|
831 | Description
|
---|
832 | </th>
|
---|
833 | </tr>
|
---|
834 |
|
---|
835 | <tr>
|
---|
836 | <td>
|
---|
837 | isStatic
|
---|
838 | </td>
|
---|
839 | <td>
|
---|
840 | boolean -- is this field a static field?
|
---|
841 | </td>
|
---|
842 | </tr>
|
---|
843 |
|
---|
844 | <tr>
|
---|
845 | <td>
|
---|
846 | holder
|
---|
847 | </td>
|
---|
848 | <td>
|
---|
849 | class that owns this field
|
---|
850 | </td>
|
---|
851 | </tr>
|
---|
852 |
|
---|
853 | <tr>
|
---|
854 | <td>
|
---|
855 | signature
|
---|
856 | </td>
|
---|
857 | <td>
|
---|
858 | string signature of this field
|
---|
859 | </td>
|
---|
860 | </tr>
|
---|
861 |
|
---|
862 | <tr>
|
---|
863 | <td>
|
---|
864 | isProtected
|
---|
865 | </td>
|
---|
866 | <td>
|
---|
867 | boolean - is this field a protected field or not?
|
---|
868 | </td>
|
---|
869 | </tr>
|
---|
870 |
|
---|
871 | <tr>
|
---|
872 | <td>
|
---|
873 | isPrivate
|
---|
874 | </td>
|
---|
875 | <td>
|
---|
876 | boolean - is this field a private field or not?
|
---|
877 | </td>
|
---|
878 | </tr>
|
---|
879 |
|
---|
880 | <tr>
|
---|
881 | <td>
|
---|
882 | isSynthetic
|
---|
883 | </td>
|
---|
884 | <td>
|
---|
885 | boolean - is this javac generated synthetic field or not?
|
---|
886 | </td>
|
---|
887 | </tr>
|
---|
888 |
|
---|
889 | <tr>
|
---|
890 | <td>
|
---|
891 | isPackagePrivate
|
---|
892 | </td>
|
---|
893 | <td>
|
---|
894 | boolean - is this field a package private field or not?
|
---|
895 | </td>
|
---|
896 | </tr>
|
---|
897 |
|
---|
898 | <tr>
|
---|
899 | <td>
|
---|
900 | isTransient
|
---|
901 | </td>
|
---|
902 | <td>
|
---|
903 | boolean - is this field a transient field or not?
|
---|
904 | </td>
|
---|
905 | </tr>
|
---|
906 |
|
---|
907 | <tr>
|
---|
908 | <td>
|
---|
909 | isFinal
|
---|
910 | </td>
|
---|
911 | <td>
|
---|
912 | boolean - is this field final or not?
|
---|
913 | </td>
|
---|
914 | </tr>
|
---|
915 |
|
---|
916 | <tr>
|
---|
917 | <td>
|
---|
918 | name
|
---|
919 | </td>
|
---|
920 | <td>
|
---|
921 | string - name of this field
|
---|
922 | </td>
|
---|
923 | </tr>
|
---|
924 |
|
---|
925 | <tr>
|
---|
926 | <td>
|
---|
927 | isPublic
|
---|
928 | </td>
|
---|
929 | <td>
|
---|
930 | boolean - is this field public or not?
|
---|
931 | </td>
|
---|
932 | </tr>
|
---|
933 | </table>
|
---|
934 |
|
---|
935 | <h3>Initialization Script</h3>
|
---|
936 | <p>
|
---|
937 | jsdb engine looks for initialization script file named <b>jsdb.js</b> in user's home directory. If found, it loads just after attaching to debuggee but before printing prompt for user's input. User can assume that s/he can access debuggee VM
|
---|
938 | state during initialization script.
|
---|
939 | </p>
|
---|
940 |
|
---|
941 | <h3>Sample scripts</h3>
|
---|
942 |
|
---|
943 | Semantics and knowledge of application classes (for eg. AppServer's classes) would be needed to create app specific
|
---|
944 | scripts. The following script samples are app-independent and provide a flavour of kind of scripts that can be written.
|
---|
945 |
|
---|
946 | <h4>Script to print system properties of JVM</h4>
|
---|
947 |
|
---|
948 | <pre>
|
---|
949 | <code>
|
---|
950 | jvm.sysProps.toString()
|
---|
951 | </code>
|
---|
952 | </pre>
|
---|
953 |
|
---|
954 | <h4>Script to print JVM command line flags</h4>
|
---|
955 | <pre>
|
---|
956 | <code>
|
---|
957 | jvm.flags.toString()
|
---|
958 | </code>
|
---|
959 | </pre>
|
---|
960 |
|
---|
961 |
|
---|
962 | <h4>Script to print class-wise histogram of objects</h4>
|
---|
963 |
|
---|
964 | <pre>
|
---|
965 | <code>
|
---|
966 |
|
---|
967 | // associate array to hold histogram
|
---|
968 | var histo;
|
---|
969 | function func(obj) {
|
---|
970 | var classname = classof(obj).name;
|
---|
971 | if (histo[classname] == undefined) {
|
---|
972 | // first time we are visiting this class type
|
---|
973 | histo[classname] = 1;
|
---|
974 | } else {
|
---|
975 | histo[classname]++;
|
---|
976 | }
|
---|
977 | }
|
---|
978 |
|
---|
979 | // iterate through java heap calling 'func' for each object
|
---|
980 | jvm.heap.forEachObject(func);
|
---|
981 |
|
---|
982 | // print the histogram
|
---|
983 | for (i in histo) {
|
---|
984 | println('number of instances of ', i, ' = ', histo[i]);
|
---|
985 | }
|
---|
986 |
|
---|
987 | </code>
|
---|
988 | </pre>
|
---|
989 |
|
---|
990 | <h4>Script to print stack trace of all Java threads</h4>
|
---|
991 |
|
---|
992 | <pre>
|
---|
993 | <code>
|
---|
994 |
|
---|
995 | function printStackTrace(t) {
|
---|
996 | println(t.name);
|
---|
997 | println('');
|
---|
998 | for (i in t.frames) {
|
---|
999 | println(t.frames[i]);
|
---|
1000 | }
|
---|
1001 | println('');
|
---|
1002 | }
|
---|
1003 |
|
---|
1004 | // walk through the list of threads and call printStackTrace
|
---|
1005 | // for each thread
|
---|
1006 | for (o in jvm.threads) {
|
---|
1007 | printStackTrace(jvm.threads[o]);
|
---|
1008 | }
|
---|
1009 |
|
---|
1010 |
|
---|
1011 | </code>
|
---|
1012 | </pre>
|
---|
1013 |
|
---|
1014 |
|
---|
1015 | <h4>Script to re-construct .class files for all non-bootstrap classes</h4>
|
---|
1016 |
|
---|
1017 | <pre>
|
---|
1018 | <code>
|
---|
1019 |
|
---|
1020 | function dump(cl) {
|
---|
1021 | if (!cl.isArrayClass && cl.classLoader != null) {
|
---|
1022 | // not an array class and a non-bootstrap class
|
---|
1023 | // create .class files in e:\tmp dir
|
---|
1024 | dumpClass(cl, "e:\\tmp);
|
---|
1025 | } else {
|
---|
1026 | println("skipping bootstrap class ", cl.name);
|
---|
1027 | }
|
---|
1028 | }
|
---|
1029 |
|
---|
1030 | // walk thru heap and call callback for each java.lang.Class instance
|
---|
1031 | jvm.heap.forEachObject(dump, "java.lang.Class");
|
---|
1032 | </code>
|
---|
1033 | </pre>
|
---|
1034 |
|
---|
1035 | <h4>Script to print paths of all java.io.File's currently accessed</h4>
|
---|
1036 |
|
---|
1037 | <pre>
|
---|
1038 | <code>
|
---|
1039 |
|
---|
1040 | function printFile(f) {
|
---|
1041 | // construct a mirror java.io.File here and
|
---|
1042 | // print absolute path here
|
---|
1043 | println(mirror(f).getAbsolutePath());
|
---|
1044 | }
|
---|
1045 |
|
---|
1046 | jvm.heap.forEachObject(printFile, "java.io.File");
|
---|
1047 |
|
---|
1048 | </code>
|
---|
1049 | </pre>
|
---|
1050 |
|
---|
1051 | <h4>Script to print static fields of java.lang.Thread class</h4>
|
---|
1052 | <pre>
|
---|
1053 | <code>
|
---|
1054 |
|
---|
1055 | var threadClass = classof("java.lang.Thread");
|
---|
1056 | for (i in threadClass.statics) {
|
---|
1057 | println(i, '=', threadClass.statics[i]);
|
---|
1058 | }
|
---|
1059 |
|
---|
1060 | </code>
|
---|
1061 | </pre>
|
---|
1062 |
|
---|
1063 | <h3>Low level interface (VM State)</h3>
|
---|
1064 |
|
---|
1065 | <p>
|
---|
1066 | Low level jsdb interface works by <a href="http://www.mozilla.org/rhino/ScriptingJava.html">JavaScript-to-Java (previously known as "LiveConnect")
|
---|
1067 | interface</a> provided by Rhino JavaScript engine.
|
---|
1068 | </p>
|
---|
1069 |
|
---|
1070 | <h2>sapkg object</h2>
|
---|
1071 | <p>
|
---|
1072 | This object provides short names for SA package names. For eg. instead of writing
|
---|
1073 | Packages.sun.jvm.hotspot.memory, we can write sapkg.memory.
|
---|
1074 | </p>
|
---|
1075 |
|
---|
1076 | <h2>sa object</h2>
|
---|
1077 | <p>
|
---|
1078 | This object contains all SA singleton objects such as VM, Universe, SymbolTable,
|
---|
1079 | SystemDictionary, ObjectHeap, CollectedHeap, Debugger, CDebugger (if available),
|
---|
1080 | Interpreter, TypeDataBase and Threads. For eg. to access SymbolTable of Java debuggee,
|
---|
1081 | we can use sa.symbolTable. User can execute the following code to get fields of this object.
|
---|
1082 | </p>
|
---|
1083 | <pre>
|
---|
1084 | <code>
|
---|
1085 | for (i in sa) {
|
---|
1086 | println(i);
|
---|
1087 | }
|
---|
1088 | </code>
|
---|
1089 | </pre>
|
---|
1090 |
|
---|
1091 | <h4>Heap Iterators</h4>
|
---|
1092 | <dl>
|
---|
1093 | <dt>forEachOop(callback)</dt>
|
---|
1094 | <dd>calls a callback function for each Oop in Java heap</dd>
|
---|
1095 | <dt>forEachOopOfKlass(callback, klass, [includeSubtypes])</dt>
|
---|
1096 | <dd>calls a callback function for each Oop of a give Klass type
|
---|
1097 | Optinally, third argument can specify whether to include subtype Oops
|
---|
1098 | or not.
|
---|
1099 | </dd>
|
---|
1100 | </dl>
|
---|
1101 |
|
---|
1102 | <h4>System Dictionary Access</h4>
|
---|
1103 | <dl>
|
---|
1104 | <dt>forEachKlass(callback)</dt>
|
---|
1105 | <dd>calls a callback function for each Klass in Java heap</dd>
|
---|
1106 | <dt>forEachKlassAndLoader(callback)</dt>
|
---|
1107 | <dd>
|
---|
1108 | calls callback with Klass and initiating loader (Oop) for System dictionary
|
---|
1109 | entry.
|
---|
1110 | </dd>
|
---|
1111 | <dt>forEachPrimArrayKlass(callback)</dt>
|
---|
1112 | <dd>
|
---|
1113 | calls callback with Klass and initiating loader (Oop) for each
|
---|
1114 | primitive array Klass in the system.
|
---|
1115 | </dd>
|
---|
1116 | <dt>findInstanceKlass(name)</dt>
|
---|
1117 | <dd>
|
---|
1118 | finds the first instance klass with given name from System dictionary
|
---|
1119 | </dd>
|
---|
1120 | </dl>
|
---|
1121 |
|
---|
1122 | <h4>Thread, Frame Iterators</h4>
|
---|
1123 | <dl>
|
---|
1124 | <dt>forEachJavaThread(callback)</dt>
|
---|
1125 | <dd>calls callback for each Java Thread</dd>
|
---|
1126 | <dt>forEachFrame(javaThread, callback)</dt>
|
---|
1127 | <dd>calls callback for each Frame of a given JavaThread</dd>
|
---|
1128 | <dt>forEachVFrame(javaThread, callback)</dt>
|
---|
1129 | <dd>calls callback for each JavaVFrame of a given JavaThread</dd>
|
---|
1130 | <dt>forEachThread(callback)</dt>
|
---|
1131 | <dd>calls callback for each (native) ThreadProxy (obtained by CDebugger.getThreadList)
|
---|
1132 | </dd>
|
---|
1133 | <dt>forEachCFrame(threadProxy, callback)</dt>
|
---|
1134 | <dd>
|
---|
1135 | calls callback for each CFrame of a given ThreadProxy object
|
---|
1136 | </dd>
|
---|
1137 | </dl>
|
---|
1138 |
|
---|
1139 | <h4>Code blobs, Interpreter codelets</h4>
|
---|
1140 | <dl>
|
---|
1141 | <dt>forEachCodeBlob(callback)</dt>
|
---|
1142 | <dd>
|
---|
1143 | calls callback with each code blob in code cache
|
---|
1144 | </dd>
|
---|
1145 | <dt>findCodeBlob(address)</dt>
|
---|
1146 | <dd>
|
---|
1147 | finds the code blob, if any, that contains the given address.
|
---|
1148 | Returns null, on failure.
|
---|
1149 | </dd>
|
---|
1150 | <dt>findNMethod(address)</dt>
|
---|
1151 | <dd>
|
---|
1152 | finds the NMethod that contains given address.
|
---|
1153 | </dd>
|
---|
1154 | <dt>pcDescAt(addr)</dt>
|
---|
1155 | <dd>
|
---|
1156 | returns PCDesc at given address or null.
|
---|
1157 | </dd>
|
---|
1158 | <dt>forEachInterpCodelet(callbacl)</dt>
|
---|
1159 | <dd>
|
---|
1160 | calls callback with each Interpreter codelet
|
---|
1161 | </dd>
|
---|
1162 | </dl>
|
---|
1163 |
|
---|
1164 | <h4>VM structs, constants</h4>
|
---|
1165 | <dl>
|
---|
1166 | <dt>forEachType(callback)</dt>
|
---|
1167 | <dd>
|
---|
1168 | calls callback for each Type in VM's type database
|
---|
1169 | </dd>
|
---|
1170 | <dt>forEachVMIntConst(callback)</dt>
|
---|
1171 | <dd>
|
---|
1172 | calls callback for each named integer constant. passes name
|
---|
1173 | as argument.
|
---|
1174 | </dd>
|
---|
1175 | <dt>forEachVMLongConst(callback)</dt>
|
---|
1176 | <dd>
|
---|
1177 | calls callback for each named long constant. passes name
|
---|
1178 | as argument.
|
---|
1179 | </dd>
|
---|
1180 | <dt>findVMType(name)</dt>
|
---|
1181 | <dd>
|
---|
1182 | finds a VM type by name. returns null if no known Type of given name
|
---|
1183 | exists in type database.
|
---|
1184 | </dd>
|
---|
1185 | <dt>findVMIntConst(name)</dt>
|
---|
1186 | <dd>
|
---|
1187 | finds an integer constant in type data base by name.
|
---|
1188 | </dd>
|
---|
1189 | <dt>findVMLongConst(name)</dt>
|
---|
1190 | <dd>
|
---|
1191 | finds an long constant in type data base by name.
|
---|
1192 | </dd>
|
---|
1193 | <dt>vmTypeof(addr)</dt>
|
---|
1194 | <dd>
|
---|
1195 | returns VM type of object at 'addr' if any. Else, returns null.
|
---|
1196 | </dd>
|
---|
1197 | <dt>isOfVMType(addr, type)</dt>
|
---|
1198 | <dd>
|
---|
1199 | returns whether object at 'addr' is of VM type 'type' or not.
|
---|
1200 | </dd>
|
---|
1201 | <dt>printVMType(type, addr)</dt>
|
---|
1202 | <dd>
|
---|
1203 | prints 'addr' as VM object of type 'type'
|
---|
1204 | </dd>
|
---|
1205 | <dt>print<i>XXX</i>(addr)</dt>
|
---|
1206 | <dd>
|
---|
1207 | For each VM type, these functions are defined. For eg. there is printUniverse,
|
---|
1208 | printSystemDictionary etc. are available. Without 'addr' being passed static fields are printed. With 'addr' param being passed, instance fields are printed.
|
---|
1209 | </dd>
|
---|
1210 | </dl>
|
---|
1211 |
|
---|
1212 | <h4>Low level debugger facilities</h4>
|
---|
1213 | <dl>
|
---|
1214 | <dt>num2addr(number)</dt>
|
---|
1215 | <dd>
|
---|
1216 | converts a (long) number to SA Address instance
|
---|
1217 | </dd>
|
---|
1218 | <dt>str2addr(string)</dt>
|
---|
1219 | <dd>
|
---|
1220 | converts a given hex string to SA Address instance
|
---|
1221 | </dd>
|
---|
1222 | <dt>any2addr(any)</dt>
|
---|
1223 | <dd>
|
---|
1224 | Takes a number or a string or an Address and returns
|
---|
1225 | an Address instance. For other types, returns 'undefined'
|
---|
1226 | </dd>
|
---|
1227 | <dt>addr2str(addr)</dt>
|
---|
1228 | <dd>
|
---|
1229 | converts a given Address instance to a hex string
|
---|
1230 | </dd>
|
---|
1231 | <dt>addr2num(addr)</dt>
|
---|
1232 | <dd>
|
---|
1233 | converts a given Address instance to a (long) number
|
---|
1234 | </dd>
|
---|
1235 | <dt>sym2addr(library, symbol)</dt>
|
---|
1236 | <dd>
|
---|
1237 | returns Address of a given symbol in a given library (shared object or DLL)
|
---|
1238 | Example: sym2addr('jvm.dll', 'JNI_CreateJavaVM')
|
---|
1239 | <dt>addr2sym(addr)</dt>
|
---|
1240 | <dd>
|
---|
1241 | Returns nearest symbol to a given address (if any). If no such symbol is found,
|
---|
1242 | returns the given address as a string.
|
---|
1243 | </dd>
|
---|
1244 | <dt>readBytesAt(addr, num)</dt>
|
---|
1245 | <dd>
|
---|
1246 | returns 'num' bytes at 'addr' as a Java byte[]
|
---|
1247 | </dd>
|
---|
1248 | <dt>readWordsAt(addr, num)</dt>
|
---|
1249 | <dd>
|
---|
1250 | returns 'num' words at 'addr' as a Java long[]
|
---|
1251 | </dd>
|
---|
1252 | <dt>readCStrAt(addr)</dt>
|
---|
1253 | <dd>
|
---|
1254 | returns 'C' String at given address
|
---|
1255 | </dd>
|
---|
1256 | <dt>readCStrLen(addr)</dt>
|
---|
1257 | <dd>
|
---|
1258 | returns the length of the 'C' String at given address
|
---|
1259 | </dd>
|
---|
1260 | <dt>readRegs(threadProxy)</dt>
|
---|
1261 | <dd>
|
---|
1262 | returns register set (of Thread Context) of a given thread specified
|
---|
1263 | by threadProxy. return value is an associate array having name-value pairs
|
---|
1264 | of registers.
|
---|
1265 | </dd>
|
---|
1266 | <dt>regs(threadProxy)</dt>
|
---|
1267 | <dd>
|
---|
1268 | prints register set of a given thread.
|
---|
1269 | </dd>
|
---|
1270 | <dt>mem(addr, [num])</dt>
|
---|
1271 | <dd>
|
---|
1272 | prints 'num' words (address size) at 'addr'. Prints nearest symbol for address, if found.
|
---|
1273 | </dd>
|
---|
1274 | <dt>dis(addr, [num])</dt>
|
---|
1275 | <dd>prints native code disassembly of 'num' bytes at given address 'addr'.
|
---|
1276 | Default value of 'num' is 4. This automatically detects whether the given address
|
---|
1277 | inside a nmethod. If so, it prints safepoint info, entry points , method signature etc.
|
---|
1278 | of the nmethod.
|
---|
1279 | </dd>
|
---|
1280 | <dt>jdis(method [or addr])</dt>
|
---|
1281 | <dd>
|
---|
1282 | prints Java bytecode disassembly for given method Oop or address of a method Oop.
|
---|
1283 | </dd>
|
---|
1284 | <dt>nmethoddis(nmethod)</dt>
|
---|
1285 | <dd>
|
---|
1286 | prints disassembly of given nmethod object. Note that you don't have to call this directly
|
---|
1287 | instead use 'dis'.
|
---|
1288 | </dd>
|
---|
1289 | <dt>where</dt>
|
---|
1290 | <dd>
|
---|
1291 | prints Java stack trace for all Java threads
|
---|
1292 | </dd>
|
---|
1293 | </dl>
|
---|
1294 |
|
---|
1295 | <h4>Miscellaneous</h4>
|
---|
1296 | <dl>
|
---|
1297 | <dt>addr2oop(addr)</dt>
|
---|
1298 | <dd>
|
---|
1299 | converts a given address to a Oop object
|
---|
1300 | </dd>
|
---|
1301 | <dt>oop2addr(oop)</dt>
|
---|
1302 | <dd>
|
---|
1303 | returns address of a given Oop object
|
---|
1304 | </dd>
|
---|
1305 | <dt>isOfVMType(addr, type)</dt>
|
---|
1306 | <dd>
|
---|
1307 | returns whether the given 'addr' points to a (C++) VM object of specified
|
---|
1308 | type. type may be specified by SA Type object or string name of the type.
|
---|
1309 | </dd>
|
---|
1310 | <dt>newVMObject(addr)</dt>
|
---|
1311 | <dd>
|
---|
1312 | returns instance of SA object for a given address (similar to SA VirtualConstructor
|
---|
1313 | interface).
|
---|
1314 | </dd>
|
---|
1315 | <dt>vmobj2addr(vmobject)</dt>
|
---|
1316 | <dd>
|
---|
1317 | returns Address represented by a given SA VMObject
|
---|
1318 | </dd>
|
---|
1319 | <dt>addr2vmobj(addr)</dt>
|
---|
1320 | <dd>same as newVMObject(addr)</dd>
|
---|
1321 | <dt>whatis(addr)</dt>
|
---|
1322 | <dd>
|
---|
1323 | returns string description of given address (using SA FindPointer and guess type API).
|
---|
1324 | <dt>isOop(addr)</dt>
|
---|
1325 | <dd>
|
---|
1326 | returns whether a given address is a valid Oop address or not
|
---|
1327 | </dd>
|
---|
1328 | </dl>
|
---|
1329 |
|
---|
1330 | <h4>Moving b/w jsdb low level and high level interfaces</h4>
|
---|
1331 |
|
---|
1332 | <p>
|
---|
1333 | Java objects of debuggee are represented by different script wrappers in high level
|
---|
1334 | interface. In the low-level interface these are instances of SA Oop class or its'
|
---|
1335 | subclass. To move b/w low-level and high-level interfaces the following functions may
|
---|
1336 | be used
|
---|
1337 | </p>
|
---|
1338 | <dl>
|
---|
1339 | <dt>oop2obj(oop)</dt>
|
---|
1340 | <dd>
|
---|
1341 | converts a given Oop object to a high-level wrapper object
|
---|
1342 | </dd>
|
---|
1343 | <dt>obj2oop(obj)</dt>
|
---|
1344 | <dd>
|
---|
1345 | converts a jsdb high level wrapper to underlying Oop instance
|
---|
1346 | </dd>
|
---|
1347 | </dl>
|
---|
1348 |
|
---|
1349 | <h3>JavaScript tips</h3>
|
---|
1350 |
|
---|
1351 | <ul>
|
---|
1352 | <li>to know properties, functions of any object, use the script
|
---|
1353 | <pre>
|
---|
1354 | <core>
|
---|
1355 | for(i in object) { println(i); }
|
---|
1356 | </code>
|
---|
1357 | </pre>
|
---|
1358 | <li>to view the source code of any function, just type the name of
|
---|
1359 | function in jsdb prompt
|
---|
1360 | <li>to view global functions, properties, run
|
---|
1361 | <pre>
|
---|
1362 | <code>
|
---|
1363 | for(i in this) { println(i); }
|
---|
1364 | </code>
|
---|
1365 | </pre>
|
---|
1366 | </ul>
|
---|
1367 |
|
---|
1368 | </body>
|
---|
1369 | </html>
|
---|