Exemplo n.º 1
0
        private JvmEnvironment(jvmtiEnvHandle env)
        {
            Contract.Requires <ArgumentException>(env != jvmtiEnvHandle.Null);

            jvmtiInterface rawInterface = (jvmtiInterface)Marshal.PtrToStructure(Marshal.ReadIntPtr(env.Handle), typeof(jvmtiInterface));

            Contract.Assert(rawInterface.GetCapabilities != null);
            Contract.Assert(rawInterface.Allocate != null);
            Contract.Assert(rawInterface.Deallocate != null);
            Contract.Assert(rawInterface.GetThreadState != null);
            Contract.Assert(rawInterface.GetCurrentThread != null);
            Contract.Assert(rawInterface.GetAllThreads != null);
            Contract.Assert(rawInterface.GetThreadInfo != null);
            Contract.Assert(rawInterface.RunAgentThread != null);
            Contract.Assert(rawInterface.SetThreadLocalStorage != null);
            Contract.Assert(rawInterface.GetThreadLocalStorage != null);
            Contract.Assert(rawInterface.GetTopThreadGroups != null);
            Contract.Assert(rawInterface.GetThreadGroupInfo != null);
            Contract.Assert(rawInterface.GetThreadGroupChildren != null);
            Contract.Assert(rawInterface.GetStackTrace != null);
            Contract.Assert(rawInterface.GetAllStackTraces != null);
            Contract.Assert(rawInterface.GetThreadListStackTraces != null);
            Contract.Assert(rawInterface.GetFrameCount != null);
            Contract.Assert(rawInterface.GetFrameLocation != null);
            Contract.Assert(rawInterface.ForceGarbageCollection != null);
            Contract.Assert(rawInterface.GetLoadedClasses != null);
            Contract.Assert(rawInterface.GetClassLoaderClasses != null);
            Contract.Assert(rawInterface.GetClassSignature != null);
            Contract.Assert(rawInterface.GetClassStatus != null);
            Contract.Assert(rawInterface.GetClassModifiers != null);
            Contract.Assert(rawInterface.GetClassMethods != null);
            Contract.Assert(rawInterface.GetClassFields != null);
            Contract.Assert(rawInterface.GetImplementedInterfaces != null);
            Contract.Assert(rawInterface.GetClassVersionNumbers != null);
            Contract.Assert(rawInterface.IsInterface != null);
            Contract.Assert(rawInterface.IsArrayClass != null);
            Contract.Assert(rawInterface.IsModifiableClass != null);
            Contract.Assert(rawInterface.GetClassLoader != null);
            Contract.Assert(rawInterface.GetObjectSize != null);
            Contract.Assert(rawInterface.GetObjectHashCode != null);
            Contract.Assert(rawInterface.GetFieldName != null);
            Contract.Assert(rawInterface.GetFieldDeclaringClass != null);
            Contract.Assert(rawInterface.GetFieldModifiers != null);
            Contract.Assert(rawInterface.GetMethodName != null);
            Contract.Assert(rawInterface.GetMethodDeclaringClass != null);
            Contract.Assert(rawInterface.GetMethodModifiers != null);
            Contract.Assert(rawInterface.GetMaxLocals != null);
            Contract.Assert(rawInterface.GetArgumentsSize != null);
            Contract.Assert(rawInterface.GetMethodLocation != null);
            Contract.Assert(rawInterface.IsMethodNative != null);
            Contract.Assert(rawInterface.IsMethodObsolete != null);
            Contract.Assert(rawInterface.CreateRawMonitor != null);
            Contract.Assert(rawInterface.DestroyRawMonitor != null);
            Contract.Assert(rawInterface.RawMonitorEnter != null);
            Contract.Assert(rawInterface.RawMonitorExit != null);
            Contract.Assert(rawInterface.RawMonitorWait != null);
            Contract.Assert(rawInterface.RawMonitorNotify != null);
            Contract.Assert(rawInterface.RawMonitorNotifyAll != null);
            Contract.Assert(rawInterface.SetJNIFunctionTable != null);
            Contract.Assert(rawInterface.GetJNIFunctionTable != null);
            Contract.Assert(rawInterface.SetEventCallbacks != null);
            Contract.Assert(rawInterface.SetEventNotificationMode != null);
            Contract.Assert(rawInterface.GenerateEvents != null);
            Contract.Assert(rawInterface.GetExtensionFunctions != null);
            Contract.Assert(rawInterface.GetExtensionEvents != null);
            Contract.Assert(rawInterface.SetExtensionEventCallback != null);
            Contract.Assert(rawInterface.GetPotentialCapabilities != null);
            Contract.Assert(rawInterface.AddCapabilities != null);
            Contract.Assert(rawInterface.RelinquishCapabilities != null);
            Contract.Assert(rawInterface.GetCapabilities != null);
            Contract.Assert(rawInterface.GetTimerInfo != null);
            Contract.Assert(rawInterface.GetTime != null);
            Contract.Assert(rawInterface.GetAvailableProcessors != null);
            Contract.Assert(rawInterface.AddToBootstrapClassLoaderSearch != null);
            Contract.Assert(rawInterface.AddToSystemClassLoaderSearch != null);
            Contract.Assert(rawInterface.GetSystemProperties != null);
            Contract.Assert(rawInterface.GetSystemProperty != null);
            Contract.Assert(rawInterface.SetSystemProperty != null);
            Contract.Assert(rawInterface.GetPhase != null);
            Contract.Assert(rawInterface.DisposeEnvironment != null);
            Contract.Assert(rawInterface.SetEnvironmentLocalStorage != null);
            Contract.Assert(rawInterface.GetEnvironmentLocalStorage != null);
            Contract.Assert(rawInterface.GetVersionNumber != null);
            Contract.Assert(rawInterface.GetErrorName != null);
            Contract.Assert(rawInterface.SetVerboseFlag != null);
            Contract.Assert(rawInterface.GetJLocationFormat != null);

            jvmtiCapabilities capabilities;

            if (rawInterface.GetPotentialCapabilities(env, out capabilities) != jvmtiError.None)
            {
                throw new InvalidOperationException();
            }

            Contract.Assert(!capabilities.CanSuspend || rawInterface.SuspendThread != null);
            Contract.Assert(!capabilities.CanSuspend || rawInterface.SuspendThreadList != null);
            Contract.Assert(!capabilities.CanSuspend || rawInterface.ResumeThread != null);
            Contract.Assert(!capabilities.CanSuspend || rawInterface.ResumeThreadList != null);

            Contract.Assert(!capabilities.CanSignalThread || rawInterface.StopThread != null);
            Contract.Assert(!capabilities.CanSignalThread || rawInterface.InterruptThread != null);

            Contract.Assert(!capabilities.CanGetOwnedMonitorInfo || rawInterface.GetOwnedMonitorInfo != null);

            Contract.Assert(!capabilities.CanGetOwnedMonitorStackDepthInfo || rawInterface.GetOwnedMonitorStackDepthInfo != null);
            Contract.Assert(!capabilities.CanGetCurrentContendedMonitor || rawInterface.GetCurrentContendedMonitor != null);
            Contract.Assert(!capabilities.CanPopFrame || rawInterface.PopFrame != null);
            Contract.Assert(!capabilities.CanGenerateFramePopEvents || rawInterface.NotifyFramePop != null);
            Contract.Assert(!capabilities.CanForceEarlyReturn || rawInterface.ForceEarlyReturnObject != null);
            Contract.Assert(!capabilities.CanForceEarlyReturn || rawInterface.ForceEarlyReturnInt != null);
            Contract.Assert(!capabilities.CanForceEarlyReturn || rawInterface.ForceEarlyReturnLong != null);
            Contract.Assert(!capabilities.CanForceEarlyReturn || rawInterface.ForceEarlyReturnFloat != null);
            Contract.Assert(!capabilities.CanForceEarlyReturn || rawInterface.ForceEarlyReturnDouble != null);
            Contract.Assert(!capabilities.CanForceEarlyReturn || rawInterface.ForceEarlyReturnVoid != null);
            Contract.Assert(!capabilities.CanTagObjects || rawInterface.FollowReferences != null);
            Contract.Assert(!capabilities.CanTagObjects || rawInterface.IterateThroughHeap != null);
            Contract.Assert(!capabilities.CanTagObjects || rawInterface.GetTag != null);
            Contract.Assert(!capabilities.CanTagObjects || rawInterface.SetTag != null);
            Contract.Assert(!capabilities.CanTagObjects || rawInterface.GetObjectsWithTags != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.GetLocalObject != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.GetLocalInstance != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.GetLocalInt != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.GetLocalLong != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.GetLocalFloat != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.GetLocalDouble != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.SetLocalObject != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.SetLocalInt != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.SetLocalLong != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.SetLocalFloat != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.SetLocalDouble != null);
            Contract.Assert(!capabilities.CanGenerateBreakpointEvents || rawInterface.SetBreakpoint != null);
            Contract.Assert(!capabilities.CanGenerateBreakpointEvents || rawInterface.ClearBreakpoint != null);
            Contract.Assert(!capabilities.CanGenerateFieldAccessEvents || rawInterface.SetFieldAccessWatch != null);
            Contract.Assert(!capabilities.CanGenerateFieldAccessEvents || rawInterface.ClearFieldAccessWatch != null);
            Contract.Assert(!capabilities.CanGenerateFieldModificationEvents || rawInterface.SetFieldModificationWatch != null);
            Contract.Assert(!capabilities.CanGenerateFieldModificationEvents || rawInterface.ClearFieldModificationWatch != null);

            Contract.Assert(!capabilities.CanGetSourceFileName || rawInterface.GetSourceFileName != null);

            Contract.Assert(!capabilities.CanGetConstantPool || rawInterface.GetConstantPool != null);

            Contract.Assert(!capabilities.CanGetSourceDebugExtension || rawInterface.GetSourceDebugExtension != null);
            Contract.Assert(!capabilities.CanRetransformClasses || rawInterface.RetransformClasses != null);
            Contract.Assert(!capabilities.CanRedefineClasses || rawInterface.RedefineClasses != null);

            Contract.Assert(!capabilities.CanGetMonitorInfo || rawInterface.GetObjectMonitorUsage != null);

            Contract.Assert(!capabilities.CanGetSyntheticAttribute || rawInterface.IsFieldSynthetic != null);
            Contract.Assert(!capabilities.CanGetLineNumbers || rawInterface.GetLineNumberTable != null);
            Contract.Assert(!capabilities.CanAccessLocalVariables || rawInterface.GetLocalVariableTable != null);
            Contract.Assert(!capabilities.CanGetBytecodes || rawInterface.GetBytecodes != null);
            Contract.Assert(!capabilities.CanGetSyntheticAttribute || rawInterface.IsMethodSynthetic != null);
            Contract.Assert(!capabilities.CanSetNativeMethodPrefix || rawInterface.SetNativeMethodPrefix != null);
            Contract.Assert(!capabilities.CanSetNativeMethodPrefix || rawInterface.SetNativeMethodPrefixes != null);

            Contract.Assert(!capabilities.CanGetCurrentThreadCpuTime || rawInterface.GetCurrentThreadCpuTimerInfo != null);
            Contract.Assert(!capabilities.CanGetCurrentThreadCpuTime || rawInterface.GetCurrentThreadCpuTime != null);
            Contract.Assert(!capabilities.CanGetThreadCpuTime || rawInterface.GetCurrentThreadCpuTimerInfo != null);
            Contract.Assert(!capabilities.CanGetThreadCpuTime || rawInterface.GetCurrentThreadCpuTime != null);

            capabilities = new jvmtiCapabilities(
                jvmtiCapabilities.CapabilityFlags1.CanTagObjects
                | jvmtiCapabilities.CapabilityFlags1.CanGetSourceFileName
                | jvmtiCapabilities.CapabilityFlags1.CanGetLineNumbers
                );
            rawInterface.AddCapabilities(env, ref capabilities);

            _env          = env;
            _rawInterface = rawInterface;

            _eventManager = new JvmEventManager(this);
            _eventManager.Attach();
        }
