| Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. |
| DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| |
| This code is free software; you can redistribute it and/or modify it |
| under the terms of the GNU General Public License version 2 only, as |
| published by the Free Software Foundation. |
| |
| This code is distributed in the hope that it will be useful, but WITHOUT |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| version 2 for more details (a copy is included in the LICENSE file that |
| accompanied this code). |
| |
| You should have received a copy of the GNU General Public License version |
| 2 along with this work; if not, write to the Free Software Foundation, |
| Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| |
| Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| or visit www.oracle.com if you need additional information or have any |
| questions. |
| |
| --------------------------------------------------------------------------------- |
| |
| This directory contains source files of testbase_nsk JVMTI framework, |
| which provides support for JVMTI tests and accessing JVMTI environment. |
| |
| Source files: |
| jvmti_tools.h |
| jvmti_tools.c |
| agent_tools.c |
| Injector.h |
| Injector.c |
| JVMTITools.h |
| JVMTITools.c |
| |
| Naming conventions: |
| macroses: NSK_JVMTI_* |
| functions: nsk_jvmti_* |
| |
| --------------------------------------------------------------------------------- |
| |
| jvmti_tools.h |
| |
| Provides functions and macroses for invocation of JVMTI functions |
| and checking JVMTI errors: |
| |
| NSK_JVMTI_VERIFY(call) |
| NSK_JVMTI_VERIFY_NEGATIVE(call) |
| NSK_JVMTI_VERIFY_CODE(code, action) |
| |
| Also provides functions for running JVMTI agent: |
| |
| - init agent with options: |
| |
| int nsk_jvmti_parseOptions(const char options[]); |
| |
| - access agent options |
| |
| int nsk_jvmti_getWaitTime(); |
| void nsk_jvmti_setWaitTime(int waittime); |
| |
| const char* nsk_jvmti_findOptionValue(const char name[]); |
| const char* nsk_jvmti_findOptionStringValue(const char name[], const char* defaultValue); |
| int nsk_jvmti_findOptionIntValue(const char name[], int defaultValue); |
| |
| int nsk_jvmti_getOptionsCount(); |
| const char* nsk_jvmti_getOptionName(int i); |
| const char* nsk_jvmti_getOptionValue(int i); |
| |
| - create JVMTI environment and register agent thread |
| |
| jvmtiEnv* nsk_jvmti_createJVMTIEnv(JavaVM* jvm, void* reserved); |
| int nsk_jvmti_setAgentProc(jvmtiStartFunction proc, const void* arg); |
| |
| - initialize multiple agent chain via processing of nativeMethodBind event |
| |
| int nsk_jvmti_init_MA(jvmtiEventCallbacks* callbacks); |
| |
| - access agent thread environment |
| |
| jthread nsk_jvmti_getAgentThread(); |
| jvmtiEnv* nsk_jvmti_getAgentJVMTIEnv(); |
| JNIEnv* nsk_jvmti_getAgentJNIEnv(); |
| |
| - synchronize agent with debuggee |
| |
| int nsk_jvmti_waitForSync(jlong timeout); |
| int nsk_jvmti_resumeSync(); |
| void nsk_jvmti_sleep(jlong timeout); |
| |
| - provide proper exit status |
| |
| void nsk_jvmti_setFailStatus(); |
| int nsk_jvmti_isFailStatus(); |
| jint nsk_jvmti_getStatus(); |
| |
| - use locations and breakpoints |
| |
| int nsk_jvmti_addLocationCapabilities(); |
| int nsk_jvmti_addBreakpointCapabilities(); |
| |
| jlocation nsk_jvmti_getLineLocation(jclass cls, jmethodID method, int line); |
| jlocation nsk_jvmti_setLineBreakpoint(jclass cls, jmethodID method, int line); |
| jlocation nsk_jvmti_clearLineBreakpoint(jclass cls, jmethodID method, int line); |
| |
| - find classes and threads |
| |
| jclass nsk_jvmti_classBySignature(const char signature[]); |
| jthread nsk_jvmti_threadByName(const char name[]); |
| |
| - events management |
| |
| int nsk_jvmti_isOptionalEvent(jvmtiEvent event); |
| int nsk_jvmti_enableEvents(jvmtiEventMode enable, int size, |
| jvmtiEvent list[], jthread thread); |
| void nsk_jvmti_showPossessedCapabilities(jvmtiEnv *jvmti); |
| |
| --------------------------------------------------------------------------------- |
| |
| Typical example of usage of NSK_JVMTI_VERIFY and NSK_CPP_STUB macroses |
| for invocation of JVMTI functions: |
| |
| // jvmti->GetVersion(jvmti, &version) |
| if (!NSK_JVMTI_VERIFY( |
| NSK_CPP_STUB2(GetVersion, jvmti, &version) != NULL)) { |
| return JNI_ERR; |
| } |
| |
| or with saving error code: |
| |
| // err = jvmti->GetVersion(jvmti, &version) |
| if (!NSK_JVMTI_VERIFY(err = |
| NSK_CPP_STUB2(GetVersion, jvmti, &version))) { |
| return err; |
| } |
| functions: nsk_jvmti_* |
| |
| --------------------------------------------------------------------------------- |
| |
| JVMTITools.h |
| |
| Provides set of functions which convert JVMTI binary data to |
| a null-terminated character string: |
| |
| |
| const char* TranslateEvent(jvmtiEvent event_type); |
| const char* TranslateState(jint flags); |
| const char* TranslateError(jvmtiError err); |
| const char* TranslatePhase(jvmtiPhase phase); |
| const char* TranslateRootKind(jvmtiHeapRootKind root); |
| const char* TranslateObjectRefKind(jvmtiObjectReferenceKind ref); |
| |
| --------------------------------------------------------------------------------- |
| |
| Injector.h |
| |
| Provides class file format constants and the function which inject some |
| profiling bytecodes into Java class files: |
| |
| int Inject(const u1* old_bytes, const jint old_length, |
| u1** new_bytes, jint* new_length, int bci_mode); |
| |
| --------------------------------------------------------------------------------- |