blob: dde7495009321809f26f9f8776ad693960442aee [file] [log] [blame]
duke6e45e102007-12-01 00:00:00 +00001/*
ohair2283b9d2010-05-25 15:58:33 -07002 * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved.
duke6e45e102007-12-01 00:00:00 +00003 * 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
ohair2283b9d2010-05-25 15:58:33 -07007 * published by the Free Software Foundation. Oracle designates this
duke6e45e102007-12-01 00:00:00 +00008 * particular file as subject to the "Classpath" exception as provided
ohair2283b9d2010-05-25 15:58:33 -07009 * by Oracle in the LICENSE file that accompanied this code.
duke6e45e102007-12-01 00:00:00 +000010 *
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 *
ohair2283b9d2010-05-25 15:58:33 -070021 * 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.
duke6e45e102007-12-01 00:00:00 +000024 */
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
Alex Light6af14c52017-11-13 11:01:06 -080077// ANDROID-CHANGED: support for DDMS extension apis.
78typedef jvmtiError (*DdmProcessChunk)(jvmtiEnv* jvmti,
79 jint type_in,
80 jint length_in,
81 const jbyte* data_in,
82 jint* type_out,
83 jint* length_out,
84 jbyte** data_out);
85
duke6e45e102007-12-01 00:00:00 +000086typedef struct {
87 jvmtiEnv *jvmti;
88 JavaVM *jvm;
89 volatile jboolean vmDead; /* Once VM is dead it stays that way - don't put in init */
90 jboolean assertOn;
91 jboolean assertFatal;
92 jboolean doerrorexit;
93 jboolean modifiedUtf8;
94 jboolean quiet;
95
96 /* Debug flags (bit mask) */
97 int debugflags;
98
99 /* Possible debug flags */
100 #define USE_ITERATE_THROUGH_HEAP 0X001
101
102 char * options;
103
104 jclass classClass;
105 jclass threadClass;
106 jclass threadGroupClass;
107 jclass classLoaderClass;
108 jclass stringClass;
109 jclass systemClass;
110 jmethodID threadConstructor;
111 jmethodID threadSetDaemon;
112 jmethodID threadResume;
113 jmethodID systemGetProperty;
114 jmethodID setProperty;
115 jthreadGroup systemThreadGroup;
116 jobject agent_properties;
117
118 jint cachedJvmtiVersion;
119 jvmtiCapabilities cachedJvmtiCapabilities;
120 jboolean haveCachedJvmtiCapabilities;
121 jvmtiEventCallbacks callbacks;
122
123 /* Various property values we should grab on initialization */
124 char* property_java_version; /* UTF8 java.version */
125 char* property_java_vm_name; /* UTF8 java.vm.name */
126 char* property_java_vm_info; /* UTF8 java.vm.info */
127 char* property_java_class_path; /* UTF8 java.class.path */
128 char* property_sun_boot_class_path; /* UTF8 sun.boot.class.path */
129 char* property_sun_boot_library_path; /* UTF8 sun.boot.library.path */
130 char* property_path_separator; /* UTF8 path.separator */
131 char* property_user_dir; /* UTF8 user.dir */
132
133 unsigned log_flags;
134
135 /* The Native Platform Toolkit access */
136 NptEnv *npt;
137
138 /* Common References static data */
139 jrawMonitorID refLock;
140 jlong nextSeqNum;
141 RefNode **objectsByID;
142 int objectsByIDsize;
143 int objectsByIDcount;
144
145 /* Indication that the agent has been loaded */
146 jboolean isLoaded;
147
Alex Light6af14c52017-11-13 11:01:06 -0800148 /* ANDROID-CHANGED: com.android.art.internal.ddm.process_chunk extension function */
149 DdmProcessChunk ddm_process_chunk;
150
Alex Lightf7b8d972018-01-24 13:29:53 -0800151 /* ANDROID-CHANGED: Need to keep track of if ddm is initially active. */
152 jboolean ddmInitiallyActive;
153
duke6e45e102007-12-01 00:00:00 +0000154} BackendGlobalData;
155
156extern BackendGlobalData * gdata;
157
158/*
159 * Event Index for handlers
160 */
161
162typedef enum {
163 EI_min = 1,
164
165 EI_SINGLE_STEP = 1,
166 EI_BREAKPOINT = 2,
167 EI_FRAME_POP = 3,
168 EI_EXCEPTION = 4,
169 EI_THREAD_START = 5,
170 EI_THREAD_END = 6,
171 EI_CLASS_PREPARE = 7,
172 EI_GC_FINISH = 8,
173 EI_CLASS_LOAD = 9,
174 EI_FIELD_ACCESS = 10,
175 EI_FIELD_MODIFICATION = 11,
176 EI_EXCEPTION_CATCH = 12,
177 EI_METHOD_ENTRY = 13,
178 EI_METHOD_EXIT = 14,
179 EI_MONITOR_CONTENDED_ENTER = 15,
180 EI_MONITOR_CONTENDED_ENTERED = 16,
181 EI_MONITOR_WAIT = 17,
182 EI_MONITOR_WAITED = 18,
183 EI_VM_INIT = 19,
184 EI_VM_DEATH = 20,
185 EI_max = 20
186} EventIndex;
187
188/* Agent errors that might be in a jvmtiError for JDWP or internal.
189 * (Done this way so that compiler allows it's use as a jvmtiError)
190 */
191#define _AGENT_ERROR(x) ((jvmtiError)(JVMTI_ERROR_MAX+64+x))
192#define AGENT_ERROR_INTERNAL _AGENT_ERROR(1)
193#define AGENT_ERROR_VM_DEAD _AGENT_ERROR(2)
194#define AGENT_ERROR_NO_JNI_ENV _AGENT_ERROR(3)
195#define AGENT_ERROR_JNI_EXCEPTION _AGENT_ERROR(4)
196#define AGENT_ERROR_JVMTI_INTERNAL _AGENT_ERROR(5)
197#define AGENT_ERROR_JDWP_INTERNAL _AGENT_ERROR(6)
198#define AGENT_ERROR_NOT_CURRENT_FRAME _AGENT_ERROR(7)
199#define AGENT_ERROR_OUT_OF_MEMORY _AGENT_ERROR(8)
200#define AGENT_ERROR_INVALID_TAG _AGENT_ERROR(9)
201#define AGENT_ERROR_ALREADY_INVOKING _AGENT_ERROR(10)
202#define AGENT_ERROR_INVALID_INDEX _AGENT_ERROR(11)
203#define AGENT_ERROR_INVALID_LENGTH _AGENT_ERROR(12)
204#define AGENT_ERROR_INVALID_STRING _AGENT_ERROR(13)
205#define AGENT_ERROR_INVALID_CLASS_LOADER _AGENT_ERROR(14)
206#define AGENT_ERROR_INVALID_ARRAY _AGENT_ERROR(15)
207#define AGENT_ERROR_TRANSPORT_LOAD _AGENT_ERROR(16)
208#define AGENT_ERROR_TRANSPORT_INIT _AGENT_ERROR(17)
209#define AGENT_ERROR_NATIVE_METHOD _AGENT_ERROR(18)
210#define AGENT_ERROR_INVALID_COUNT _AGENT_ERROR(19)
211#define AGENT_ERROR_INVALID_FRAMEID _AGENT_ERROR(20)
212#define AGENT_ERROR_NULL_POINTER _AGENT_ERROR(21)
213#define AGENT_ERROR_ILLEGAL_ARGUMENT _AGENT_ERROR(22)
214#define AGENT_ERROR_INVALID_THREAD _AGENT_ERROR(23)
215#define AGENT_ERROR_INVALID_EVENT_TYPE _AGENT_ERROR(24)
216#define AGENT_ERROR_INVALID_OBJECT _AGENT_ERROR(25)
217#define AGENT_ERROR_NO_MORE_FRAMES _AGENT_ERROR(26)
218
219/* Combined event information */
220
221typedef struct {
222
223 EventIndex ei;
224 jthread thread;
225 jclass clazz;
226 jmethodID method;
227 jlocation location;
228 jobject object; /* possibly an exception or user object */
229
230 union {
231
232 /* ei = EI_FIELD_ACCESS */
233 struct {
234 jclass field_clazz;
235 jfieldID field;
236 } field_access;
237
238 /* ei = EI_FIELD_MODIFICATION */
239 struct {
240 jclass field_clazz;
241 jfieldID field;
242 char signature_type;
243 jvalue new_value;
244 } field_modification;
245
246 /* ei = EI_EXCEPTION */
247 struct {
248 jclass catch_clazz;
249 jmethodID catch_method;
250 jlocation catch_location;
251 } exception;
252
253 /* ei = EI_METHOD_EXIT */
254 struct {
255 jvalue return_value;
256 } method_exit;
257
258 /* For monitor wait events */
259 union {
260 /* ei = EI_MONITOR_WAIT */
261 jlong timeout;
262 /* ei = EI_MONITOR_WAITED */
263 jboolean timed_out;
264 } monitor;
265 } u;
266
267} EventInfo;
268
269/* Structure to hold dynamic array of objects */
270typedef struct ObjectBatch {
271 jobject *objects;
272 jint count;
273} ObjectBatch;
274
275/*
276 * JNI signature constants, beyond those defined in JDWP_TAG(*)
277 */
278#define SIGNATURE_BEGIN_ARGS '('
279#define SIGNATURE_END_ARGS ')'
280#define SIGNATURE_END_CLASS ';'
281
282/*
283 * Modifier flags for classes, fields, methods
284 */
285#define MOD_PUBLIC 0x0001 /* visible to everyone */
286#define MOD_PRIVATE 0x0002 /* visible only to the defining class */
287#define MOD_PROTECTED 0x0004 /* visible to subclasses */
288#define MOD_STATIC 0x0008 /* instance variable is static */
289#define MOD_FINAL 0x0010 /* no further subclassing, overriding */
290#define MOD_SYNCHRONIZED 0x0020 /* wrap method call in monitor lock */
291#define MOD_VOLATILE 0x0040 /* can cache in registers */
292#define MOD_TRANSIENT 0x0080 /* not persistant */
293#define MOD_NATIVE 0x0100 /* implemented in C */
294#define MOD_INTERFACE 0x0200 /* class is an interface */
295#define MOD_ABSTRACT 0x0400 /* no definition provided */
296/*
297 * Additional modifiers not defined as such in the JVM spec
298 */
299#define MOD_SYNTHETIC 0xf0000000 /* not in source code */
300
301/*
302 * jlong conversion macros
303 */
304#define jlong_zero ((jlong) 0)
305#define jlong_one ((jlong) 1)
306
307#define jlong_to_ptr(a) ((void*)(intptr_t)(a))
308#define ptr_to_jlong(a) ((jlong)(intptr_t)(a))
309#define jint_to_jlong(a) ((jlong)(a))
310#define jlong_to_jint(a) ((jint)(a))
311
312
313/*
314 * util funcs
315 */
316void util_initialize(JNIEnv *env);
317void util_reset(void);
318
319struct PacketInputStream;
320struct PacketOutputStream;
321
322jint uniqueID(void);
323jbyte referenceTypeTag(jclass clazz);
324jbyte specificTypeKey(JNIEnv *env, jobject object);
325jboolean isObjectTag(jbyte tag);
326jvmtiError spawnNewThread(jvmtiStartFunction func, void *arg, char *name);
327void convertSignatureToClassname(char *convert);
328void writeCodeLocation(struct PacketOutputStream *out, jclass clazz,
329 jmethodID method, jlocation location);
330
331jvmtiError classInstances(jclass klass, ObjectBatch *instances, int maxInstances);
332jvmtiError classInstanceCounts(jint classCount, jclass *classes, jlong *counts);
333jvmtiError objectReferrers(jobject obj, ObjectBatch *referrers, int maxObjects);
334
Alex Lightb4095652017-11-30 16:17:29 -0800335// ANDROID-CHANGED: Helper function to get current time in milliseconds on CLOCK_MONOTONIC
336jlong milliTime(void);
337
duke6e45e102007-12-01 00:00:00 +0000338/*
339 * Command handling helpers shared among multiple command sets
340 */
341int filterDebugThreads(jthread *threads, int count);
342
343
344void sharedGetFieldValues(struct PacketInputStream *in,
345 struct PacketOutputStream *out,
346 jboolean isStatic);
347jboolean sharedInvoke(struct PacketInputStream *in,
348 struct PacketOutputStream *out);
349
350jvmtiError fieldSignature(jclass, jfieldID, char **, char **, char **);
351jvmtiError fieldModifiers(jclass, jfieldID, jint *);
352jvmtiError methodSignature(jmethodID, char **, char **, char **);
353jvmtiError methodReturnType(jmethodID, char *);
354jvmtiError methodModifiers(jmethodID, jint *);
355jvmtiError methodClass(jmethodID, jclass *);
356jvmtiError methodLocation(jmethodID, jlocation*, jlocation*);
357jvmtiError classLoader(jclass, jobject *);
358
359/*
360 * Thin wrappers on top of JNI
361 */
362JNIEnv *getEnv(void);
363jboolean isClass(jobject object);
364jboolean isThread(jobject object);
365jboolean isThreadGroup(jobject object);
366jboolean isString(jobject object);
367jboolean isClassLoader(jobject object);
368jboolean isArray(jobject object);
369
370/*
371 * Thin wrappers on top of JVMTI
372 */
373jvmtiError jvmtiGetCapabilities(jvmtiCapabilities *caps);
374jint jvmtiMajorVersion(void);
375jint jvmtiMinorVersion(void);
376jint jvmtiMicroVersion(void);
377jvmtiError getSourceDebugExtension(jclass clazz, char **extensionPtr);
378jboolean canSuspendResumeThreadLists(void);
379
380jrawMonitorID debugMonitorCreate(char *name);
381void debugMonitorEnter(jrawMonitorID theLock);
382void debugMonitorExit(jrawMonitorID theLock);
383void debugMonitorWait(jrawMonitorID theLock);
384void debugMonitorTimedWait(jrawMonitorID theLock, jlong millis);
385void debugMonitorNotify(jrawMonitorID theLock);
386void debugMonitorNotifyAll(jrawMonitorID theLock);
387void debugMonitorDestroy(jrawMonitorID theLock);
388
389jthread *allThreads(jint *count);
390
391void threadGroupInfo(jthreadGroup, jvmtiThreadGroupInfo *info);
392
393char *getClassname(jclass);
394jvmtiError classSignature(jclass, char**, char**);
395jint classStatus(jclass);
396void writeGenericSignature(struct PacketOutputStream *, char *);
397jboolean isMethodNative(jmethodID);
398jboolean isMethodObsolete(jmethodID);
399jvmtiError isMethodSynthetic(jmethodID, jboolean*);
400jvmtiError isFieldSynthetic(jclass, jfieldID, jboolean*);
401
402jboolean isSameObject(JNIEnv *env, jobject o1, jobject o2);
403
404jint objectHashCode(jobject);
405
406jvmtiError allInterfaces(jclass clazz, jclass **ppinterfaces, jint *count);
407jvmtiError allLoadedClasses(jclass **ppclasses, jint *count);
408jvmtiError allClassLoaderClasses(jobject loader, jclass **ppclasses, jint *count);
409jvmtiError allNestedClasses(jclass clazz, jclass **ppnested, jint *pcount);
410
411void setAgentPropertyValue(JNIEnv *env, char *propertyName, char* propertyValue);
412
413void *jvmtiAllocate(jint numBytes);
414void jvmtiDeallocate(void *buffer);
415
416void eventIndexInit(void);
417jdwpEvent eventIndex2jdwp(EventIndex i);
418jvmtiEvent eventIndex2jvmti(EventIndex i);
419EventIndex jdwp2EventIndex(jdwpEvent eventType);
420EventIndex jvmti2EventIndex(jvmtiEvent kind);
421
422jvmtiError map2jvmtiError(jdwpError);
423jdwpError map2jdwpError(jvmtiError);
424jdwpThreadStatus map2jdwpThreadStatus(jint state);
425jint map2jdwpSuspendStatus(jint state);
426jint map2jdwpClassStatus(jint);
427
428void log_debugee_location(const char *func,
429 jthread thread, jmethodID method, jlocation location);
430
431/*
432 * Local Reference management. The two macros below are used
433 * throughout the back end whenever space for JNI local references
434 * is needed in the current frame.
435 */
436
437void createLocalRefSpace(JNIEnv *env, jint capacity);
438
439#define WITH_LOCAL_REFS(env, number) \
440 createLocalRefSpace(env, number); \
441 { /* BEGINNING OF WITH SCOPE */
442
443#define END_WITH_LOCAL_REFS(env) \
444 JNI_FUNC_PTR(env,PopLocalFrame)(env, NULL); \
445 } /* END OF WITH SCOPE */
446
447void saveGlobalRef(JNIEnv *env, jobject obj, jobject *pobj);
448void tossGlobalRef(JNIEnv *env, jobject *pobj);
449
Alex Lightc53a7db2018-03-22 11:48:26 -0700450/* ANDROID_CHANGED: Expose this method publicly.
451 * This returns a newly allocated jvmtiEnv* with the can_tag_objects capability.
452 */
453jvmtiEnv *getSpecialJvmti(void);
454
duke6e45e102007-12-01 00:00:00 +0000455#endif