comparison agent/doc/jsdb.html @ 0:a61af66fc99e jdk7-b24

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:a61af66fc99e
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>