1 | /*
|
---|
2 | * Copyright (c) 1998, 2005, Oracle and/or its affiliates. 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. Oracle designates this
|
---|
8 | * particular file as subject to the "Classpath" exception as provided
|
---|
9 | * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
---|
22 | * or visit www.oracle.com if you need additional information or have any
|
---|
23 | * 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 */
|
---|
60 | typedef 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 |
|
---|
75 | typedef jint FrameNumber;
|
---|
76 |
|
---|
77 | typedef 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 |
|
---|
141 | extern BackendGlobalData * gdata;
|
---|
142 |
|
---|
143 | /*
|
---|
144 | * Event Index for handlers
|
---|
145 | */
|
---|
146 |
|
---|
147 | typedef 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 |
|
---|
206 | typedef 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 */
|
---|
255 | typedef 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 | */
|
---|
301 | void util_initialize(JNIEnv *env);
|
---|
302 | void util_reset(void);
|
---|
303 |
|
---|
304 | struct PacketInputStream;
|
---|
305 | struct PacketOutputStream;
|
---|
306 |
|
---|
307 | jint uniqueID(void);
|
---|
308 | jbyte referenceTypeTag(jclass clazz);
|
---|
309 | jbyte specificTypeKey(JNIEnv *env, jobject object);
|
---|
310 | jboolean isObjectTag(jbyte tag);
|
---|
311 | jvmtiError spawnNewThread(jvmtiStartFunction func, void *arg, char *name);
|
---|
312 | void convertSignatureToClassname(char *convert);
|
---|
313 | void writeCodeLocation(struct PacketOutputStream *out, jclass clazz,
|
---|
314 | jmethodID method, jlocation location);
|
---|
315 |
|
---|
316 | jvmtiError classInstances(jclass klass, ObjectBatch *instances, int maxInstances);
|
---|
317 | jvmtiError classInstanceCounts(jint classCount, jclass *classes, jlong *counts);
|
---|
318 | jvmtiError objectReferrers(jobject obj, ObjectBatch *referrers, int maxObjects);
|
---|
319 |
|
---|
320 | /*
|
---|
321 | * Command handling helpers shared among multiple command sets
|
---|
322 | */
|
---|
323 | int filterDebugThreads(jthread *threads, int count);
|
---|
324 |
|
---|
325 |
|
---|
326 | void sharedGetFieldValues(struct PacketInputStream *in,
|
---|
327 | struct PacketOutputStream *out,
|
---|
328 | jboolean isStatic);
|
---|
329 | jboolean sharedInvoke(struct PacketInputStream *in,
|
---|
330 | struct PacketOutputStream *out);
|
---|
331 |
|
---|
332 | jvmtiError fieldSignature(jclass, jfieldID, char **, char **, char **);
|
---|
333 | jvmtiError fieldModifiers(jclass, jfieldID, jint *);
|
---|
334 | jvmtiError methodSignature(jmethodID, char **, char **, char **);
|
---|
335 | jvmtiError methodReturnType(jmethodID, char *);
|
---|
336 | jvmtiError methodModifiers(jmethodID, jint *);
|
---|
337 | jvmtiError methodClass(jmethodID, jclass *);
|
---|
338 | jvmtiError methodLocation(jmethodID, jlocation*, jlocation*);
|
---|
339 | jvmtiError classLoader(jclass, jobject *);
|
---|
340 |
|
---|
341 | /*
|
---|
342 | * Thin wrappers on top of JNI
|
---|
343 | */
|
---|
344 | JNIEnv *getEnv(void);
|
---|
345 | jboolean isClass(jobject object);
|
---|
346 | jboolean isThread(jobject object);
|
---|
347 | jboolean isThreadGroup(jobject object);
|
---|
348 | jboolean isString(jobject object);
|
---|
349 | jboolean isClassLoader(jobject object);
|
---|
350 | jboolean isArray(jobject object);
|
---|
351 |
|
---|
352 | /*
|
---|
353 | * Thin wrappers on top of JVMTI
|
---|
354 | */
|
---|
355 | jvmtiError jvmtiGetCapabilities(jvmtiCapabilities *caps);
|
---|
356 | jint jvmtiMajorVersion(void);
|
---|
357 | jint jvmtiMinorVersion(void);
|
---|
358 | jint jvmtiMicroVersion(void);
|
---|
359 | jvmtiError getSourceDebugExtension(jclass clazz, char **extensionPtr);
|
---|
360 | jboolean canSuspendResumeThreadLists(void);
|
---|
361 |
|
---|
362 | jrawMonitorID debugMonitorCreate(char *name);
|
---|
363 | void debugMonitorEnter(jrawMonitorID theLock);
|
---|
364 | void debugMonitorExit(jrawMonitorID theLock);
|
---|
365 | void debugMonitorWait(jrawMonitorID theLock);
|
---|
366 | void debugMonitorTimedWait(jrawMonitorID theLock, jlong millis);
|
---|
367 | void debugMonitorNotify(jrawMonitorID theLock);
|
---|
368 | void debugMonitorNotifyAll(jrawMonitorID theLock);
|
---|
369 | void debugMonitorDestroy(jrawMonitorID theLock);
|
---|
370 |
|
---|
371 | jthread *allThreads(jint *count);
|
---|
372 |
|
---|
373 | void threadGroupInfo(jthreadGroup, jvmtiThreadGroupInfo *info);
|
---|
374 |
|
---|
375 | char *getClassname(jclass);
|
---|
376 | jvmtiError classSignature(jclass, char**, char**);
|
---|
377 | jint classStatus(jclass);
|
---|
378 | void writeGenericSignature(struct PacketOutputStream *, char *);
|
---|
379 | jboolean isMethodNative(jmethodID);
|
---|
380 | jboolean isMethodObsolete(jmethodID);
|
---|
381 | jvmtiError isMethodSynthetic(jmethodID, jboolean*);
|
---|
382 | jvmtiError isFieldSynthetic(jclass, jfieldID, jboolean*);
|
---|
383 |
|
---|
384 | jboolean isSameObject(JNIEnv *env, jobject o1, jobject o2);
|
---|
385 |
|
---|
386 | jint objectHashCode(jobject);
|
---|
387 |
|
---|
388 | jvmtiError allInterfaces(jclass clazz, jclass **ppinterfaces, jint *count);
|
---|
389 | jvmtiError allLoadedClasses(jclass **ppclasses, jint *count);
|
---|
390 | jvmtiError allClassLoaderClasses(jobject loader, jclass **ppclasses, jint *count);
|
---|
391 | jvmtiError allNestedClasses(jclass clazz, jclass **ppnested, jint *pcount);
|
---|
392 |
|
---|
393 | void setAgentPropertyValue(JNIEnv *env, char *propertyName, char* propertyValue);
|
---|
394 |
|
---|
395 | void *jvmtiAllocate(jint numBytes);
|
---|
396 | void jvmtiDeallocate(void *buffer);
|
---|
397 |
|
---|
398 | void eventIndexInit(void);
|
---|
399 | jdwpEvent eventIndex2jdwp(EventIndex i);
|
---|
400 | jvmtiEvent eventIndex2jvmti(EventIndex i);
|
---|
401 | EventIndex jdwp2EventIndex(jdwpEvent eventType);
|
---|
402 | EventIndex jvmti2EventIndex(jvmtiEvent kind);
|
---|
403 |
|
---|
404 | jvmtiError map2jvmtiError(jdwpError);
|
---|
405 | jdwpError map2jdwpError(jvmtiError);
|
---|
406 | jdwpThreadStatus map2jdwpThreadStatus(jint state);
|
---|
407 | jint map2jdwpSuspendStatus(jint state);
|
---|
408 | jint map2jdwpClassStatus(jint);
|
---|
409 |
|
---|
410 | void 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 |
|
---|
419 | void 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 |
|
---|
429 | void saveGlobalRef(JNIEnv *env, jobject obj, jobject *pobj);
|
---|
430 | void tossGlobalRef(JNIEnv *env, jobject *pobj);
|
---|
431 |
|
---|
432 | #endif
|
---|