<HTML>


<head>
  <title>Dalvik VM Debug Monitor</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <link href="http://www.google.com/favicon.ico" type="image/x-icon"
 rel="shortcut icon">
  <link href="../android.css" type="text/css" rel="stylesheet">
  <script language="JavaScript1.2" type="text/javascript">
function highlight(name) {
  if (document.getElementById) {
    tags              = [ 'span', 'div', 'tr', 'td' ];
    for (i in tags) {
      elements        = document.getElementsByTagName(tags[i]);
      if (elements) {
        for (j = 0; j < elements.length; j++) {
          elementName = elements[j].getAttribute("id");
          if (elementName == name) {
            elements[j].style.backgroundColor = "#C0F0C0";
          } else if (elementName && elementName.indexOf("rev") == 0) {
            elements[j].style.backgroundColor = "#FFFFFF";
          }
        }
      }
    }
  }
}
  </script>
</head>
<body onload="prettyPrint()">

<h1><a name="My_Project_"></a>Dalvik VM<br>Debug Monitor</h1>

<!-- Status is one of: Draft, Current, Needs Update, Obsolete -->
<p style="text-align:center"><strong>Status:</strong><em>Draft</em> &nbsp;
<small>(as of March 6, 2007)</small></p>
<address>
[authors]
<address>

<!-- last modified date can be different to the "Status date." It automatically
updates
whenever the file is modified. -->
<i>Modified:</i>
 <!-- this script automatically sets the modified date,you don't need to modify
it -->
    <script type=text/javascript>
        <!--
        var lm = new Date(document.lastModified);
        document.write(lm.toDateString());
        //-->
        </script>
</address>

<p><br>
<HR>

<h2>Introduction</h2>

<p>It's extremely useful to be able to monitor the live state of the
VM.  For Android, we need to monitor multiple VMs running on a device
connected through USB or a wireless network connection.  This document
describes a debug monitor server that interacts with multiple VMs, and
an API that VMs and applications can use to provide information
to the monitor.

<p>Some things we can monitor with the Dalvik Debug Monitor ("DDM"):
<ul>
    <li> Thread states.  Track thread creation/exit, busy/idle status.
    <li> Overall heap status, useful for a heap bitmap display or
    fragmentation analysis.
</ul>

<p>It is possible for something other than a VM to act as a DDM client, but
that is a secondary goal.  Examples include "logcat" log extraction
and system monitors for virtual memory usage and load average.

<p>It's also possible for the DDM server to be run on the device, with
the information presented through the device UI.  However, the initial goal
is to provide a display tool that takes advantage of desktop tools and
screen real estate.

<p>This work is necessary because we are unable to use standard JVMTI-based
tools with Dalvik.  JVMTI relies on bytecode insertion, which is not
currently possible because Dalvik doesn't support Java bytecode.

<p>The DDM server is written in the Java programming language
for portability.  It uses a desktop
UI toolkit (SWT) for its interface.


<h2>Protocol</h2>

<p>To take advantage of existing infrastructure we are piggy-backing the
DDM protocol on top of JDWP (the Java Debug Wire Protocol, normally spoken
between a VM and a debugger).  To a
non-DDM client, the DDM server just looks like a debugger.

<p>The JDWP protocol is very close to what we want to use.  In particular:
<ul>
    <li>It explicitly allows for vendor-defined packets, so there is no
    need to "bend" the JDWP spec.
    <li>Events may be posted from the VM at arbitrary points.  Such
    events do not elicit a response from the debugger, meaning the client
    can post data and immediately resume work without worrying about the
    eventual response.
    <li>The basic protocol is stateless and asynchronous.  Request packets
    from the debugger side include a serial number, which the VM includes
    in the response packet.  This allows multiple simultaneous
    conversations, which means the DDM traffic can be interleaved with
    debugger traffic.
</ul>

<p>There are a few issues with using JDWP for our purposes:
<ul>
    <li>The VM only expects one connection from a debugger, so you couldn't
    attach the monitor and a debugger at the same time.  This will be
    worked around by connecting the debugger to the monitor and passing the
    traffic through.  (We're already doing the pass-through with "jdwpspy";
    requires some management of our request IDs though.)  This should
    be more convenient than the current "guess the port
    number" system when we're attached to a device.
    <li>The VM behaves differently when a debugger is attached.  It will
    run more slowly, and any objects passed to the monitor or debugger are
    immune to GC.  We can work around this by not enabling the slow path
    until non-DDM traffic is observed.  We also want to have a "debugger
    has connected/disconnected" message that allows the VM to release
    debugger-related resources without dropping the net connection.
    <li>Non-DDM VMs should not freak out when DDM connects.  There are
    no guarantees here for 3rd-party VMs (e.g. a certain mainstream VM,
    which crashes instantly), but our older JamVM can be
    configured to reject the "hello" packet.