Exemplo n.º 2
0
 public void RelinquishCapabilities(jvmtiCapabilities capabilities)
 {
     ThrowOnFailure(_rawInterface.AddCapabilities(_env, ref capabilities));
 }
Exemplo n.º 3
0
        internal void Attach()
        {
            _environment.SetEventCallbacks(_eventCallbacks);

            jvmtiCapabilities capabilities = _environment.GetCapabilities();

            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.VMStart);
            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.VMInit);
            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.VMDeath);
            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.ThreadStart);
            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.ThreadEnd);
            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.ClassLoad);
            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.ClassPrepare);
#if false
            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.ClassFileLoadHook);
            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.DynamicCodeGenerated);
            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.DataDumpRequest);
            _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.ResourceExhausted);
            //_environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.DataResetRequest);

            if (capabilities.CanGenerateExceptionEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.Exception);
            }
            if (capabilities.CanGenerateExceptionEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.ExceptionCatch);
            }
            if (capabilities.CanGenerateSingleStepEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.SingleStep);
            }
            if (capabilities.CanGenerateFramePopEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.FramePop);
            }
            if (capabilities.CanGenerateBreakpointEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.Breakpoint);
            }
            if (capabilities.CanGenerateFieldAccessEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.FieldAccess);
            }
            if (capabilities.CanGenerateFieldModificationEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.FieldModification);
            }
            if (capabilities.CanGenerateMethodEntryEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.MethodEntry);
            }
            if (capabilities.CanGenerateMethodExitEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.MethodExit);
            }
            if (capabilities.CanGenerateNativeMethodBindEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.NativeMethodBind);
            }
            if (capabilities.CanGenerateCompiledMethodLoadEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.CompiledMethodLoad);
            }
            if (capabilities.CanGenerateCompiledMethodLoadEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.CompiledMethodUnload);
            }
            if (capabilities.CanGenerateMonitorEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.MonitorWait);
            }
            if (capabilities.CanGenerateMonitorEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.MonitorWaited);
            }
            if (capabilities.CanGenerateMonitorEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.MonitorContendedEnter);
            }
            if (capabilities.CanGenerateMonitorEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.MonitorContendedEntered);
            }
            if (capabilities.CanGenerateGarbageCollectionEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.GarbageCollectionStart);
            }
            if (capabilities.CanGenerateGarbageCollectionEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.GarbageCollectionFinish);
            }
            if (capabilities.CanGenerateObjectFreeEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.ObjectFree);
            }
            if (capabilities.CanGenerateVmObjectAllocEvents)
            {
                _environment.SetEventNotificationMode(JvmEventMode.Enable, JvmEventType.VMObjectAlloc);
            }
#endif
        }