jdk/src/share/demo/jvmti/index.html
author duke
Sat, 01 Dec 2007 00:00:00 +0000
changeset 2 90ce3da70b43
child 4808 37f605425f74
permissions -rw-r--r--
Initial load
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
<html>
90ce3da70b43 Initial load
duke
parents:
diff changeset
     2
<head> <title>JVM TI Demonstration Code</title> </head>
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
<h1>JVM TI Demonstration Code</h1>
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
     7
The 
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
Java<sup><font size=-2>TM</font></sup> Virtual Machine Tools Interface (JVM TI)
90ce3da70b43 Initial load
duke
parents:
diff changeset
     9
is a native tool interface provided in JDK 5.0 and newer.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
Native libraries that use JVM TI and are loaded into the 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
Java Virtual Machine
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
via the -agentlib, -agentpath, or -Xrun (deprecated) interfaces, are
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
called Agents.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
<A HREF="http://java.sun.com/j2se/latest/docs/guide/jvmti">JVM TI</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
was designed to work with the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
Java Native Interface 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
(<A HREF="http://java.sun.com/j2se/latest/docs/guide/jni">JNI</A>),
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
and eventually displace the 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
Java Virtual Machine Debugging Interface 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    21
(<A HREF="http://java.sun.com/j2se/1.5.0/docs/guide/jpda/jvmdi-spec.html">JVMDI</A>)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    22
and the 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    23
Java Virtual Machine Profiling Interface 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
(<A HREF="http://java.sun.com/j2se/1.5.0/docs/guide/jvmpi/index.html">JVMPI</A>).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
We have created a set of demonstration agents that should
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
help show many of the features and abilities of the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
interface. This list of demonstration agents will change over time.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
They are provided as educational tools and as starting
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
points for Java tool development.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
These agents are built with every JDK build and some basic testing is performed
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
on a regular basis, but no extensive testbases currently
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
exist for these agents.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
Every JDK installation should include all the pre-built binaries and sources for
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
all these agents, just look in the demo/jvmti directory of your JDK.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
<h2>Using or Running These Agents</h2>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
Using these agents will require the VM to locate the shared library file
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
before any actual Java code is run.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
The JDK installation should contain all the agent libraries in 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
the ${JAVA_HOME}/demo/jvmti/<i>agent-name</i>/lib directories.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
The Solaris 64bit version would be contained in the sparcv9 or amd64
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
subdirectory.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
If 'java' complains that it can't find the library,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
you may need to add the directory containing the library into the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
LD_LIBRARY_PATH environment variable (Unix), or the PATH environment
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
variable (Windows).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
This is system and platform specific.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
If you are using 64bit Solaris (e.g. 'java -d64'), 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
you should use LD_LIBRARY_PATH64.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
Some agents such as hprof (heap/cpu profiler) and jdwp (debugger backend)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
are located inside the primary JDK directories and will always be found
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
in those locations.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
The agents that instrument classfiles 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
(i.e. BCI, usually through the java_crw_demo library) 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
such as hprof, heapTracker, mtrace, and minst, 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
also need to have the Java classes they use available in the bootclasspath.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
The one used by hprof is already in the bootclasspath, and the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
other agents will make attempts at automatically adding their jar file
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
(e.g. heapTracker.jar, mtrace.jar, or minst.jar) to the bootclasspath
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
with AddToBootstrapClassLoaderSearch from JVM TI at startup
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
(see the agent_util code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
This is done by locating this jar file at 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
${JAVA_HOME}/demo/jvmti/<i>agent-name</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
where JAVA_HOME is obtained by calling GetSystemProperty from JVM TI
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
with "java.home".
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
We recognize that this is not ideal, but felt that as just demonstration
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
code it was acceptable.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
Ideally the agent could find out the actual directory it came from and
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
locate the jar file relative to that location. 
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
Our demonstration agents currently do not do this.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
If you choose to modify or change these agents, the above information
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
is important in making everything is found.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
It is recommended that you change the name of the agent when you
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
modify it to avoid conflicts with the existing demo agents.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
Or better yet, go to http://jdk.dev.java.net and submit your
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
changes to the agent as an RFE to the JDK.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
<h2> Demonstration Agents Available </h2>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
<ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
<A HREF="versionCheck">versionCheck</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
This is a extremely small agent that does nothing but check the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
version string supplied in the jvmti.h file, with the version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
number supplied by the VM at runtime.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
<A HREF="mtrace">mtrace</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
This is a small agent that does method tracing.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
It uses Bytecode Instrumentation (BCI) via the java_crw_demo library.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
<A HREF="minst">minst</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
This is an even smaller agent that does just method entry tracing.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
It also uses Bytecode Instrumentation (BCI) via the java_crw_demo library,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
but the instrumentation code is pure Java (no Java native methods used).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
NOTE: Be sure to check out java.lang.instrument for a way to avoid
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
native code agents completely.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
<A HREF="gctest">gctest</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
This is a small agent that does garbage collection counting.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
<A HREF="heapViewer">heapViewer</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
This is a small agent that does some basic heap inspections.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
<A HREF="heapTracker">heapTracker</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
This is a small agent that does BCI to capture object creation
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
and track them.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
It uses Bytecode Instrumentation (BCI) via the java_crw_demo library.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
<A HREF="waiters">waiters</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
This is a small agent that gets information about threads
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
waiting on monitors.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
<A HREF="hprof">hprof</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
This is a large agent that does heap and cpu profiling.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
This demo agent is actually built into the 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
Java Runtime Environment (JRE).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
It uses Bytecode Instrumentation (BCI) via the java_crw_demo library.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
<b>Note:</b> hprof is NOT a small or simple agent, the other smaller demos
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
should be looked at first.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
</ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
<h2>Agent Support</h2>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
<ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
<A HREF="java_crw_demo">java_crw_demo</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
This is a demo C library that does class file to class file
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
transformations or BCI (Bytecode Instrumentation).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
It is used by several of the above agents.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
</ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
<h2>Native Library Build Hints</h2>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
All libraries loaded into java are assumed to be MT-safe (Multi-thread safe).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
This means that multiple threads could be executing the code at the same
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
time, and static or global data may need to be placed in critical
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
sections. See the Raw Monitor interfaces for more information.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
All native libraries loaded into the 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
Java Virtual Machine,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
including Agent libraries,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
need to be compiled and built in a compatible way.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
Certain native compilation options or optimizations should be avoided,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
and some are required.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
More information on this options is available in the man pages for
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
the various compilers.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
Some native compiler and linker options can create fatal or 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
erroneous behavior when native agent libraries are operating
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
inside the Java Virtual Machine.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
It would take too many words to describe all the possible issues with all
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
the native compiler options, optimizations, and settings.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
Here are some recommendations on the basic compiler and linker options
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
we recommend:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
<ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
<h3> Solaris </h3>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
On Solaris, using the Sun Studio 11 C compiler,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
the typical compile and link command lines might look something like:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
For 32bit SPARC:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
<code><ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
cc -xO2 -mt -xregs=no%appl -xmemalign=4s -xarch=v8 -KPIC -c <i>*.c</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
cc -mt -xarch=v8 -z defs -ztext -G -o <i>libXXX.so *.o</i> -lc
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
</code></ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
For 64bit SPARC:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
<code><ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
cc -xO2 -mt -xregs=no%appl -xarch=v9 -KPIC -c <i>*.c</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
cc -mt -xarch=v9 -z defs -ztext -G -o <i>libXXX.so *.o</i> -lc
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
</code></ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
For X86:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
<code><ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
cc -xO2 -mt -xregs=no%frameptr -KPIC -c <i>*.c</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
cc -mt -z defs -ztext -G -o <i>libXXX.so *.o</i> -lc
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
</code></ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
For AMD64:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
<code><ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
cc -xO2 -mt -xregs=no%frameptr -xarch=amd64 -KPIC -c <i>*.c</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
cc -mt -xarch=amd64 -z defs -ztext -G -o <i>libXXX.so *.o</i> -lc
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
</code></ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
Architecture/File Format: 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
For SPARC 32bit use <code>-xarch=v8</code>, 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
for SPARC 64bit use <code>-xarch=v9</code>, 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
for X86 (32-bit) 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
<i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
leave the option off or use <code>-xarch=generic</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
</i>,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
and for AMD64 (64bit) use <code>-xarch=amd64</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
with both C and C++.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
This is to be specific as to the architecture and the file format
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
of the .o files (and ultimately of the .so). 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
MT-Safe, Position Independent: Use <code>-KPIC -mt</code> 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
with both C and C++.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
Register usage: For SPARC (both 32bit and 64bit) use 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
<code>-xregs=no%appl</code> and for X86 and AMD64 use <code>-xregs=no%frameptr</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
with both C and C++.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
Alignment: For SPARC 32bit use -xmemalign=4s and for SPARC 64bit do NOT use <code>-xmemalign=4</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
with both C and C++.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
Dependencies: Use <code>ldd -r <i>LibraryName</i></code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
After the shared library has been built, the utility
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
<code>ldd</code> can be used to verify that all dependent libraries 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
have been satisfied, and all externs can be found.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
If <code>ldd</code> says anything is missing, it is very likely that the JVM will also
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
be unable to load this library.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
This usually means that you missed some <code>-l<i>name</i></code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
options when building the library, or perhaps forgot a <code>-R path</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
option that tells the library where to look for libraries at runtime.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
<h3> Linux </h3>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
On Linux, using the gcc version 3.2, 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
the typical compile and link command lines might look something like:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
For X86:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
<code><ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
gcc -O2 -fPIC -pthread -DLINUX -c <i>*.c</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
gcc -z defs -static-libgcc -shared -mimpure-text -o <i>libXXX.so *.o</i> -lc
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
</code></ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
For AMD64:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
<code><ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
gcc -O2 -fPIC -pthread -DLINUX -D_LP64=1 -c <i>*.c</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
gcc -z defs -static-libgcc -shared -mimpure-text -o <i>libXXX.so *.o</i> -lc
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
</code></ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
MT-Safe, Position Independent: 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
Use <code>-fPIC -pthread</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
Agent Demo Code: Needs -DLINUX
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
Register Usage: Use <code>-fno-omit-frame-pointer</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
It is important that these libraries have frame pointer register usage, see the above comments on the Solaris 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
<code>-xregs=no%frameptr</code>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
option.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
Library: Use -static-libgcc -mimpure-text.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
When building the shared library (-shared option), this option
90ce3da70b43 Initial load
duke
parents:
diff changeset
   338
allows for maximum portability of the library between different
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
flavors of Linux.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
The problem we have seen with Linux is that we cannot depend
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
on a compatible shared gcc library existing on all the versions of
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
Linux we can run on.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
By doing this static link, the version script becomes more
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
important, making sure you don't expose any extern symbols
90ce3da70b43 Initial load
duke
parents:
diff changeset
   345
you didn't intend to.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   347
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
Dependencies: Use <code>ldd -r <i>LibraryName</i></code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
Provides the same checking as Solaris (see above).
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
<h3> Windows </h3>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
On Windows and using the Microsoft C++ Compiler Visual Studio .NET 2003,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
the typical compile and link command lines might look something like:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
For X86:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
<code><ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   363
cl /O1 /MD /D _STATIC_CPPLIB /c <i>*.c</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   365
link /dll /opt:REF /out:<i>XXX.dll *.obj</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
</code></ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
For AMD64:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   370
<code><ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
cl /O1 /MD /D _STATIC_CPPLIB /c <i>*.c</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
link /dll /opt:REF /out:<i>XXX.dll *.obj</i>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
</code></ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   379
Library: Use <code>/opt:REF </code> when building the dll.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
MS DLL Runtime: Use the <code>/MD /D _STATIC_CPPLIB</code> option.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
This causes your dll to become dependent on MSVCRT.DLL and/or 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
the newer C++ runtime MSVCR71.DLL.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
The option /D _STATIC_CPPLIB prevents you from becoming dependent on the
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
C++ library MSVCP71.DLL.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
This is what we use in the JDK, but there are probably many combinations
90ce3da70b43 Initial load
duke
parents:
diff changeset
   390
that you could safely use, unfortunately there are many combinations
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
of runtimes that will not work. 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
Check the Microsoft site on proper use of runtimes.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
<li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
Dependencies: Use VC++ <code>dumpbin /exports</code> and the VC++ "Dependency Walker".
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
<br>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
Provides dependency information similar to <code>ldd</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   399
</li>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
90ce3da70b43 Initial load
duke
parents:
diff changeset
   401
</ul>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   402
90ce3da70b43 Initial load
duke
parents:
diff changeset
   403
90ce3da70b43 Initial load
duke
parents:
diff changeset
   404
<h2>For More Information</h2>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   405
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
Remember, the complete source to all these agents is contained in the JDK
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
installations at demo/jvmti.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
For more detailed information on JVM TI, refer to 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
<A HREF="http://java.sun.com/j2se/latest/docs/guide/jvmti">
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
http://java.sun.com/j2se/latest/docs/guide/jvmti.</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
More information on using JNI and building native libraries refer to:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
<A HREF="http://java.sun.com/j2se/latest/docs/guide/jni">
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
http://java.sun.com/j2se/latest/docs/guide/jni</A>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
Additional information can also be found by doing a search on "jvmti" at
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
<A HREF="http://java.sun.com/j2se">http://java.sun.com/j2se</A>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
Various technical articles are also available through this website.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
And don't forget the 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
Java Tutorials at 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
<A HREF="http://java.sun.com/docs/books/tutorial">http://java.sun.com/docs/books/tutorial</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
for getting a quick start on all the various interfaces.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
<h2>Comments and Feedback</h2>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
<p>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
Comments regarding JVM TI or on any of these demonstrations should be
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
sent through 
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
<A HREF="http://java.sun.com/mail">http://java.sun.com/mail/</A>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
</html>