</ul>


<h3>Connection Establishment</h3>

<p>There are two basic approaches: have the server contact the VMs, and
have the VMs contact the server.  The former is less "precise" than the
latter, because you have to scan for the clients, but it has some
advantages.

<p>There are three interesting scenarios:
<ol>
    <li>The DDM server is started, then the USB-attached device is booted
    or the simulator is launched.
    <li>The device or simulator is already running when the DDM server
    is started.
    <li>The DDM server is running when an already-started device is
    attached to USB.
</ol>
<p>If we have the VMs connect to the DDM server on startup, we only handle
case #1.  If the DDM server scans for VMs when it starts, we only handle
case #2.  Neither handles case #3, which is probably the most important
of the bunch as the device matures.
<p>The plan is to have a drop-down menu with two entries,
"scan workstation" and "scan device".
The former causes the DDM server to search for VMs on "localhost", the
latter causes it to search for VMs on the other side of an ADB connection.
The DDM server will scan for VMs every few seconds, either checking a
range of known VM ports (e.g. 8000-8040) or interacting with some sort
of process database on the device.  Changing modes causes all existing
connections to be dropped.
<p>When the DDM server first starts, it will try to execute "adb usb"
to ensure that the ADB server is running.  (Note it will be necessary
to launch the DDM server from a shell with "adb" in the path.)  If this
fails, talking to the device will still be possible so long as the ADB
daemon is already running.

<h4>Connecting a Debugger</h4>

<p>With the DDM server sitting on the JDWP port of all VMs, it will be
necessary to connect the debugger through the DDM server.  Each VM being
debugged will have a separate port being listened to by the DDM server,
allowing you to connect a debugger to one or more VMs simultaneously.

<p>In the common case, however, the developer will only want to debug
a single VM.  One port (say 8700) will be listened to by the DDM server,
and anything connecting to it will be connected to the "current VM"
(selected in the UI).  This should allow developers to focus on a
single application, which may otherwise shift around in the ordering, without
having to adjust their IDE settings to a different port every time they
restart the device.


<h3>Packet Format</h3>

<p>Information is sent in chunks.  Each chunk starts with:
<pre>
u4   type
u4   length
</pre>
and contains a variable amount of type-specific data.
Unrecognized types cause an empty response from the client and
are quietly ignored by the server.  [Should probably return an error;
need an "error" chunk type and a handler on the server side.]

<p>The same chunk type may have different meanings when sent in different
directions.  For example, the same type may be used for both a query and
a response to the query.  For sanity the type must always be used in
related transactions.

