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