You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2006/08/05 21:00:35 UTC
svn commit: r429033 - in /incubator/harmony/standard/site:
docs/subcomponents/drlvm/ xdocs/subcomponents/drlvm/
Author: geirm
Date: Sat Aug 5 12:00:34 2006
New Revision: 429033
URL: http://svn.apache.org/viewvc?rev=429033&view=rev
Log:
HARMONY-626
Debugging guide for DRLVM JIT and VM
Also tweaked index page to not point at JIRA for it
Added:
incubator/harmony/standard/site/docs/subcomponents/drlvm/debugging_VM_and_JIT.html
incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.html (with props)
incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.xml
Modified:
incubator/harmony/standard/site/docs/subcomponents/drlvm/index.html
incubator/harmony/standard/site/xdocs/subcomponents/drlvm/index.xml
Added: incubator/harmony/standard/site/docs/subcomponents/drlvm/debugging_VM_and_JIT.html
URL: http://svn.apache.org/viewvc/incubator/harmony/standard/site/docs/subcomponents/drlvm/debugging_VM_and_JIT.html?rev=429033&view=auto
==============================================================================
--- incubator/harmony/standard/site/docs/subcomponents/drlvm/debugging_VM_and_JIT.html (added)
+++ incubator/harmony/standard/site/docs/subcomponents/drlvm/debugging_VM_and_JIT.html Sat Aug 5 12:00:34 2006
@@ -0,0 +1,1184 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+
+<!--
+Copyright 1999-2004 The Apache Software Foundation
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+
+<!-- Content Stylesheet for Site -->
+
+
+<!-- start the processing -->
+ <!-- ====================================================================== -->
+ <!-- GENERATED FILE, DO NOT EDIT, EDIT THE XML FILE IN xdocs INSTEAD! -->
+ <!-- Main Page Section -->
+ <!-- ====================================================================== -->
+ <html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
+
+ <meta name="author" value="Harmony Documentation Team">
+ <meta name="email" value="harmony-dev@incubator.apache.org">
+
+
+
+
+
+
+
+ <title>Apache Harmony - Debugging VM and JIT</title>
+
+ <link rel="Stylesheet" type="text/css" href="drl.css" />
+
+ </head>
+
+ <body bgcolor="#ffffff" text="#000000" link="#525D76">
+ <table border="0" width="100%" cellspacing="0">
+ <!-- TOP IMAGE -->
+ <tr>
+ <td align='LEFT'>
+ <table><tr><td>
+ <td align="left">
+<a href="http://incubator.apache.org/harmony/"><img src="../../images/harmony-logo.png" alt="Apache Harmony" border="0"/></a>
+</td>
+</td>
+ </td></tr></table>
+ </td>
+ <td align='RIGHT'>
+ <a href="http://incubator.apache.org/harmony/">
+ <img src="http://incubator.apache.org/harmony/images/apache-incubator-logo.png"
+ alt="Apache Harmony" border="0"/></a>
+ </td>
+ </tr>
+ </table>
+ <table border="0" width="100%" cellspacing="4">
+ <tr><td colspan="2">
+ <hr noshade="" size="1"/>
+ </td></tr>
+
+ <tr>
+ <!-- LEFT SIDE NAVIGATION -->
+ <td width="20%" valign="top" nowrap="true">
+
+ <!-- special ACon Logo - leave here for next time -->
+ <a href="http://www.asia.apachecon.com/">
+ <img src="http://www.apache.org/ads/ApacheCon/234x60-2006-asia.gif"
+ border="0" alt="ApacheCon Asia 2006" />
+ </a>
+
+ <!-- regular menu -->
+
+
+ <!-- ============================================================ -->
+
+ <p><strong>General</strong></p>
+ <ul>
+ <li> <a href="../../index.html">Home</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../license.html">License</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../contribution_policy.html">Contribution Policy</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../guidelines.html">Project Guidelines</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="http://www.apache.org/">ASF</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../downloads.html">Downloads</a>
+</li>
+
+ <table>
+ </table>
+ </ul>
+ <p><strong>Community</strong></p>
+ <ul>
+ <li> <a href="../../get-involved.html">Get Involved</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../contributors.html">Committers</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../mailing.html">Mailing Lists</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../documentation/documentation.html">Documentation</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../faq.html">FAQ</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="http://wiki.apache.org/harmony">Wiki</a>
+</li>
+
+ <table>
+ </table>
+ </ul>
+ <p><strong>Development</strong></p>
+ <ul>
+ <li> <a href="../../status.html">How Are We Doing?</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../roadmap.html">Road Map / TODO</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../svn.html">Source Code</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="http://issues.apache.org/jira/browse/HARMONY">JIRA</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../related.html">Other Projects</a>
+</li>
+
+ <table>
+ </table>
+ </ul>
+ <p><strong>Subcomponents</strong></p>
+ <ul>
+ <li> <a href="../../subcomponents/buildtest/index.html">Build-Test Framework</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../subcomponents/classlibrary/index.html">Class Library</a>
+</li>
+
+ <table>
+ <tr><td>
+ <a href="../../subcomponents/classlibrary/status.html">Status</a>
+ </td></tr>
+ </table>
+ <li> <a href="../../subcomponents/drlvm/index.html">DRLVM</a>
+</li>
+
+ <table>
+ </table>
+ <li> <a href="../../subcomponents/jchevm/index.html">JCHEVM</a>
+</li>
+
+ <table>
+ </table>
+ </ul>
+ </td>
+ <td width="80%" align="left" valign="top">
+
+ <div>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=windows-1251">
+ <title>
+ Debugging DRL Virtual Machine and JIT Compiler
+ </title>
+ </head>
+ <body>
+ <h1>
+ <a name="top"></a>Debugging the DRL Virtual Machine and the
+ JIT Compiler
+ </h1>
+ <p>
+ This document gives practical instructions on how to debug
+ the DRL virtual machine and its baseline just-in-time
+ compiler Jitrino.JET. For a definition of components and
+ details on their internal structure, consult the <i>DRL
+ Virtual Machine Developer’s Guide</i> supplied with
+ the DRLVM image.
+ </p>
+ <p>
+ The document includes two groups of debugging tips, one for
+ VM tips, and the other for JIT compiler tips, as shown
+ below.
+ </p>
+ <p>
+ <a href="#Disclaimer">Disclaimer and Legal Information</a>
+ </p>
+ <p>
+ <a href="#Debugging_VM">Debugging the Virtual Machine</a>
+ </p>
+ <blockquote>
+ <p>
+ <a href="#How_to_debug_VM">How to debug the VM?</a>
+ </p>
+ <p>
+ <a href="#Extended_Debug_VM">How to get more of your
+ debugging?</a>
+ </p>
+ </blockquote>
+ <p>
+ <a href="#Debugging_JIT">Debugging the Jitrino.JET Baseline
+ Compiler</a>
+ </p>
+ <blockquote>
+ <p>
+ <a href="#Enable_Tracing">How to enable tracing in
+ Jitrino.JET?</a>
+ </p>
+ <p>
+ <a href="#Config_Trace_Logging">How to configure trace
+ logging?</a>
+ </p>
+ <p>
+ <a href="#Extend_Trace_JIT">How to get more of your
+ tracing?</a>
+ </p>
+ </blockquote>
+ <h1>
+ <a name="Disclaimer">Disclaimer and Legal Information</a>
+ </h1>
+ <p>
+ Copyright 2006 The Apache Software Foundation or its
+ licensors, as applicable.
+ </p>
+ <p>
+ Licensed under the Apache License, Version 2.0 (the
+ License); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at <a
+ href="http://www.apache.org/licenses/LICENSE-2.0" target=
+ "_blank">http://www.apache.org/licenses/LICENSE-2.0</a>.
+ </p>
+ <p>
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ either express or implied. See the License for the specific
+ language governing permissions and limitations under the
+ License.
+ </p>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h1>
+ <a name="Debugging_VM">Debugging the Virtual Machine</a>
+ </h1>
+ <p>
+ This section gives an insight into debugging the DRL virtual
+ machine version 1.0 and provides tips on resolving
+ non-standard debugging issues.
+ </p>
+ <h2>
+ <a name="How_to_debug_VM">How to debug the VM?</a>
+ </h2>
+ <p>
+ This section gives instructions on different scenarios of
+ debugging the VM source code.
+ </p>
+ <h3>
+ Basic Debugging Steps
+ </h3>
+ <p>
+ For ordinary tests, start the ij executable with the
+ debugger enabled, as follows:
+ </p>
+ <p>
+ <strong>On Windows<a href="#*">*</a></strong>
+ </p>
+ <ol>
+ <li>
+ Start Microsoft Visual Studio<a href="#*">*</a> and open
+ the solution file <code>vm\build\vm.sln</code>.
+ </li>
+ <li>
+ Open the source code that you need to debug, set
+ breakpoints and perform all other preliminary steps.
+ </li>
+ <li>
+ Select the vmcore project and open its properties to
+ specify the location of the <code>ij</code> executable.
+ Select the <strong>Debugging</strong> tab and specify the
+ command and command arguments.
+ </li>
+ <li>
+ Copy the ZLib tool library <code>zlib1.dll</code> to the
+ location of the VM executable.
+ </li>
+ <li>
+ Start debugging via the menu <strong>Debug</strong> >
+ <strong>Start</strong>, click <strong>NO</strong> in the
+ popup dialog offering to build the project.
+ </li>
+ </ol>
+ <p>
+ <strong>On Linux<a href="#*">*</a></strong>
+ </p>
+ <ol>
+ <li>
+ Set up the <code>LD_LIBRARY_PATH</code> to point to the
+ <code>deploy/jre/bin</code> directory. Change the working
+ directory to the location of the VM executable and run:
+<pre>
+gdb ij
+</pre>
+ </li>
+ <li>
+ Set breakpoints and perform all other preliminary steps.
+ </li>
+ <li>
+ On the command line, specify debugging parameters by
+ typing:
+<pre>
+run <your_params>
+</pre>
+ </li>
+ </ol>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h3>
+ Attaching the Debugger to the Live Process
+ </h3>
+ <p>
+ To attach to the running VM process, do the following:
+ </p>
+ <p>
+ <strong>On Windows<a href="#*">*</a></strong>
+ </p>
+ <ol>
+ <li>
+ Start Visual Studio<a href="#*">*</a> .
+ </li>
+ <li>
+ Go <strong>Debug</strong> >
+ <strong>Processes</strong>.
+ </li>
+ <li>
+ Select the VM process and click
+ <strong>Attach</strong>.<br>
+ If you built the VM in the debug mode, the
+ <strong>Microsoft Debug Runtime</strong> window appears.
+ Click the <strong>Debug</strong> button to go to the
+ crash point.
+ </li>
+ </ol>
+ <p>
+ <strong>On Linux<a href="#*">*</a></strong>
+ </p>
+ <p>
+ Run:
+ </p>
+<pre>
+gdb –p <PID of ij>
+</pre>
+ <p>
+ If the VM crashed during execution, use the core dump to
+ analyze the crash:
+ </p>
+<pre>
+gdb ij core
+</pre>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h2>
+ <a name="Extended_Debug_VM">How to get more from your
+ debugging?</a>
+ </h2>
+ <p>
+ This section includes some tips on optimizing the debug
+ process and getting more debug information.
+ </p>
+ <h3>
+ Configuration of tracing
+ </h3>
+ <p>
+ Consult the <i>Getting Started</i> guide delivered with
+ DRLVM bundle for information on VM standard and non-standard
+ configuration options. Tracing-related options might be
+ useful for debugging purposes.
+ </p>
+ <h3>
+ Native stack examination
+ </h3>
+ <p>
+ The debugger might draw the stack incorrectly when the JIT
+ or native stubs are involved. To avoid this, set esp as the
+ memory location and 4-byte integer values as the output
+ format. As a result, you can examine the stack word by word
+ and look into the code for each number 0x00… by using
+ the Disassembly window.
+ </p>
+ <blockquote>
+ <p style="font-weight: bold">
+ When the VM has crashed
+ </p>
+ <p>
+ A very specific case on Windows<a href="#*">*</a>: the VM
+ has crashed and you only see the stack frame in the call
+ stack <code>0x00000000</code>. This means that the
+ program has jumped or called to a null pointer.
+ </p>
+ <p>
+ You might still get the stack trace. For that, do the
+ following:
+ </p>
+ <ol>
+ <li>
+ Open the <strong>Disassembly</strong> window.
+ </li>
+ <li>
+ Find any ret instruction with no parameters in the
+ memory space.<br>
+ Open any source file, open the context menu, and
+ select <strong>Go</strong> to
+ <strong>Disassembly</strong> to find any
+ <code>ret</code> instruction.
+ </li>
+ <li>
+ When found, select the ret instruction and click
+ <strong>Set Next Statement</strong> in the context
+ menu.
+ </li>
+ <li>
+ Type <code>F11</code> to go a single instruction.<br>
+ You may see several instructions near the current
+ point of execution. If you see a call instruction, you
+ have found an appropriate call site and you can see
+ the call stack in the <strong>Call Stack</strong>
+ window. If you have found a wrong call site, repeat
+ the instruction from step 2.
+ </li>
+ </ol>
+ </blockquote>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h3>
+ Java<a href="#*">*</a> stack examination
+ </h3>
+ <p>
+ <strong>On Windows<a href="#*">*</a></strong>
+ </p>
+ <p>
+ Running the VM in the interpreter mode, you can get Java<a
+ href="#*">*</a> methods stack trace almost at any point of
+ execution. For that, break the execution of the VM and
+ select the <strong>Interpreter</strong> frame in the Visual
+ Studio<a href="#*">*</a> <strong>Call Stack</strong> window.
+ Then, in the watch window, add the watch
+ <code>stack_dump()</code>. The stack dump appears in VM
+ output window. Running the VM in the JIT mode, use the
+ <code>st_print()</code> function for the same purpose.
+ </p>
+ <p>
+ <strong>On Linux<a href="#*">*</a></strong>
+ </p>
+ <p>
+ Use the <code>gdb</code> command print and specify the
+ <code>stack_dump</code> or <code>st_print</code> in the
+ interpreter or the JIT compiler mode respectively.
+ </p>
+ <h3>
+ Setting smart breakpoints
+ </h3>
+ <p>
+ <strong>On Windows<a href="#*">*</a> / IA-32</strong>
+ </p>
+ <p>
+ Place breakpoints in source code by inserting calls to the
+ _CrtDbgBreak() function. Placing the call inside a condition
+ calls the function only for the specified case you need to
+ debug. Analogously, you can use the Windows<a href=
+ "#*">*</a> API function DebugBreak() or print INT 3.
+ </p>
+ <p>
+ <strong>Note</strong><br>
+ This requires recompiling the VM.
+ </p>
+ <p>
+ <strong>On Linux<a href="#*">*</a></strong>
+ </p>
+ <p>
+ Run the following:
+ </p>
+<pre>
+__asm {int 3}
+</pre>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h3>
+ Handling Java<a href="#*">*</a> threads as native threads
+ </h3>
+ <p>
+ DRL VM has 1:1 mapping between native threads visible in the
+ debugger and Java<a href="#*">*</a> threads.<br>
+ To work with Java<a href="#*">*</a> threads individually,
+ freeze the threads you do not need with the help of the
+ debugger, and continue execution of other threads.
+ </p>
+ <h3>
+ Debugging deadlocks with the CriticalSection synchronization
+ primitive
+ </h3>
+ <p>
+ The <code>CriticalSection</code> primitive is a common cause
+ of deadlocks. If the code has stopped at a critical section,
+ you can try to find the thread that owns this primitive.
+ </p>
+ <p>
+ <strong>On Windows<a href="#*">*</a></strong>
+ </p>
+ <p>
+ The file WinNT.H located in <PlatformSDK>\Include
+ contains the definition for the structure
+ _RTL_CRITICAL_SECTION, which contains the description of the
+ CriticalSection primitive. You can get the owning thread for
+ the CriticalSection primitive in a number of ways, as
+ indicated below.
+ </p>
+ <blockquote>
+ <p>
+ <strong>Lookup in Memory</strong>
+ </p>
+ <p>
+ On Windows<a href="#*">*</a>
+ </p>
+ <p>
+ While debugging the code in Visual Studio, do the
+ following:
+ </p>
+ <ol>
+ <li>
+ Go <strong>Debug</strong> >
+ <strong>Windows</strong> > <strong>Memory
+ 1</strong>.
+ </li>
+ <li>
+ In the address line, enter the address of the critical
+ section.
+ </li>
+ <li>
+ Open the context menu and select 4-byte Integers. This
+ sets the fourth DWORD from the beginning of the
+ critical section as the owning thread ID in
+ hexadecimal representation.
+ </li>
+ </ol>
+ <p>
+ <strong>Note</strong><br>
+ Visual Studio<a href="#*">*</a> displays thread IDs
+ in decimal representation.
+ </p>
+ </blockquote>
+ <blockquote>
+ <strong>In the watch window</strong>
+ <p>
+ In the watch window of Visual Studio<a href="#*">*</a>,
+ insert the following:
+ </p>
+<pre>
+* ((int* )<cs-ptr>+3)
+</pre>
+ <p>
+ Where <code><cs-ptr></code> is the address of your
+ critical section
+ </p>
+ </blockquote>
+ <p>
+ <strong>On Linux<a href="#*">*</a></strong>
+ </p>
+ <p>
+ The file <code>/usr/include/bits/pthreadtypes.h</code>
+ contains the description of the <code>pthread_mutex_t</code>
+ type. To get the ID of the thread owning the
+ <code>CriticalSection</code> primitive, in gdb execute:
+ </p>
+<pre>
+x/4w <address of your mutex primitive>
+</pre>
+ <p>
+ The third word in the output contains the owning thread
+ descriptor you are looking for.
+ </p>
+ <h3>
+ Getting a class name for an object
+ </h3>
+ <p>
+ You can often need to find out the class name for a Java<a
+ href="#*">*</a> object used in VM code. For example, you may
+ need to get the class name for an object of the type
+ <code>ManagedObject *</code> (which is a direct pointer to
+ the heap). For that, insert the following expression into
+ the watch window in Visual Studio on Windows<a href=
+ "#*">*</a> or print the command of <code>gdb</code> on
+ Linux<a href="#*">*</a> :
+ </p>
+ <code>((VTable*)(*((int
+ *)obj)))->clss->name->bytes</code>
+ <p>
+ Variables of the types jobject and
+ <code>Object_Handle</code> are references to
+ <code>ManagedObject *</code> types. These structures contain
+ a single element, a pointer to <code>ManagedObject *</code>
+ type object. To use the expression above, de-reference the
+ variable, for example, substituting <code>obj</code> in the
+ expression above with a cast to <code>(ManagedObject
+ *)(*(int *)obj)</code>.
+ </p>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h1>
+ <a name="Debugging_JIT"></a>Debugging the Jitrino.JET
+ Baseline Compiler
+ </h1>
+ <p>
+ To use debugging and tracing in Jitrino.JET, use the debug
+ build or the release build with the <code>JET_PROTO</code>
+ macro defined. See the file <code>jdefs.h</code> for a
+ definition of the available flags.
+ </p>
+ <h2>
+ <a name="Enable_Tracing"></a>How to enable tracing in
+ Jitrino.JET?
+ </h2>
+ <p>
+ Currently, Jitrino.JET provides no interface or command line
+ to control tracing options. To enable tracing, set the
+ <code>compile_flags</code> variable at the entry point to
+ the method <code>Compiler::compile()</code>. At that point,
+ the global variable <code>Compiler::g_methodsSeen</code>
+ contains the ID of the method being compiled, and the
+ instance variable <code>m_fname</code> contains its fully
+ qualified name with no signature. Obtain these options
+ through a call to
+ <code>Compiler::m_infoBlock.get_flags()</code>.
+ </p>
+ <h2>
+ <a name="Config_Trace_Logging"></a>How to configure trace
+ logging?
+ </h2>
+ <p>
+ Tracing flags control compilation results output and trace
+ run-time execution, as described below. Tracing results are
+ created in each run in the directory where the
+ <code>ij</code> executable starts: compilation results are
+ in <code>jet.log</code>, and run-time output is in
+ <code>jet.rt.log</code>.
+ </p>
+ <h3>
+ Group 1: Compilation Results Tracing
+ </h3>
+ <p>
+ The following flags control tracing compilation of a method:
+ </p>
+ <ul>
+ <li>
+ <strong><code>DBG_TRACE_SUMM</code></strong> prints a
+ short summary about the compiled method: the compilation
+ status (success or failure), the name, signature,
+ bytecode size, the start and end addresses of the
+ generated code, and the compilation ID (the sequential
+ number of the method compiled by Jitrino.JET).
+ </li>
+ <li>
+ <code><strong>DBG_DUMP_BBS</strong></code> dumps the
+ bytecode and marks up basic blocks boundaries.
+ </li>
+ <li>
+ <code><strong>DBG_TRACE_CG</strong></code> prints
+ information about each compiled bytecode instruction: the
+ state of the Java<a href="#*">*</a> operand stack before
+ the instruction, the known state of local variables at
+ the given point, and the native code generated for the
+ instruction. The order instructions appear in the log
+ file is the depth-first order, the same as when
+ processing instructions during compilation. See the file
+ trace.cpp, function <code>toStr2()</code> for the legend
+ of the operand stack items print-out.
+ </li>
+ <li>
+ <strong><code>DBG_TRACE_LAYOUT</code></strong> prints the
+ results of the code layout, mostly, the address ranges
+ for the basic blocks.
+ </li>
+ <li>
+ <strong><code>DBG_DUMP_CODE</code></strong> dumps
+ generated code for the given method, the method’s
+ actual addresses, intermixed with appropriate bytecode
+ instructions.
+ <p>
+ <strong>Note</strong><br>
+ For <code>DBG_DUMP_CODE</code> and
+ <code>DBG_TRACE_CG</code>, Jitrino.JET can print
+ disassembled code in addition to raw hexadecimal
+ dumps. For that, the compiler requires an external
+ disassembler. Currently, Jitrino.JET is configured to
+ use the external library
+ <code>lwdis.dll/liblwdis.so</code> that must be
+ located in the same directory as
+ <code>jitrino.dll/libjitrino.so</code>. The name lwdis
+ stands for light weight disassembler. The library must
+ export the function <code>disasm()</code>. Refer to
+ the file trace.cpp, the <code>DISFUNC</code>
+ definition for details on calling convention and
+ signature.
+ </p>
+ </li>
+ <li>
+ <strong><code>DBG_CHECK_STACK</code></strong> prints
+ nothing but instruments code to check stack integrity.
+ The methods compiled by Jitrino.JET use EBP-based frames.
+ These frames can mask errors, for example, wrong
+ convention usage with a VM helper call. Using this option
+ performs run-time checks and INT3 raised in case the
+ stack integrity broken.
+ </li>
+ <li>
+ <strong><code>DBG_BRK</code></strong> inserts INT3 at the
+ method entry point, so it can be stopped in the debugger.
+
+ <p>
+ <strong> Note</strong><br>
+ An instance variable of class
+ <code>Compiler</code>, <code>dbg_break_pc</code> can
+ be used to insert <code>INT3</code> at the specified
+ program counter of a method.
+ </p>
+ </li>
+ </ul>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h3>
+ Group 2: Run-time Execution tracing
+ </h3>
+ <p>
+ The following flags trace run-time life of the method:
+ </p>
+ <ul class="noindent">
+ <li>
+ <strong><code>DBG_TRACE_EE</code></strong> prints
+ entering: <code><method-name></code> and exiting:
+ <code><method-name></code> at the method entrance
+ and exit points.<br>
+ <br>
+ </li>
+ <li>
+ <strong><code>DBG_TRACE_BC</code></strong> traces
+ execution of every bytecode instruction by printing a
+ string of the following format before executing the
+ instruction: <code><method-name> @
+ PC=<pc></code><br>
+ <br>
+ </li>
+ </ul>
+ <p>
+ <strong> Notes</strong>
+ </p>
+ <p>
+ The output string for <code>DBG_TRACE_EE</code> and
+ <code>DBG_TRACE_BC</code> uses a specific format: before the
+ string, an estimated call depth is printed and the string
+ gets indentation based on the call depth. After the string,
+ the string ID is printed. The estimated call depth may help
+ to identify where a method was called from. The string ID
+ can be helpful for setting a conditional breakpoint in the
+ debugger for a complex scenario. For that, set a condition
+ for the static variable cnt in the function
+ <code>rt_dbg</code>, file <code>trace.cpp</code>.
+ </p>
+ <p class="Notetext">
+ Turning on the option <code>DBG_TRACE_BC</code> may slow
+ down execution extremely and may result to a gigantic file
+ <code>jet.rt.log</code>.
+ </p>
+ <ul class="noindent">
+ <li>
+ <strong><code>DBG_TRACE_RT</code></strong> traces
+ run-time support calls, for example, getting address of
+ ‘this’, support for root set enumeration and
+ stack unwinding.<br>
+ <br>
+ </li>
+ </ul>
+ <p>
+ <strong> Note</strong><br>
+ The output goes to jet.log, with the address (both
+ native and PC) where the event happens, and some other info.
+ </p>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h2>
+ <a name="Extend_Trace_JIT">How to get more from your
+ tracing?</a>
+ </h2>
+ <p>
+ To identify one or more problematic methods with another
+ stable JIT compiler, use the execution manager. With this
+ technique, some methods are compiled by the stable JIT, and
+ the rest goes to the JIT being debugged. With a simple
+ binary search, you can find the problematic method rather
+ quickly.
+ </p>
+ <p>
+ <strong> Note</strong><br>
+ Try turning off parallel compilation when using this
+ technique (refer to VM’s
+ <code>-Xno_parallel_jit</code> option).
+ </p>
+ <p>
+ <b>To get details in case of a crash</b> with no adequate
+ stack trace or IP location available, turn on the option
+ DBG_TRACE_EE to see, in which method the crash happens. As
+ the second step, turn on DBG_TRACE_BC for this particular
+ method to find the exact bytecode instruction. Often, this
+ cuts the code to analyze down to 5-10 native instructions.
+ </p>
+ <p>
+ <b>To set a breakpoint and stop execution at a specific
+ point</b>, use trace.cpp:rt_dbg to break execution at the
+ specified bytecode instruction or at the entry point of the
+ specified method.
+ </p>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h3>
+ Tracing Example
+ </h3>
+ <p>
+ This is an example of code that turns on various tracing
+ scenarios. The code must be placed in the method
+ <code>Compiler::compile(</code>).
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;color:blue;">#if</span> <span style=
+ "font-family:Courier New;font-size:10.0pt;"><span style=
+ "color:blue;">defined</span>(<span style=
+ "color:black;">_DEBUG</span>) || <span style=
+ "color:blue;">defined</span>(<span style=
+ "color:black;">JET_PROTO</span>)</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ Turns on a short summary of all methods</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;">DBG_TRACE_SUMM</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> // A
+ handy constant</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> static</span> <span style=
+ "color:blue;">const</span> <span style=
+ "color:blue;">unsigned</span> <span style=
+ "color:black;">TRACE_CG</span> = <span style=
+ "color:black;">DBG_DUMP_BBS</span> | <span style=
+ "color:black;">DBG_TRACE_CG</span> |</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> DBG_TRACE_LAYOUT</span>
+ | <span style="color:black;">DBG_TRACE_SUMM</span> |</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> DBG_DUMP_CODE</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> // For
+ methods in the range (1000;15000), print out the complete
+ code generator dumps</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (<span style=
+ "color:black;">g_methodsSeen</span>>1000 && <span
+ style="color:black;">g_methodsSeen</span><15000) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;">TRACE_CG</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> // For
+ methods getSomeValue() and for all methods in class
+ MyClass,</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ trace enter and exit</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (<span style=
+ "color:black;">NULL</span> != <span style=
+ "color:black;">strstr</span>(<span style=
+ "color:black;">m_fname</span>, "::getSomeValue") ||</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> NULL</span> != <span style=
+ "color:black;">strstr</span>(<span style=
+ "color:black;">m_fname</span>, "MyClass::") ) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;"> DBG_TRACE_EE</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> // For
+ the method crashes_some_times() in class MyClass trace
+ every</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ bytecode execution: the last bytecode in the log is the most
+ probable</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ cause of the failure</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (!<span style=
+ "color:black;">strcmp</span>(<span style=
+ "color:black;">m_fname</span>,
+ "MyClass::crashes_some_times")) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;">DBG_TRACE_EE</span>|<span style=
+ "color:black;">DBG_TRACE_BC</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ Break into debugger (INT3) at the entry of the
+ stop_at_entry() method</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (!<span style=
+ "color:black;">strcmp</span>(<span style=
+ "color:black;">m_fname</span>, "MyClass::stop_at_entry"))
+ {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;">DBG_BRK</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ Break into debugger (INT3) inside the method</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (!<span style=
+ "color:black;">strcmp</span>(<span style=
+ "color:black;">m_fname</span>,
+ "MyClass::stop_somewhere_in_the_middle")) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> dbg_break_pc</span> = 50;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ Trace run-time support calls: unwind, getting the address of
+ 'this', root</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> // set
+ enumeration</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (!<span style=
+ "color:black;">strcmp</span>(<span style=
+ "color:black;">m_fname</span>,
+ "MyClass::something_wrong_with_unwind_here")) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;">DBG_TRACE_RT</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ By-pass run-time tracing for java/* classes</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (<span style=
+ "color:black;">m_fname</span> == <span style=
+ "color:black;">strstr</span>(<span style=
+ "color:black;">m_fname</span>, "java/")) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> &= ~(<span
+ style="color:black;">DBG_TRACE_EE</span>|<span style=
+ "color:black;">DBG_TRACE_BC</span>);</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;color:blue;">#endif</span>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <p>
+ <a name="*"></a>* Other brands and names are the property of
+ their respective owners.
+ </p>
+ </body>
+</html>
+
+</div>
+ </td>
+ </tr>
+
+ <!-- FOOTER -->
+ <tr><td colspan="2">
+ <hr noshade="" size="1"/>
+ </td></tr>
+ <tr><td colspan="2">
+ <div align="center"><font color="#525D76" size="-1"><em>
+ Copyright © 2003-2006, The Apache Software Foundation
+ </em></font></div>
+ </td></tr>
+ </table>
+ </body>
+ </html>
+<!-- end the processing -->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Modified: incubator/harmony/standard/site/docs/subcomponents/drlvm/index.html
URL: http://svn.apache.org/viewvc/incubator/harmony/standard/site/docs/subcomponents/drlvm/index.html?rev=429033&r1=429032&r2=429033&view=diff
==============================================================================
--- incubator/harmony/standard/site/docs/subcomponents/drlvm/index.html (original)
+++ incubator/harmony/standard/site/docs/subcomponents/drlvm/index.html Sat Aug 5 12:00:34 2006
@@ -242,11 +242,10 @@
Building instructions for the VM source code.
</blockquote>
</li>
- <li> Debugging VM and JIT
+ <li> <a href="debugging_VM_and_JIT.html">Debugging VM and JIT</a>
<blockquote>
Guide to debugging VM and Jitrino.JET source code covering
- basic actions and some useful tips <br /> Currently,
- <a href="http://issues.apache.org/jira/browse/HARMONY-626" target="_blank">JIRA issue 626</a>
+ basic actions and some useful tips
</blockquote>
</li>
</ul>
Added: incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.html
URL: http://svn.apache.org/viewvc/incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.html?rev=429033&view=auto
==============================================================================
--- incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.html (added)
+++ incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.html Sat Aug 5 12:00:34 2006
@@ -0,0 +1,937 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content=
+ "text/html; charset=windows-1251">
+ <title>
+ Debugging DRL Virtual Machine and JIT Compiler
+ </title>
+ </head>
+ <body>
+ <h1>
+ <a name="top"></a>Debugging the DRL Virtual Machine and the
+ JIT Compiler
+ </h1>
+ <p>
+ This document gives practical instructions on how to debug
+ the DRL virtual machine and its baseline just-in-time
+ compiler Jitrino.JET. For a definition of components and
+ details on their internal structure, consult the <i>DRL
+ Virtual Machine Developer’s Guide</i> supplied with
+ the DRLVM image.
+ </p>
+ <p>
+ The document includes two groups of debugging tips, one for
+ VM tips, and the other for JIT compiler tips, as shown
+ below.
+ </p>
+ <p>
+ <a href="#Disclaimer">Disclaimer and Legal Information</a>
+ </p>
+ <p>
+ <a href="#Debugging_VM">Debugging the Virtual Machine</a>
+ </p>
+ <blockquote>
+ <p>
+ <a href="#How_to_debug_VM">How to debug the VM?</a>
+ </p>
+ <p>
+ <a href="#Extended_Debug_VM">How to get more of your
+ debugging?</a>
+ </p>
+ </blockquote>
+ <p>
+ <a href="#Debugging_JIT">Debugging the Jitrino.JET Baseline
+ Compiler</a>
+ </p>
+ <blockquote>
+ <p>
+ <a href="#Enable_Tracing">How to enable tracing in
+ Jitrino.JET?</a>
+ </p>
+ <p>
+ <a href="#Config_Trace_Logging">How to configure trace
+ logging?</a>
+ </p>
+ <p>
+ <a href="#Extend_Trace_JIT">How to get more of your
+ tracing?</a>
+ </p>
+ </blockquote>
+ <h1>
+ <a name="Disclaimer">Disclaimer and Legal Information</a>
+ </h1>
+ <p>
+ Copyright 2006 The Apache Software Foundation or its
+ licensors, as applicable.
+ </p>
+ <p>
+ Licensed under the Apache License, Version 2.0 (the
+ License); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at <a
+ href="http://www.apache.org/licenses/LICENSE-2.0" target=
+ "_blank">http://www.apache.org/licenses/LICENSE-2.0</a>.
+ </p>
+ <p>
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ either express or implied. See the License for the specific
+ language governing permissions and limitations under the
+ License.
+ </p>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h1>
+ <a name="Debugging_VM">Debugging the Virtual Machine</a>
+ </h1>
+ <p>
+ This section gives an insight into debugging the DRL virtual
+ machine version 1.0 and provides tips on resolving
+ non-standard debugging issues.
+ </p>
+ <h2>
+ <a name="How_to_debug_VM">How to debug the VM?</a>
+ </h2>
+ <p>
+ This section gives instructions on different scenarios of
+ debugging the VM source code.
+ </p>
+ <h3>
+ Basic Debugging Steps
+ </h3>
+ <p>
+ For ordinary tests, start the ij executable with the
+ debugger enabled, as follows:
+ </p>
+ <p>
+ <strong>On Windows<a href="#*">*</a></strong>
+ </p>
+ <ol>
+ <li>
+ Start Microsoft Visual Studio<a href="#*">*</a> and open
+ the solution file <code>vm\build\vm.sln</code>.
+ </li>
+ <li>
+ Open the source code that you need to debug, set
+ breakpoints and perform all other preliminary steps.
+ </li>
+ <li>
+ Select the vmcore project and open its properties to
+ specify the location of the <code>ij</code> executable.
+ Select the <strong>Debugging</strong> tab and specify the
+ command and command arguments.
+ </li>
+ <li>
+ Copy the ZLib tool library <code>zlib1.dll</code> to the
+ location of the VM executable.
+ </li>
+ <li>
+ Start debugging via the menu <strong>Debug</strong> >
+ <strong>Start</strong>, click <strong>NO</strong> in the
+ popup dialog offering to build the project.
+ </li>
+ </ol>
+ <p>
+ <strong>On Linux<a href="#*">*</a></strong>
+ </p>
+ <ol>
+ <li>
+ Set up the <code>LD_LIBRARY_PATH</code> to point to the
+ <code>deploy/jre/bin</code> directory. Change the working
+ directory to the location of the VM executable and run:
+<pre>
+gdb ij
+</pre>
+ </li>
+ <li>
+ Set breakpoints and perform all other preliminary steps.
+ </li>
+ <li>
+ On the command line, specify debugging parameters by
+ typing:
+<pre>
+run <your_params>
+</pre>
+ </li>
+ </ol>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h3>
+ Attaching the Debugger to the Live Process
+ </h3>
+ <p>
+ To attach to the running VM process, do the following:
+ </p>
+ <p>
+ <strong>On Windows<a href="#*">*</a></strong>
+ </p>
+ <ol>
+ <li>
+ Start Visual Studio<a href="#*">*</a> .
+ </li>
+ <li>
+ Go <strong>Debug</strong> >
+ <strong>Processes</strong>.
+ </li>
+ <li>
+ Select the VM process and click
+ <strong>Attach</strong>.<br>
+ If you built the VM in the debug mode, the
+ <strong>Microsoft Debug Runtime</strong> window appears.
+ Click the <strong>Debug</strong> button to go to the
+ crash point.
+ </li>
+ </ol>
+ <p>
+ <strong>On Linux<a href="#*">*</a></strong>
+ </p>
+ <p>
+ Run:
+ </p>
+<pre>
+gdb –p <PID of ij>
+</pre>
+ <p>
+ If the VM crashed during execution, use the core dump to
+ analyze the crash:
+ </p>
+<pre>
+gdb ij core
+</pre>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h2>
+ <a name="Extended_Debug_VM">How to get more from your
+ debugging?</a>
+ </h2>
+ <p>
+ This section includes some tips on optimizing the debug
+ process and getting more debug information.
+ </p>
+ <h3>
+ Configuration of tracing
+ </h3>
+ <p>
+ Consult the <i>Getting Started</i> guide delivered with
+ DRLVM bundle for information on VM standard and non-standard
+ configuration options. Tracing-related options might be
+ useful for debugging purposes.
+ </p>
+ <h3>
+ Native stack examination
+ </h3>
+ <p>
+ The debugger might draw the stack incorrectly when the JIT
+ or native stubs are involved. To avoid this, set esp as the
+ memory location and 4-byte integer values as the output
+ format. As a result, you can examine the stack word by word
+ and look into the code for each number 0x00… by using
+ the Disassembly window.
+ </p>
+ <blockquote>
+ <p style="font-weight: bold">
+ When the VM has crashed
+ </p>
+ <p>
+ A very specific case on Windows<a href="#*">*</a>: the VM
+ has crashed and you only see the stack frame in the call
+ stack <code>0x00000000</code>. This means that the
+ program has jumped or called to a null pointer.
+ </p>
+ <p>
+ You might still get the stack trace. For that, do the
+ following:
+ </p>
+ <ol>
+ <li>
+ Open the <strong>Disassembly</strong> window.
+ </li>
+ <li>
+ Find any ret instruction with no parameters in the
+ memory space.<br>
+ Open any source file, open the context menu, and
+ select <strong>Go</strong> to
+ <strong>Disassembly</strong> to find any
+ <code>ret</code> instruction.
+ </li>
+ <li>
+ When found, select the ret instruction and click
+ <strong>Set Next Statement</strong> in the context
+ menu.
+ </li>
+ <li>
+ Type <code>F11</code> to go a single instruction.<br>
+ You may see several instructions near the current
+ point of execution. If you see a call instruction, you
+ have found an appropriate call site and you can see
+ the call stack in the <strong>Call Stack</strong>
+ window. If you have found a wrong call site, repeat
+ the instruction from step 2.
+ </li>
+ </ol>
+ </blockquote>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h3>
+ Java<a href="#*">*</a> stack examination
+ </h3>
+ <p>
+ <strong>On Windows<a href="#*">*</a></strong>
+ </p>
+ <p>
+ Running the VM in the interpreter mode, you can get Java<a
+ href="#*">*</a> methods stack trace almost at any point of
+ execution. For that, break the execution of the VM and
+ select the <strong>Interpreter</strong> frame in the Visual
+ Studio<a href="#*">*</a> <strong>Call Stack</strong> window.
+ Then, in the watch window, add the watch
+ <code>stack_dump()</code>. The stack dump appears in VM
+ output window. Running the VM in the JIT mode, use the
+ <code>st_print()</code> function for the same purpose.
+ </p>
+ <p>
+ <strong>On Linux<a href="#*">*</a></strong>
+ </p>
+ <p>
+ Use the <code>gdb</code> command print and specify the
+ <code>stack_dump</code> or <code>st_print</code> in the
+ interpreter or the JIT compiler mode respectively.
+ </p>
+ <h3>
+ Setting smart breakpoints
+ </h3>
+ <p>
+ <strong>On Windows<a href="#*">*</a> / IA-32</strong>
+ </p>
+ <p>
+ Place breakpoints in source code by inserting calls to the
+ _CrtDbgBreak() function. Placing the call inside a condition
+ calls the function only for the specified case you need to
+ debug. Analogously, you can use the Windows<a href=
+ "#*">*</a> API function DebugBreak() or print INT 3.
+ </p>
+ <p>
+ <strong>Note</strong><br>
+ This requires recompiling the VM.
+ </p>
+ <p>
+ <strong>On Linux<a href="#*">*</a></strong>
+ </p>
+ <p>
+ Run the following:
+ </p>
+<pre>
+__asm {int 3}
+</pre>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h3>
+ Handling Java<a href="#*">*</a> threads as native threads
+ </h3>
+ <p>
+ DRL VM has 1:1 mapping between native threads visible in the
+ debugger and Java<a href="#*">*</a> threads.<br>
+ To work with Java<a href="#*">*</a> threads individually,
+ freeze the threads you do not need with the help of the
+ debugger, and continue execution of other threads.
+ </p>
+ <h3>
+ Debugging deadlocks with the CriticalSection synchronization
+ primitive
+ </h3>
+ <p>
+ The <code>CriticalSection</code> primitive is a common cause
+ of deadlocks. If the code has stopped at a critical section,
+ you can try to find the thread that owns this primitive.
+ </p>
+ <p>
+ <strong>On Windows<a href="#*">*</a></strong>
+ </p>
+ <p>
+ The file WinNT.H located in <PlatformSDK>\Include
+ contains the definition for the structure
+ _RTL_CRITICAL_SECTION, which contains the description of the
+ CriticalSection primitive. You can get the owning thread for
+ the CriticalSection primitive in a number of ways, as
+ indicated below.
+ </p>
+ <blockquote>
+ <p>
+ <strong>Lookup in Memory</strong>
+ </p>
+ <p>
+ On Windows<a href="#*">*</a>
+ </p>
+ <p>
+ While debugging the code in Visual Studio, do the
+ following:
+ </p>
+ <ol>
+ <li>
+ Go <strong>Debug</strong> >
+ <strong>Windows</strong> > <strong>Memory
+ 1</strong>.
+ </li>
+ <li>
+ In the address line, enter the address of the critical
+ section.
+ </li>
+ <li>
+ Open the context menu and select 4-byte Integers. This
+ sets the fourth DWORD from the beginning of the
+ critical section as the owning thread ID in
+ hexadecimal representation.
+ </li>
+ </ol>
+ <p>
+ <strong>Note</strong><br>
+ Visual Studio<a href="#*">*</a> displays thread IDs
+ in decimal representation.
+ </p>
+ </blockquote>
+ <blockquote>
+ <strong>In the watch window</strong>
+ <p>
+ In the watch window of Visual Studio<a href="#*">*</a>,
+ insert the following:
+ </p>
+<pre>
+* ((int* )<cs-ptr>+3)
+</pre>
+ <p>
+ Where <code><cs-ptr></code> is the address of your
+ critical section
+ </p>
+ </blockquote>
+ <p>
+ <strong>On Linux<a href="#*">*</a></strong>
+ </p>
+ <p>
+ The file <code>/usr/include/bits/pthreadtypes.h</code>
+ contains the description of the <code>pthread_mutex_t</code>
+ type. To get the ID of the thread owning the
+ <code>CriticalSection</code> primitive, in gdb execute:
+ </p>
+<pre>
+x/4w <address of your mutex primitive>
+</pre>
+ <p>
+ The third word in the output contains the owning thread
+ descriptor you are looking for.
+ </p>
+ <h3>
+ Getting a class name for an object
+ </h3>
+ <p>
+ You can often need to find out the class name for a Java<a
+ href="#*">*</a> object used in VM code. For example, you may
+ need to get the class name for an object of the type
+ <code>ManagedObject *</code> (which is a direct pointer to
+ the heap). For that, insert the following expression into
+ the watch window in Visual Studio on Windows<a href=
+ "#*">*</a> or print the command of <code>gdb</code> on
+ Linux<a href="#*">*</a> :
+ </p>
+ <code>((VTable*)(*((int
+ *)obj)))->clss->name->bytes</code>
+ <p>
+ Variables of the types jobject and
+ <code>Object_Handle</code> are references to
+ <code>ManagedObject *</code> types. These structures contain
+ a single element, a pointer to <code>ManagedObject *</code>
+ type object. To use the expression above, de-reference the
+ variable, for example, substituting <code>obj</code> in the
+ expression above with a cast to <code>(ManagedObject
+ *)(*(int *)obj)</code>.
+ </p>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h1>
+ <a name="Debugging_JIT"></a>Debugging the Jitrino.JET
+ Baseline Compiler
+ </h1>
+ <p>
+ To use debugging and tracing in Jitrino.JET, use the debug
+ build or the release build with the <code>JET_PROTO</code>
+ macro defined. See the file <code>jdefs.h</code> for a
+ definition of the available flags.
+ </p>
+ <h2>
+ <a name="Enable_Tracing"></a>How to enable tracing in
+ Jitrino.JET?
+ </h2>
+ <p>
+ Currently, Jitrino.JET provides no interface or command line
+ to control tracing options. To enable tracing, set the
+ <code>compile_flags</code> variable at the entry point to
+ the method <code>Compiler::compile()</code>. At that point,
+ the global variable <code>Compiler::g_methodsSeen</code>
+ contains the ID of the method being compiled, and the
+ instance variable <code>m_fname</code> contains its fully
+ qualified name with no signature. Obtain these options
+ through a call to
+ <code>Compiler::m_infoBlock.get_flags()</code>.
+ </p>
+ <h2>
+ <a name="Config_Trace_Logging"></a>How to configure trace
+ logging?
+ </h2>
+ <p>
+ Tracing flags control compilation results output and trace
+ run-time execution, as described below. Tracing results are
+ created in each run in the directory where the
+ <code>ij</code> executable starts: compilation results are
+ in <code>jet.log</code>, and run-time output is in
+ <code>jet.rt.log</code>.
+ </p>
+ <h3>
+ Group 1: Compilation Results Tracing
+ </h3>
+ <p>
+ The following flags control tracing compilation of a method:
+ </p>
+ <ul>
+ <li>
+ <strong><code>DBG_TRACE_SUMM</code></strong> prints a
+ short summary about the compiled method: the compilation
+ status (success or failure), the name, signature,
+ bytecode size, the start and end addresses of the
+ generated code, and the compilation ID (the sequential
+ number of the method compiled by Jitrino.JET).
+ </li>
+ <li>
+ <code><strong>DBG_DUMP_BBS</strong></code> dumps the
+ bytecode and marks up basic blocks boundaries.
+ </li>
+ <li>
+ <code><strong>DBG_TRACE_CG</strong></code> prints
+ information about each compiled bytecode instruction: the
+ state of the Java<a href="#*">*</a> operand stack before
+ the instruction, the known state of local variables at
+ the given point, and the native code generated for the
+ instruction. The order instructions appear in the log
+ file is the depth-first order, the same as when
+ processing instructions during compilation. See the file
+ trace.cpp, function <code>toStr2()</code> for the legend
+ of the operand stack items print-out.
+ </li>
+ <li>
+ <strong><code>DBG_TRACE_LAYOUT</code></strong> prints the
+ results of the code layout, mostly, the address ranges
+ for the basic blocks.
+ </li>
+ <li>
+ <strong><code>DBG_DUMP_CODE</code></strong> dumps
+ generated code for the given method, the method’s
+ actual addresses, intermixed with appropriate bytecode
+ instructions.
+ <p>
+ <strong>Note</strong><br>
+ For <code>DBG_DUMP_CODE</code> and
+ <code>DBG_TRACE_CG</code>, Jitrino.JET can print
+ disassembled code in addition to raw hexadecimal
+ dumps. For that, the compiler requires an external
+ disassembler. Currently, Jitrino.JET is configured to
+ use the external library
+ <code>lwdis.dll/liblwdis.so</code> that must be
+ located in the same directory as
+ <code>jitrino.dll/libjitrino.so</code>. The name lwdis
+ stands for light weight disassembler. The library must
+ export the function <code>disasm()</code>. Refer to
+ the file trace.cpp, the <code>DISFUNC</code>
+ definition for details on calling convention and
+ signature.
+ </p>
+ </li>
+ <li>
+ <strong><code>DBG_CHECK_STACK</code></strong> prints
+ nothing but instruments code to check stack integrity.
+ The methods compiled by Jitrino.JET use EBP-based frames.
+ These frames can mask errors, for example, wrong
+ convention usage with a VM helper call. Using this option
+ performs run-time checks and INT3 raised in case the
+ stack integrity broken.
+ </li>
+ <li>
+ <strong><code>DBG_BRK</code></strong> inserts INT3 at the
+ method entry point, so it can be stopped in the debugger.
+
+ <p>
+ <strong> Note</strong><br>
+ An instance variable of class
+ <code>Compiler</code>, <code>dbg_break_pc</code> can
+ be used to insert <code>INT3</code> at the specified
+ program counter of a method.
+ </p>
+ </li>
+ </ul>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h3>
+ Group 2: Run-time Execution tracing
+ </h3>
+ <p>
+ The following flags trace run-time life of the method:
+ </p>
+ <ul class="noindent">
+ <li>
+ <strong><code>DBG_TRACE_EE</code></strong> prints
+ entering: <code><method-name></code> and exiting:
+ <code><method-name></code> at the method entrance
+ and exit points.<br>
+ <br>
+ </li>
+ <li>
+ <strong><code>DBG_TRACE_BC</code></strong> traces
+ execution of every bytecode instruction by printing a
+ string of the following format before executing the
+ instruction: <code><method-name> @
+ PC=<pc></code><br>
+ <br>
+ </li>
+ </ul>
+ <p>
+ <strong> Notes</strong>
+ </p>
+ <p>
+ The output string for <code>DBG_TRACE_EE</code> and
+ <code>DBG_TRACE_BC</code> uses a specific format: before the
+ string, an estimated call depth is printed and the string
+ gets indentation based on the call depth. After the string,
+ the string ID is printed. The estimated call depth may help
+ to identify where a method was called from. The string ID
+ can be helpful for setting a conditional breakpoint in the
+ debugger for a complex scenario. For that, set a condition
+ for the static variable cnt in the function
+ <code>rt_dbg</code>, file <code>trace.cpp</code>.
+ </p>
+ <p class="Notetext">
+ Turning on the option <code>DBG_TRACE_BC</code> may slow
+ down execution extremely and may result to a gigantic file
+ <code>jet.rt.log</code>.
+ </p>
+ <ul class="noindent">
+ <li>
+ <strong><code>DBG_TRACE_RT</code></strong> traces
+ run-time support calls, for example, getting address of
+ ‘this’, support for root set enumeration and
+ stack unwinding.<br>
+ <br>
+ </li>
+ </ul>
+ <p>
+ <strong> Note</strong><br>
+ The output goes to jet.log, with the address (both
+ native and PC) where the event happens, and some other info.
+ </p>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h2>
+ <a name="Extend_Trace_JIT">How to get more from your
+ tracing?</a>
+ </h2>
+ <p>
+ To identify one or more problematic methods with another
+ stable JIT compiler, use the execution manager. With this
+ technique, some methods are compiled by the stable JIT, and
+ the rest goes to the JIT being debugged. With a simple
+ binary search, you can find the problematic method rather
+ quickly.
+ </p>
+ <p>
+ <strong> Note</strong><br>
+ Try turning off parallel compilation when using this
+ technique (refer to VM’s
+ <code>-Xno_parallel_jit</code> option).
+ </p>
+ <p>
+ <b>To get details in case of a crash</b> with no adequate
+ stack trace or IP location available, turn on the option
+ DBG_TRACE_EE to see, in which method the crash happens. As
+ the second step, turn on DBG_TRACE_BC for this particular
+ method to find the exact bytecode instruction. Often, this
+ cuts the code to analyze down to 5-10 native instructions.
+ </p>
+ <p>
+ <b>To set a breakpoint and stop execution at a specific
+ point</b>, use trace.cpp:rt_dbg to break execution at the
+ specified bytecode instruction or at the entry point of the
+ specified method.
+ </p>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <h3>
+ Tracing Example
+ </h3>
+ <p>
+ This is an example of code that turns on various tracing
+ scenarios. The code must be placed in the method
+ <code>Compiler::compile(</code>).
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;color:blue;">#if</span> <span style=
+ "font-family:Courier New;font-size:10.0pt;"><span style=
+ "color:blue;">defined</span>(<span style=
+ "color:black;">_DEBUG</span>) || <span style=
+ "color:blue;">defined</span>(<span style=
+ "color:black;">JET_PROTO</span>)</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ Turns on a short summary of all methods</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;">DBG_TRACE_SUMM</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> // A
+ handy constant</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> static</span> <span style=
+ "color:blue;">const</span> <span style=
+ "color:blue;">unsigned</span> <span style=
+ "color:black;">TRACE_CG</span> = <span style=
+ "color:black;">DBG_DUMP_BBS</span> | <span style=
+ "color:black;">DBG_TRACE_CG</span> |</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> DBG_TRACE_LAYOUT</span>
+ | <span style="color:black;">DBG_TRACE_SUMM</span> |</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> DBG_DUMP_CODE</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> // For
+ methods in the range (1000;15000), print out the complete
+ code generator dumps</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (<span style=
+ "color:black;">g_methodsSeen</span>>1000 && <span
+ style="color:black;">g_methodsSeen</span><15000) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;">TRACE_CG</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> // For
+ methods getSomeValue() and for all methods in class
+ MyClass,</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ trace enter and exit</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (<span style=
+ "color:black;">NULL</span> != <span style=
+ "color:black;">strstr</span>(<span style=
+ "color:black;">m_fname</span>, "::getSomeValue") ||</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> NULL</span> != <span style=
+ "color:black;">strstr</span>(<span style=
+ "color:black;">m_fname</span>, "MyClass::") ) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;"> DBG_TRACE_EE</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> // For
+ the method crashes_some_times() in class MyClass trace
+ every</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ bytecode execution: the last bytecode in the log is the most
+ probable</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ cause of the failure</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (!<span style=
+ "color:black;">strcmp</span>(<span style=
+ "color:black;">m_fname</span>,
+ "MyClass::crashes_some_times")) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;">DBG_TRACE_EE</span>|<span style=
+ "color:black;">DBG_TRACE_BC</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ Break into debugger (INT3) at the entry of the
+ stop_at_entry() method</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (!<span style=
+ "color:black;">strcmp</span>(<span style=
+ "color:black;">m_fname</span>, "MyClass::stop_at_entry"))
+ {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;">DBG_BRK</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ Break into debugger (INT3) inside the method</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (!<span style=
+ "color:black;">strcmp</span>(<span style=
+ "color:black;">m_fname</span>,
+ "MyClass::stop_somewhere_in_the_middle")) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> dbg_break_pc</span> = 50;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ Trace run-time support calls: unwind, getting the address of
+ 'this', root</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> // set
+ enumeration</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (!<span style=
+ "color:black;">strcmp</span>(<span style=
+ "color:black;">m_fname</span>,
+ "MyClass::something_wrong_with_unwind_here")) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> |= <span style=
+ "color:black;">DBG_TRACE_RT</span>;</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style="color:green;"> //
+ By-pass run-time tracing for java/* classes</span></span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:blue;"> if</span> (<span style=
+ "color:black;">m_fname</span> == <span style=
+ "color:black;">strstr</span>(<span style=
+ "color:black;">m_fname</span>, "java/")) {</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"><span style=
+ "color:black;"> compile_flags</span> &= ~(<span
+ style="color:black;">DBG_TRACE_EE</span>|<span style=
+ "color:black;">DBG_TRACE_BC</span>);</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;"> }</span>
+ </p>
+ <p>
+ <span style="font-family:Courier
+ New;font-size:10.0pt;color:blue;">#endif</span>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ <a href="#top">Back to top</a>
+ </p>
+ <p>
+ <a name="*"></a>* Other brands and names are the property of
+ their respective owners.
+ </p>
+ </body>
+</html>
+
Propchange: incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.html
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.xml
URL: http://svn.apache.org/viewvc/incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.xml?rev=429033&view=auto
==============================================================================
--- incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.xml (added)
+++ incubator/harmony/standard/site/xdocs/subcomponents/drlvm/debugging_VM_and_JIT.xml Sat Aug 5 12:00:34 2006
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ Copyright 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+
+<document>
+
+ <properties>
+ <title>Debugging VM and JIT</title>
+ <author email="harmony-dev@incubator.apache.org">Harmony Documentation Team</author>
+<link rel="Stylesheet" type="text/css" href="drl.css"/>
+
+ </properties>
+
+ <body>
+ <docinclude name="subcomponents/drlvm/debugging_VM_and_JIT.html"/>
+
+ </body>
+</document>
Modified: incubator/harmony/standard/site/xdocs/subcomponents/drlvm/index.xml
URL: http://svn.apache.org/viewvc/incubator/harmony/standard/site/xdocs/subcomponents/drlvm/index.xml?rev=429033&r1=429032&r2=429033&view=diff
==============================================================================
--- incubator/harmony/standard/site/xdocs/subcomponents/drlvm/index.xml (original)
+++ incubator/harmony/standard/site/xdocs/subcomponents/drlvm/index.xml Sat Aug 5 12:00:34 2006
@@ -52,11 +52,10 @@
Building instructions for the VM source code.
</blockquote>
</li>
- <li> Debugging VM and JIT
+ <li> <a href="debugging_VM_and_JIT.html">Debugging VM and JIT</a>
<blockquote>
Guide to debugging VM and Jitrino.JET source code covering
- basic actions and some useful tips <br /> Currently,
- <a href="http://issues.apache.org/jira/browse/HARMONY-626" target="_blank">JIRA issue 626</a>
+ basic actions and some useful tips
</blockquote>
</li>
</ul>