<p>This is somewhat redundant with the JDWP framing, which includes a
4-byte length and a two-byte type code ("command set" and "command"; a
range of command set values is designated for "vendor-defined commands
and extensions").  Using the chunk format allows us to remain independent
of the underlying transport, avoids intrusive integration
with JDWP client code, and provides a way to send multiple chunks in a
single transmission unit.  [I'm taking the multi-chunk packets into
account in the design, but do not plan to implement them unless the need
arises.]

<p>Because we may be sending data over a slow USB link, the chunks may be
compressed.  Compressed chunks are written as a chunk type that
indicates the compression, followed by the compressed length, followed
by the original chunk type and the uncompressed length.  For zlib's deflate
algorithm, the chunk type is "ZLIB".

<p>Following the JDWP model, packets sent from the server to the client
are always acknowledged, but packets sent from client to server never are.
The JDWP error code field is always set to "no error"; failure responses
from specific requests must be encoded into the DDM messages.

<p>In what follows "u4" is an unsigned 32-bit value and "u1" is an
unsigned 8-bit value.  Values are written in big-endian order to match
JDWP.


<h3>Initial Handshake</h3>

<p>After the JDWP handshake, the server sends a HELO chunk to the client.
If the client's JDWP layer rejects it, the server assumes that the client
is not a DDM-aware VM, and does not send it any further DDM queries.
<p>On the client side, upon seeing a HELO it can know that a DDM server
is attached and prepare accordingly.  The VM should not assume that a
debugger is attached until a non-DDM packet arrives.

<h4>Chunk HELO (server --&gt; client)</h4>
<p>Basic "hello" message.
<pre>
u4   DDM server protocol version
</pre>


<h4>Chunk HELO (client --&gt; server, reply only)</h4>
Information about the client.  Must be sent in response to the HELO message.
<pre>
u4   DDM client protocol version
u4   pid
u4   VM ident string len (in 16-bit units)
u4   application name len (in 16-bit units)
var  VM ident string (UTF-16)
var  application name (UTF-16)
</pre>

<p>If the client does not wish to speak to the DDM server, it should respond
with a JDWP error packet.  This is the same behavior you'd get from a VM
that doesn't support DDM.


<h3>Debugger Management</h3>
<p>VMs usually prepare for debugging when a JDWP connection is established,
and release debugger-related resources when the connection drops.  We want
to open the JDWP connection early and hold it open after the debugger
disconnects.
<p>The VM can tell when a debugger attaches, because it will start seeing
non-DDM JDWP traffic, but it can't identify the disconnect.  For this reason,
we need to send a packet to the client when the debugger disconnects.
<p>If the DDM server is talking to a non-DDM-aware client, it will be
necessary to drop and re-establish the connection when the debugger goes away.
(This also works with DDM-aware clients; this packet is an optimization.)

<h4>Chunk DBGD (server --&gt; client)</h4>
<p>Debugger has disconnected.  The client responds with a DBGD to acknowledge
receipt.  No data in request, no response required.


<h3>VM Info</h3>
<p>Update the server's info about the client.

<h4>Chunk APNM (client --&gt; server)</h4>

<p>If a VM's application name changes -- possible in our environment because
of the "pre-initialized" app processes -- it must send up one of these.
<pre>
u4   application name len (in 16-bit chars)
var  application name (UTF-16)
</pre>

<h4>Chunk WAIT (client --&gt; server)</h4>

<p>This tells DDMS that one or more threads are waiting on an external
event.  The simplest use is to tell DDMS that the VM is waiting for a
debugger to attach.
<pre>
u1   reason  (0 = wait for debugger)
</pre>
If DDMS is attached, the client VM sends this up when waitForDebugger()
is called.  If waitForDebugger() is called before DDMS attaches, the WAIT
chunk will be sent up at about the same time as the HELO response.


<h3>Thread Status</h3>

<p>The client can send updates when their status changes, or periodically
send thread state info, e.g. 2x per
second to allow a "blinkenlights" display of thread activity.

<h4>Chunk THEN (server --&gt; client)</h4>

<p>Enable thread creation/death notification.
<pre>
u1   boolean (true=enable, false=disable)
</pre>
<p>The response is empty.  The client generates THCR packets for all
known threads.  (Note the THCR packets may arrive before the THEN
response.)

<h4>Chunk THCR (client --&gt; server)</h4>
<p>Thread Creation notification.
<pre>
u4   VM-local thread ID (usually a small int)
u4   thread name len (in 16-bit chars)
var  thread name (UTF-16)
</pre>

<h4>Chunk THDE (client --&gt; server)</h4>
<p>Thread Death notification.
<pre>
u4   VM-local thread ID
</pre>

<h4>Chunk THST (server --&gt; client)</h4>

<p>Enable periodic thread activity updates.
Threads in THCR messages are assumed to be in the "initializing" state.  A
THST message should follow closely on the heels of THCR.
<pre>
u4   interval, in msec
</pre>
<p>An interval of 0 disables the updates.  This is done periodically,
rather than every time the thread state changes, to reduce the amount
of data that must be sent for an actively running VM.

<h4>Chunk THST (client --&gt; server)</h4>
<p>Thread Status, describing the state of one or more threads.  This is
most useful when creation/death notifications are enabled first.  The
overall layout is:
<pre>
u4   count
var  thread data
</pre>
Then, for every thread:
<pre>
u4   VM-local thread ID
u1   thread state
u1   suspended
</pre>
<p>"thread state" must be one of:
<ul>    <!-- don't use ol, we may need (-1) or sparse -->
    <li> 1 - running (now executing or ready to do so)
    <li> 2 - sleeping (in Thread.sleep())
    <li> 3 - monitor (blocked on a monitor lock)
    <li> 4 - waiting (in Object.wait())
    <li> 5 - initializing
    <li> 6 - starting
    <li> 7 - native (executing native code)
    <li> 8 - vmwait (waiting on a VM resource)
</ul>
<p>"suspended" will be 0 if the thread is running, 1 if not.
<p>[Any reason not to make "suspended" be the high bit of "thread state"?
Do we need to differentiate suspend-by-GC from suspend-by-debugger?]
<p>[We might be able to send the currently-executing method.  This is a
little risky in a running VM, and increases the size of the messages
considerably, but might be handy.]


<h3>Heap Status</h3>

<p>The client sends what amounts to a color-coded bitmap to the server,
indicating which stretches of memory are free and which are in use.  For
compactness the bitmap is run-length encoded, and based on multi-byte
"allocation units" rather than byte counts.

<p>In the future the server will be able to correlate the bitmap with more
detailed object data, so enough information is provided to associate the
bitmap data with virtual addresses.

<p>Heaps may be broken into segments within the VM, and due to memory
constraints it may be desirable to send the bitmap in smaller pieces,
so the protocol allows the heap data to be sent in several chunks.
To avoid ambiguity, the client is required
to send explicit "start" and "end" messages during an update.

<p>All messages include a "heap ID" that can be used to differentiate
between multiple independent virtual heaps or perhaps a native heap.  The
client is allowed to send information about different heaps simultaneously,
so all heap-specific information is tagged with a "heap ID".

<h4>Chunk HPIF (server --&gt; client)</h4>
<p>Request heap info.
<pre>
u1   when to send
</pre>
<p>The "when" values are:
<pre>
0: never
1: immediately
2: at the next GC
3: at every GC
</pre>

<h4>Chunk HPIF (client --&gt; server, reply only)</h4>
<p>Heap Info.  General information about the heap, suitable for a summary
display.
<pre>
u4   number of heaps
</pre>
For each heap:
<pre>
u4   heap ID
u8   timestamp in ms since Unix epoch
u1   capture reason (same as 'when' value from server)
u4   max heap size in bytes (-Xmx)
u4   current heap size in bytes
u4   current number of bytes allocated
u4   current number of objects allocated
</pre>
<p>[We can get some of this from HPSG, more from HPSO.]
<p>[Do we need a "heap overhead" stat here, indicating how much goes to
waste?  e.g. (8 bytes per object * number of objects)]

<h4>Chunk HPSG (server --&gt; client)</h4>
<p>Request transmission of heap segment data.
<pre>
u1   when to send
u1   what to send
</pre>
<p>The "when" to send will be zero to disable transmission, 1 to send
during a GC.  Other values are currently undefined.  (Could use to pick
which part of the GC to send it, or cause periodic transmissions.)
<p>The "what" field is currently 0 for HPSG and 1 for HPSO.
<p>No reply is expected.

<h4>Chunk NHSG (server --&gt; client)</h4>
<p>Request transmission of native heap segment data.
<pre>
u1   when to send
u1   what to send
</pre>
<p>The "when" to send will be zero to disable transmission, 1 to send
during a GC.  Other values are currently undefined.
<p>The "what" field is currently ignored.
<p>No reply is expected.

<h4>Chunk HPST/NHST (client --&gt; server)</h4>
<p>This is a Heap Start message.  It tells the server to discard any
existing notion of what the client's heap looks like, and prepare for
new information.  HPST indicates a virtual heap dump and must be followed
by zero or more HPSG/HPSO messages and an HPEN.  NHST indicates a native
heap dump and must be followed by zero or more NHSG messages and an NHEN.

<p>The only data item is:
<pre>
u4   heap ID
</pre>

<h4>Chunk HPEN/NHEN (client --&gt; server)</h4>
<p>Heap End, indicating that all information about the heap has been sent.
A HPST will be paired with an HPEN and an NHST will be paired with an NHEN.

<p>The only data item is:
<pre>
u4   heap ID
</pre>

<h4>Chunk HPSG (client --&gt; server)</h4>
<p>Heap segment data.  Each chunk describes all or part of a contiguous
stretch of heap memory.
<pre>
u4   heap ID
u1   size of allocation unit, in bytes (e.g. 8 bytes)
u4   virtual address of segment start
u4   offset of this piece (relative to the virtual address)
u4   length of piece, in allocation units
var  usage data
</pre>
<p>The "usage data" indicates the status of each allocation unit.  The data
is a stream of pairs of bytes, where the first byte indicates the state
of the allocation unit, and the second byte indicates the number of
consecutive allocation units with the same state.
<p>The bits in the "state" byte have the following meaning:
<pre>
+---------------------------------------+
|  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
+---------------------------------------+
|  P | U0 | K2 | K1 | K0 | S2 | S1 | S0 |
+---------------------------------------+
</pre>
<ul>
    <li>'S': solidity
    <ul>
        <li>0=free
        <li>1=has hard reference
        <li>2=has soft reference
        <li>3=has weak reference
        <li>4=has phantom reference
        <li>5=pending finalization
        <li>6=marked, about to be swept
    </ul>
    <li>'K': kind
    <ul>
        <li>0=object
        <li>1=class object
        <li>2=array of byte/boolean
        <li>3=array of char/short
        <li>4=array of Object/int/float
        <li>5=array of long/double
    </ul>
    <li>'P': partial flag (not used for HPSG)
    <li>'U': unused, must be zero
</ul>

<p>The use of the various 'S' types depends on when the information is
sent.  The current plan is to send it either immediately after a GC,
or between the "mark" and "sweep" phases of the GC.  For a fancy generational
collector, we may just want to send it up periodically.

<p>The run-length byte indicates the number of allocation units minus one, so a
length of 255 means there are 256 consecutive units with this state.  In
some cases, e.g. arrays of bytes, the actual size of the data is rounded
up the nearest allocation unit.
<p>For HPSG, the runs do not end at object boundaries.  It is not possible
to tell from this bitmap whether a run contains one or several objects.
(But see HPSO, below.)
<p>[If we find that we have many long runs, we can overload the 'P' flag
or dedicate the 'U' flag to indicate that we have a 16-bit length instead
of 8-bit.  We can also use a variable-width integer scheme for the length,
encoding 1-128 in one byte, 1-16384 in two bytes, etc.]
<p>[Alternate plan for 'K': array of byte, array of char, array of Object,
array of miscellaneous primitive type]
<p>To parse the data, the server runs through the usage data until either
(a) the end of the chunk is reached, or (b) all allocation units have been
accounted for.  (If these two things don't happen at the same time, the
chunk is rejected.)
<p>Example: suppose a VM has a heap at 0x10000 that is 0x2000 bytes long
(with an 8-byte allocation unit size, that's 0x0400 units long).
The client could send one chunk (allocSize=8, virtAddr=0x10000, offset=0,
length=0x0400) or two (allocSize=8, virtAddr=0x10000, offset=0, length=0x300;
then allocSize=8, virtAddr=0x10000, offset=0x300, length=0x100).
<p>The client must encode the entire heap, including all free space at
the end, or the server will not have an accurate impression of the amount
of memory in the heap.  This refers to the current heap size, not the
maximum heap size.

<h4>Chunk HPSO (client --&gt; server)</h4>
<p>This is essentially identical to HPSG, but the runs are terminated at
object boundaries.  If an object is larger than 256 allocation units, the
"partial" flag is set in all runs except the last.
<p>The resulting unpacked bitmap is identical, but the object boundary
information can be used to gain insights into heap layout.
<p>[Do we want to have a separate message for this?  Maybe just include
a "variant" flag in the HPST packet.  Another possible form of output
would be one that indicates the age, in generations, of each block of
memory.  That would provide a quick visual indication of "permanent vs.
transient residents", perhaps with a 16-level grey scale.]

<h4>Chunk NHSG (client --&gt; server)</h4>
<p>Native heap segment data.  Each chunk describes all or part of a
contiguous stretch of native heap memory.  The format is the same as
for HPSG, except that only solidity values 0 (= free) and 1 (= hard
reference) are used, and the kind value is always 0 for free chunks
and 7 for allocated chunks, indicating a non-VM object.
<pre>
u4   heap ID
u1   size of allocation unit, in bytes (e.g. 8 bytes)
u4   virtual address of segment start
u4   offset of this piece (relative to the virtual address)
u4   length of piece, in allocation units
var  usage data
</pre>

<h3>Generic Replies</h3>

The client-side chunk handlers need a common way to report simple success
or failure.  By convention, an empty reply packet indicates success.

<h4>Chunk FAIL (client --&gt; server, reply only)</h4>
<p>The chunk includes a machine-readable error code and a
human-readable error message.  Server code can associate the failure
with the original request by comparing the JDWP packet ID.
<p>This allows a standard way of, for example, rejecting badly-formed
request packets.
<pre>
u4   error code
u4   error message len (in 16-bit chars)
var  error message (UTF-16)
</pre>

<h3>Miscellaneous</h3>

<h4>Chunk EXIT (server --&gt; client)</h4>
<p>Cause the client to exit with the specified status, using System.exit().
Useful for certain kinds of testing.
<pre>
u4   exit status
</pre>

<h4>Chunk DTRC (server --&gt; client)</h4>
<p>[TBD] start/stop dmtrace; can send the results back over the wire.  For
size reasons we probably need "sending", "data", "key", "finished" as
4 separate chunks/packets rather than one glob.


<h2>Client API</h2>

<p>The API is written in the Java programming language
for convenience.  The code is free to call native methods if appropriate.

<h3>Chunk Handler API</h3>

<p>The basic idea is that arbitrary code can register handlers for
specific chunk types.  When a DDM chunk with that type arrives, the
appropriate handler is invoked.  The handler's return value provides the
response to the server.

<p>There are two packages.  android.ddm lives in the "framework" library,
and has all of the chunk handlers and registration code.  It can freely
use Android classes.  org.apache.harmony.dalvik.ddmc lives in the "core"
library, and has
some base classes and features that interact with the VM.  Nothing should
need to modify the org.apache.harmony.dalvik.ddmc classes.

<p>The DDM classes pass chunks of data around with a simple class:

<pre class=prettyprint>
class Chunk {
    int type;
    byte[] data;
    int offset, length;
};
</pre>

<p>The chunk handlers accept and return them:
<pre class=prettyprint>
public Chunk handleChunk(Chunk request)
</pre>
<p>The code is free to parse the chunk and generate a response in any
way it chooses.  Big-endian byte ordering is recommended but not mandatory.
<p>Chunk handlers will be notified when a DDM server connects or disconnects,
so that they can perform setup and cleanup operations:
<pre class=prettyprint>
public void connected()
public void disconnected()
</pre>

<p>The method processes the request, formulates a response, and returns it.
If the method returns null, an empty JDWP success message will be returned.
<p>The request/response interaction is essentially asynchronous in the
protocol.  The packets are linked together with the JDWP message ID.
<p>[We could use ByteBuffer here instead of byte[], but it doesn't gain
us much.  Wrapping a ByteBuffer around an array is easy.  We don't want
to pass the full packet in because we could have multiple chunks in one
request packet.  The DDM code needs to collect and aggregate the responses
to all chunks into a single JDWP response packet.  Parties wanting to
write multiple chunks in response to a single chunk should send a null
response back and use "sendChunk()" to send the data independently.]

<h3>Unsolicited event API</h3>

<p>If a piece of code wants to send a chunk of data to the server at some
arbitrary time, it may do so with a method provided by
org.apache.harmony.dalvik.DdmServer:

<pre class=prettyprint>
public static void sendChunk(Chunk chunk)
</pre>

<p>There is no response or status code.  No exceptions are thrown.


<h2>Server API</h2>

<p>This is similar to the client side in many ways, but makes extensive
use of ByteBuffer in a perhaps misguided attempt to use java.nio.channels
and avoid excessive thread creation and unnecessary data copying.

<p>Upon receipt of a packet, the server will identify it as one of:
<ol>
    <li>Message to be passed through to the debugger
    <li>Response to an earlier request
    <li>Unsolicited event packet
</ol>
<p>To handle (2), when messages are sent from the server to the client,
the message must be paired with a callback method.  The response might be
delayed for a while -- or might never arrive -- so the server can't block
waiting for responses from the client.
<p>The chunk handlers look like this:
<pre class=prettyprint>
public void handleChunk(Client client, int type,
    ByteBuffer data, boolean isReply, int msgId)
</pre>
<p>The arguments are:
<dl>
    <dt>client
    <dd>An object representing the client VM that send us the packet.
    <dt>type
    <dd>The 32-bit chunk type.
    <dt>data
    <dd>The data.  The data's length can be determined by calling data.limit().
    <dt>isReply
    <dd>Set to "true" if this was a reply to a message we sent earlier,
    "false" if the client sent this unsolicited.
    <dt>msgId
    <dd>The JDWP message ID.  Useful for connecting replies with requests.
</dl>
<p>If a handler doesn't like the contents of a packet, it should log an
error message and return.  If the handler doesn't recognize the packet at
all, it can call the superclass' handleUnknownChunk() method.

<p>As with the client, the server code can be notified when clients
connect or disconnect.  This allows the handler to send initialization
code immediately after a connect, or clean up after a disconnect.
<p>Data associated with a client can be stored in a ClientData object,
which acts as a general per-client dumping around for VM and UI state.


<P><BR>

<HR>

<address>Copyright &copy; 2007 The Android Open Source Project</address>

</body>
</HTML>
