Jdwp.h revision 375fb116bcb817b37509ab579dbd55cdbb765cbf
1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16/* 17 * JDWP "public" interface. The main body of the VM should only use JDWP 18 * structures and functions declared here. 19 * 20 * The JDWP code follows the DalvikVM rules for naming conventions, but 21 * attempts to remain independent of VM innards (e.g. it doesn't access VM 22 * data structures directly). All calls go through Debugger.c. 23 */ 24#ifndef DALVIK_JDWP_JDWP_H_ 25#define DALVIK_JDWP_JDWP_H_ 26 27#include "jdwp/JdwpConstants.h" 28#include "jdwp/ExpandBuf.h" 29#include "Common.h" 30#include "Bits.h" 31#include <pthread.h> 32 33struct JdwpState; /* opaque */ 34 35/* 36 * Fundamental types. 37 * 38 * ObjectId and RefTypeId must be the same size. 39 */ 40typedef u4 FieldId; /* static or instance field */ 41typedef u4 MethodId; /* any kind of method, including constructors */ 42typedef u8 ObjectId; /* any object (threadID, stringID, arrayID, etc) */ 43typedef u8 RefTypeId; /* like ObjectID, but unique for Class objects */ 44typedef u8 FrameId; /* short-lived stack frame ID */ 45 46/* 47 * Match these with the type sizes. This way we don't have to pass 48 * a value and a length. 49 */ 50INLINE FieldId dvmReadFieldId(const u1** pBuf) { return read4BE(pBuf); } 51INLINE MethodId dvmReadMethodId(const u1** pBuf) { return read4BE(pBuf); } 52INLINE ObjectId dvmReadObjectId(const u1** pBuf) { return read8BE(pBuf); } 53INLINE RefTypeId dvmReadRefTypeId(const u1** pBuf) { return read8BE(pBuf); } 54INLINE FrameId dvmReadFrameId(const u1** pBuf) { return read8BE(pBuf); } 55INLINE void dvmSetFieldId(u1* buf, FieldId val) { return set4BE(buf, val); } 56INLINE void dvmSetMethodId(u1* buf, MethodId val) { return set4BE(buf, val); } 57INLINE void dvmSetObjectId(u1* buf, ObjectId val) { return set8BE(buf, val); } 58INLINE void dvmSetRefTypeId(u1* buf, RefTypeId val) { return set8BE(buf, val); } 59INLINE void dvmSetFrameId(u1* buf, FrameId val) { return set8BE(buf, val); } 60INLINE void expandBufAddFieldId(ExpandBuf* pReply, FieldId id) { 61 expandBufAdd4BE(pReply, id); 62} 63INLINE void expandBufAddMethodId(ExpandBuf* pReply, MethodId id) { 64 expandBufAdd4BE(pReply, id); 65} 66INLINE void expandBufAddObjectId(ExpandBuf* pReply, ObjectId id) { 67 expandBufAdd8BE(pReply, id); 68} 69INLINE void expandBufAddRefTypeId(ExpandBuf* pReply, RefTypeId id) { 70 expandBufAdd8BE(pReply, id); 71} 72INLINE void expandBufAddFrameId(ExpandBuf* pReply, FrameId id) { 73 expandBufAdd8BE(pReply, id); 74} 75 76 77/* 78 * Holds a JDWP "location". 79 */ 80struct JdwpLocation { 81 u1 typeTag; /* class or interface? */ 82 RefTypeId classId; /* method->clazz */ 83 MethodId methodId; /* method in which "idx" resides */ 84 u8 idx; /* relative index into code block */ 85}; 86 87/* 88 * How we talk to the debugger. 89 */ 90enum JdwpTransportType { 91 kJdwpTransportUnknown = 0, 92 kJdwpTransportSocket, /* transport=dt_socket */ 93 kJdwpTransportAndroidAdb, /* transport=dt_android_adb */ 94}; 95 96/* 97 * Holds collection of JDWP initialization parameters. 98 */ 99struct JdwpStartupParams { 100 JdwpTransportType transport; 101 bool server; 102 bool suspend; 103 char host[64]; 104 short port; 105 /* more will be here someday */ 106}; 107 108/* 109 * Perform one-time initialization. 110 * 111 * Among other things, this binds to a port to listen for a connection from 112 * the debugger. 113 * 114 * Returns a newly-allocated JdwpState struct on success, or NULL on failure. 115 */ 116JdwpState* dvmJdwpStartup(const JdwpStartupParams* params); 117 118/* 119 * Shut everything down. 120 */ 121void dvmJdwpShutdown(JdwpState* state); 122 123/* 124 * Returns "true" if a debugger or DDM is connected. 125 */ 126bool dvmJdwpIsActive(JdwpState* state); 127 128/* 129 * Return the debugger thread's handle, or 0 if the debugger thread isn't 130 * running. 131 */ 132pthread_t dvmJdwpGetDebugThread(JdwpState* state); 133 134/* 135 * Get time, in milliseconds, since the last debugger activity. 136 */ 137s8 dvmJdwpLastDebuggerActivity(JdwpState* state); 138 139/* 140 * When we hit a debugger event that requires suspension, it's important 141 * that we wait for the thread to suspend itself before processing any 142 * additional requests. (Otherwise, if the debugger immediately sends a 143 * "resume thread" command, the resume might arrive before the thread has 144 * suspended itself.) 145 * 146 * The thread should call the "set" function before sending the event to 147 * the debugger. The main JDWP handler loop calls "get" before processing 148 * an event, and will wait for thread suspension if it's set. Once the 149 * thread has suspended itself, the JDWP handler calls "clear" and 150 * continues processing the current event. This works in the suspend-all 151 * case because the event thread doesn't suspend itself until everything 152 * else has suspended. 153 * 154 * It's possible that multiple threads could encounter thread-suspending 155 * events at the same time, so we grab a mutex in the "set" call, and 156 * release it in the "clear" call. 157 */ 158//ObjectId dvmJdwpGetWaitForEventThread(JdwpState* state); 159void dvmJdwpSetWaitForEventThread(JdwpState* state, ObjectId threadId); 160void dvmJdwpClearWaitForEventThread(JdwpState* state); 161 162/* 163 * Network functions. 164 */ 165bool dvmJdwpCheckConnection(JdwpState* state); 166bool dvmJdwpAcceptConnection(JdwpState* state); 167bool dvmJdwpEstablishConnection(JdwpState* state); 168void dvmJdwpCloseConnection(JdwpState* state); 169bool dvmJdwpProcessIncoming(JdwpState* state); 170 171 172/* 173 * These notify the debug code that something interesting has happened. This 174 * could be a thread starting or ending, an exception, or an opportunity 175 * for a breakpoint. These calls do not mean that an event the debugger 176 * is interested has happened, just that something has happened that the 177 * debugger *might* be interested in. 178 * 179 * The item of interest may trigger multiple events, some or all of which 180 * are grouped together in a single response. 181 * 182 * The event may cause the current thread or all threads (except the 183 * JDWP support thread) to be suspended. 184 */ 185 186/* 187 * The VM has finished initializing. Only called when the debugger is 188 * connected at the time initialization completes. 189 */ 190bool dvmJdwpPostVMStart(JdwpState* state, bool suspend); 191 192/* 193 * A location of interest has been reached. This is used for breakpoints, 194 * single-stepping, and method entry/exit. (JDWP requires that these four 195 * events are grouped together in a single response.) 196 * 197 * In some cases "*pLoc" will just have a method and class name, e.g. when 198 * issuing a MethodEntry on a native method. 199 * 200 * "eventFlags" indicates the types of events that have occurred. 201 */ 202bool dvmJdwpPostLocationEvent(JdwpState* state, const JdwpLocation* pLoc, 203 ObjectId thisPtr, int eventFlags); 204 205/* 206 * An exception has been thrown. 207 * 208 * Pass in a zeroed-out "*pCatchLoc" if the exception wasn't caught. 209 */ 210bool dvmJdwpPostException(JdwpState* state, const JdwpLocation* pThrowLoc, 211 ObjectId excepId, RefTypeId excepClassId, const JdwpLocation* pCatchLoc, 212 ObjectId thisPtr); 213 214/* 215 * A thread has started or stopped. 216 */ 217bool dvmJdwpPostThreadChange(JdwpState* state, ObjectId threadId, bool start); 218 219/* 220 * Class has been prepared. 221 */ 222bool dvmJdwpPostClassPrepare(JdwpState* state, int tag, RefTypeId refTypeId, 223 const char* signature, int status); 224 225/* 226 * The VM is about to stop. 227 */ 228bool dvmJdwpPostVMDeath(JdwpState* state); 229 230/* 231 * Send up a chunk of DDM data. 232 */ 233void dvmJdwpDdmSendChunkV(JdwpState* state, int type, const struct iovec* iov, 234 int iovcnt); 235 236#endif // DALVIK_JDWP_JDWP_H_ 237