blob: ba053b26a1315bbb1a2821d9cd95ba5d5ddfa8f9 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26#ifndef JDWP_UTIL_H
27#define JDWP_UTIL_H
28
29#include <stddef.h>
30#include <stdio.h>
31#include <string.h>
32#include <stdlib.h>
33#include <stdarg.h>
34
35#ifdef DEBUG
36 /* Just to make sure these interfaces are not used here. */
37 #undef free
38 #define free(p) Do not use this interface.
39 #undef malloc
40 #define malloc(p) Do not use this interface.
41 #undef calloc
42 #define calloc(p) Do not use this interface.
43 #undef realloc
44 #define realloc(p) Do not use this interface.
45 #undef strdup
46 #define strdup(p) Do not use this interface.
47#endif
48
49#include "log_messages.h"
50#include "vm_interface.h"
51#include "JDWP.h"
52#include "util_md.h"
53#include "error_messages.h"
54#include "debugInit.h"
55
56/* Get access to Native Platform Toolkit functions */
57#include "npt.h"
58
59/* Definition of a CommonRef tracked by the backend for the frontend */
60typedef struct RefNode {
61 jlong seqNum; /* ID of reference, also key for hash table */
62 jobject ref; /* could be strong or weak */
63 struct RefNode *next; /* next RefNode* in bucket chain */
64 jint count; /* count of references */
65 unsigned isStrong : 1; /* 1 means this is a string reference */
66} RefNode;
67
68/* Value of a NULL ID */
69#define NULL_OBJECT_ID ((jlong)0)
70
71/*
72 * Globals used throughout the back end
73 */
74
75typedef jint FrameNumber;
76
77typedef struct {
78 jvmtiEnv *jvmti;
79 JavaVM *jvm;
80 volatile jboolean vmDead; /* Once VM is dead it stays that way - don't put in init */
81 jboolean assertOn;
82 jboolean assertFatal;
83 jboolean doerrorexit;
84 jboolean modifiedUtf8;
85 jboolean quiet;
86
87 /* Debug flags (bit mask) */
88 int debugflags;
89
90 /* Possible debug flags */
91 #define USE_ITERATE_THROUGH_HEAP 0X001
92
93 char * options;
94
95 jclass classClass;
96 jclass threadClass;
97 jclass threadGroupClass;
98 jclass classLoaderClass;
99 jclass stringClass;
100 jclass systemClass;
101 jmethodID threadConstructor;
102 jmethodID threadSetDaemon;
103 jmethodID threadResume;
104 jmethodID systemGetProperty;
105 jmethodID setProperty;
106 jthreadGroup systemThreadGroup;
107 jobject agent_properties;
108
109 jint cachedJvmtiVersion;
110 jvmtiCapabilities cachedJvmtiCapabilities;
111 jboolean haveCachedJvmtiCapabilities;
112 jvmtiEventCallbacks callbacks;
113
114 /* Various property values we should grab on initialization */
115 char* property_java_version; /* UTF8 java.version */
116 char* property_java_vm_name; /* UTF8 java.vm.name */
117 char* property_java_vm_info; /* UTF8 java.vm.info */
118 char* property_java_class_path; /* UTF8 java.class.path */
119 char* property_sun_boot_class_path; /* UTF8 sun.boot.class.path */
120 char* property_sun_boot_library_path; /* UTF8 sun.boot.library.path */
121 char* property_path_separator; /* UTF8 path.separator */
122 char* property_user_dir; /* UTF8 user.dir */
123
124 unsigned log_flags;
125
126 /* The Native Platform Toolkit access */
127 NptEnv *npt;
128
129 /* Common References static data */
130 jrawMonitorID refLock;
131 jlong nextSeqNum;
132 RefNode **objectsByID;
133 int objectsByIDsize;
134 int objectsByIDcount;
135
136 /* Indication that the agent has been loaded */
137 jboolean isLoaded;
138
139} BackendGlobalData;
140
141extern BackendGlobalData * gdata;
142
143/*
144 * Event Index for handlers
145 */
146
147typedef enum {
148 EI_min = 1,
149
150 EI_SINGLE_STEP = 1,
151 EI_BREAKPOINT = 2,
152 EI_FRAME_POP = 3,
153 EI_EXCEPTION = 4,
154 EI_THREAD_START = 5,
155 EI_THREAD_END = 6,
156 EI_CLASS_PREPARE = 7,
157 EI_GC_FINISH = 8,
158 EI_CLASS_LOAD = 9,
159 EI_FIELD_ACCESS = 10,
160 EI_FIELD_MODIFICATION = 11,
161 EI_EXCEPTION_CATCH = 12,
162 EI_METHOD_ENTRY = 13,
163 EI_METHOD_EXIT = 14,
164 EI_MONITOR_CONTENDED_ENTER = 15,
165 EI_MONITOR_CONTENDED_ENTERED = 16,
166 EI_MONITOR_WAIT = 17,
167 EI_MONITOR_WAITED = 18,
168 EI_VM_INIT = 19,
169 EI_VM_DEATH = 20,
170 EI_max = 20
171} EventIndex;
172
173/* Agent errors that might be in a jvmtiError for JDWP or internal.
174 * (Done this way so that compiler allows it's use as a jvmtiError)
175 */
176#define _AGENT_ERROR(x) ((jvmtiError)(JVMTI_ERROR_MAX+64+x))
177#define AGENT_ERROR_INTERNAL _AGENT_ERROR(1)
178#define AGENT_ERROR_VM_DEAD _AGENT_ERROR(2)
179#define AGENT_ERROR_NO_JNI_ENV _AGENT_ERROR(3)
180#define AGENT_ERROR_JNI_EXCEPTION _AGENT_ERROR(4)
181#define AGENT_ERROR_JVMTI_INTERNAL _AGENT_ERROR(5)
182#define AGENT_ERROR_JDWP_INTERNAL _AGENT_ERROR(6)
183#define AGENT_ERROR_NOT_CURRENT_FRAME _AGENT_ERROR(7)
184#define AGENT_ERROR_OUT_OF_MEMORY _AGENT_ERROR(8)
185#define AGENT_ERROR_INVALID_TAG _AGENT_ERROR(9)
186#define AGENT_ERROR_ALREADY_INVOKING _AGENT_ERROR(10)
187#define AGENT_ERROR_INVALID_INDEX _AGENT_ERROR(11)
188#define AGENT_ERROR_INVALID_LENGTH _AGENT_ERROR(12)
189#define AGENT_ERROR_INVALID_STRING _AGENT_ERROR(13)
190#define AGENT_ERROR_INVALID_CLASS_LOADER _AGENT_ERROR(14)
191#define AGENT_ERROR_INVALID_ARRAY _AGENT_ERROR(15)
192#define AGENT_ERROR_TRANSPORT_LOAD _AGENT_ERROR(16)
193#define AGENT_ERROR_TRANSPORT_INIT _AGENT_ERROR(17)
194#define AGENT_ERROR_NATIVE_METHOD _AGENT_ERROR(18)
195#define AGENT_ERROR_INVALID_COUNT _AGENT_ERROR(19)
196#define AGENT_ERROR_INVALID_FRAMEID _AGENT_ERROR(20)
197#define AGENT_ERROR_NULL_POINTER _AGENT_ERROR(21)
198#define AGENT_ERROR_ILLEGAL_ARGUMENT _AGENT_ERROR(22)
199#define AGENT_ERROR_INVALID_THREAD _AGENT_ERROR(23)
200#define AGENT_ERROR_INVALID_EVENT_TYPE _AGENT_ERROR(24)
201#define AGENT_ERROR_INVALID_OBJECT _AGENT_ERROR(25)
202#define AGENT_ERROR_NO_MORE_FRAMES _AGENT_ERROR(26)
203
204/* Combined event information */
205
206typedef struct {
207
208 EventIndex ei;
209 jthread thread;
210 jclass clazz;
211 jmethodID method;
212 jlocation location;
213 jobject object; /* possibly an exception or user object */
214
215 union {
216
217 /* ei = EI_FIELD_ACCESS */
218 struct {
219 jclass field_clazz;
220 jfieldID field;
221 } field_access;
222
223 /* ei = EI_FIELD_MODIFICATION */
224 struct {
225 jclass field_clazz;
226 jfieldID field;
227 char signature_type;
228 jvalue new_value;
229 } field_modification;
230
231 /* ei = EI_EXCEPTION */
232 struct {
233 jclass catch_clazz;
234 jmethodID catch_method;
235 jlocation catch_location;
236 } exception;
237
238 /* ei = EI_METHOD_EXIT */
239 struct {
240 jvalue return_value;
241 } method_exit;
242
243 /* For monitor wait events */
244 union {
245 /* ei = EI_MONITOR_WAIT */
246 jlong timeout;
247 /* ei = EI_MONITOR_WAITED */
248 jboolean timed_out;
249 } monitor;
250 } u;
251
252} EventInfo;
253
254/* Structure to hold dynamic array of objects */
255typedef struct ObjectBatch {
256 jobject *objects;
257 jint count;
258} ObjectBatch;
259
260/*
261 * JNI signature constants, beyond those defined in JDWP_TAG(*)
262 */
263#define SIGNATURE_BEGIN_ARGS '('
264#define SIGNATURE_END_ARGS ')'
265#define SIGNATURE_END_CLASS ';'
266
267/*
268 * Modifier flags for classes, fields, methods
269 */
270#define MOD_PUBLIC 0x0001 /* visible to everyone */
271#define MOD_PRIVATE 0x0002 /* visible only to the defining class */
272#define MOD_PROTECTED 0x0004 /* visible to subclasses */
273#define MOD_STATIC 0x0008 /* instance variable is static */
274#define MOD_FINAL 0x0010 /* no further subclassing, overriding */
275#define MOD_SYNCHRONIZED 0x0020 /* wrap method call in monitor lock */
276#define MOD_VOLATILE 0x0040 /* can cache in registers */
277#define MOD_TRANSIENT 0x0080 /* not persistant */
278#define MOD_NATIVE 0x0100 /* implemented in C */
279#define MOD_INTERFACE 0x0200 /* class is an interface */
280#define MOD_ABSTRACT 0x0400 /* no definition provided */
281/*
282 * Additional modifiers not defined as such in the JVM spec
283 */
284#define MOD_SYNTHETIC 0xf0000000 /* not in source code */
285
286/*
287 * jlong conversion macros
288 */
289#define jlong_zero ((jlong) 0)
290#define jlong_one ((jlong) 1)
291
292#define jlong_to_ptr(a) ((void*)(intptr_t)(a))
293#define ptr_to_jlong(a) ((jlong)(intptr_t)(a))
294#define jint_to_jlong(a) ((jlong)(a))
295#define jlong_to_jint(a) ((jint)(a))
296
297
298/*
299 * util funcs
300 */
301void util_initialize(JNIEnv *env);
302void util_reset(void);
303
304struct PacketInputStream;
305struct PacketOutputStream;
306
307jint uniqueID(void);
308jbyte referenceTypeTag(jclass clazz);
309jbyte specificTypeKey(JNIEnv *env, jobject object);
310jboolean isObjectTag(jbyte tag);
311jvmtiError spawnNewThread(jvmtiStartFunction func, void *arg, char *name);
312void convertSignatureToClassname(char *convert);
313void writeCodeLocation(struct PacketOutputStream *out, jclass clazz,
314 jmethodID method, jlocation location);
315
316jvmtiError classInstances(jclass klass, ObjectBatch *instances, int maxInstances);
317jvmtiError classInstanceCounts(jint classCount, jclass *classes, jlong *counts);
318jvmtiError objectReferrers(jobject obj, ObjectBatch *referrers, int maxObjects);
319
320/*
321 * Command handling helpers shared among multiple command sets
322 */
323int filterDebugThreads(jthread *threads, int count);
324
325
326void sharedGetFieldValues(struct PacketInputStream *in,
327 struct PacketOutputStream *out,
328 jboolean isStatic);
329jboolean sharedInvoke(struct PacketInputStream *in,
330 struct PacketOutputStream *out);
331
332jvmtiError fieldSignature(jclass, jfieldID, char **, char **, char **);
333jvmtiError fieldModifiers(jclass, jfieldID, jint *);
334jvmtiError methodSignature(jmethodID, char **, char **, char **);
335jvmtiError methodReturnType(jmethodID, char *);
336jvmtiError methodModifiers(jmethodID, jint *);
337jvmtiError methodClass(jmethodID, jclass *);
338jvmtiError methodLocation(jmethodID, jlocation*, jlocation*);
339jvmtiError classLoader(jclass, jobject *);
340
341/*
342 * Thin wrappers on top of JNI
343 */
344JNIEnv *getEnv(void);
345jboolean isClass(jobject object);
346jboolean isThread(jobject object);
347jboolean isThreadGroup(jobject object);
348jboolean isString(jobject object);
349jboolean isClassLoader(jobject object);
350jboolean isArray(jobject object);
351
352/*
353 * Thin wrappers on top of JVMTI
354 */
355jvmtiError jvmtiGetCapabilities(jvmtiCapabilities *caps);
356jint jvmtiMajorVersion(void);
357jint jvmtiMinorVersion(void);
358jint jvmtiMicroVersion(void);
359jvmtiError getSourceDebugExtension(jclass clazz, char **extensionPtr);
360jboolean canSuspendResumeThreadLists(void);
361
362jrawMonitorID debugMonitorCreate(char *name);
363void debugMonitorEnter(jrawMonitorID theLock);
364void debugMonitorExit(jrawMonitorID theLock);
365void debugMonitorWait(jrawMonitorID theLock);
366void debugMonitorTimedWait(jrawMonitorID theLock, jlong millis);
367void debugMonitorNotify(jrawMonitorID theLock);
368void debugMonitorNotifyAll(jrawMonitorID theLock);
369void debugMonitorDestroy(jrawMonitorID theLock);
370
371jthread *allThreads(jint *count);
372
373void threadGroupInfo(jthreadGroup, jvmtiThreadGroupInfo *info);
374
375char *getClassname(jclass);
376jvmtiError classSignature(jclass, char**, char**);
377jint classStatus(jclass);
378void writeGenericSignature(struct PacketOutputStream *, char *);
379jboolean isMethodNative(jmethodID);
380jboolean isMethodObsolete(jmethodID);
381jvmtiError isMethodSynthetic(jmethodID, jboolean*);
382jvmtiError isFieldSynthetic(jclass, jfieldID, jboolean*);
383
384jboolean isSameObject(JNIEnv *env, jobject o1, jobject o2);
385
386jint objectHashCode(jobject);
387
388jvmtiError allInterfaces(jclass clazz, jclass **ppinterfaces, jint *count);
389jvmtiError allLoadedClasses(jclass **ppclasses, jint *count);
390jvmtiError allClassLoaderClasses(jobject loader, jclass **ppclasses, jint *count);
391jvmtiError allNestedClasses(jclass clazz, jclass **ppnested, jint *pcount);
392
393void setAgentPropertyValue(JNIEnv *env, char *propertyName, char* propertyValue);
394
395void *jvmtiAllocate(jint numBytes);
396void jvmtiDeallocate(void *buffer);
397
398void eventIndexInit(void);
399jdwpEvent eventIndex2jdwp(EventIndex i);
400jvmtiEvent eventIndex2jvmti(EventIndex i);
401EventIndex jdwp2EventIndex(jdwpEvent eventType);
402EventIndex jvmti2EventIndex(jvmtiEvent kind);
403
404jvmtiError map2jvmtiError(jdwpError);
405jdwpError map2jdwpError(jvmtiError);
406jdwpThreadStatus map2jdwpThreadStatus(jint state);
407jint map2jdwpSuspendStatus(jint state);
408jint map2jdwpClassStatus(jint);
409
410void log_debugee_location(const char *func,
411 jthread thread, jmethodID method, jlocation location);
412
413/*
414 * Local Reference management. The two macros below are used
415 * throughout the back end whenever space for JNI local references
416 * is needed in the current frame.
417 */
418
419void createLocalRefSpace(JNIEnv *env, jint capacity);
420
421#define WITH_LOCAL_REFS(env, number) \
422 createLocalRefSpace(env, number); \
423 { /* BEGINNING OF WITH SCOPE */
424
425#define END_WITH_LOCAL_REFS(env) \
426 JNI_FUNC_PTR(env,PopLocalFrame)(env, NULL); \
427 } /* END OF WITH SCOPE */
428
429void saveGlobalRef(JNIEnv *env, jobject obj, jobject *pobj);
430void tossGlobalRef(JNIEnv *env, jobject *pobj);
431
432#endif