提交 9d8f9eeb 编写于 作者: A amurillo

Merge

...@@ -87,6 +87,9 @@ include lib/Awt2dLibraries.gmk ...@@ -87,6 +87,9 @@ include lib/Awt2dLibraries.gmk
include lib/SoundLibraries.gmk include lib/SoundLibraries.gmk
# Include the corresponding custom file, if present.
-include $(CUSTOM_MAKE_DIR)/CompileNativeLibraries.gmk
########################################################################################## ##########################################################################################
all: $(COPY_FILES) $(BUILD_LIBRARIES) all: $(COPY_FILES) $(BUILD_LIBRARIES)
......
/*
* Copyright (c) 2014, 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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.
*/
package com.sun.tools.attach;
import java.io.IOException;
/**
* Exception type to signal that an attach operation failed in the target VM.
*
* <p> This exception can be thrown by the various operations of
* {@link com.sun.tools.attach.VirtualMachine} when the operation
* fails in the target VM. If there is a communication error,
* a regular IOException will be thrown.
*
* @since 1.9
*/
@jdk.Exported
public class AttachOperationFailedException extends IOException {
private static final long serialVersionUID = 2140308168167478043L;
/**
* Constructs an <code>AttachOperationFailedException</code> with
* the specified detail message.
*
* @param s the detail message.
*/
public AttachOperationFailedException(String message) {
super(message);
}
}
/* /*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -76,16 +76,10 @@ import java.io.IOException; ...@@ -76,16 +76,10 @@ import java.io.IOException;
* // attach to target VM * // attach to target VM
* VirtualMachine vm = VirtualMachine.attach("2177"); * VirtualMachine vm = VirtualMachine.attach("2177");
* *
* // get system properties in target VM * // start management agent
* Properties props = vm.getSystemProperties(); * Properties props = new Properties();
* * props.put("com.sun.management.jmxremote.port", "5000");
* // construct path to management agent * vm.startManagementAgent(props);
* String home = props.getProperty("java.home");
* String agent = home + File.separator + "lib" + File.separator
* + "management-agent.jar";
*
* // load agent into target VM
* vm.loadAgent(agent, "com.sun.management.jmxremote.port=5000");
* *
* // detach * // detach
* vm.detach(); * vm.detach();
...@@ -93,9 +87,9 @@ import java.io.IOException; ...@@ -93,9 +87,9 @@ import java.io.IOException;
* </pre> * </pre>
* *
* <p> In this example we attach to a Java virtual machine that is identified by * <p> In this example we attach to a Java virtual machine that is identified by
* the process identifier <code>2177</code>. The system properties from the target * the process identifier <code>2177</code>. Then the JMX management agent is
* VM are then used to construct the path to a <i>management agent</i> which is then * started in the target process using the supplied arguments. Finally, the
* loaded into the target VM. Once loaded the client detaches from the target VM. </p> * client detaches from the target VM. </p>
* *
* <p> A VirtualMachine is safe for use by multiple concurrent threads. </p> * <p> A VirtualMachine is safe for use by multiple concurrent threads. </p>
* *
...@@ -564,8 +558,15 @@ public abstract class VirtualMachine { ...@@ -564,8 +558,15 @@ public abstract class VirtualMachine {
* *
* @return The system properties * @return The system properties
* *
* @throws AttachOperationFailedException
* If the target virtual machine is unable to complete the
* attach operation. A more specific error message will be
* given by {@link AttachOperationFailedException#getMessage()}.
*
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs, a communication error for example,
* that cannot be identified as an error to indicate that the
* operation failed in the target VM.
* *
* @see java.lang.System#getProperties * @see java.lang.System#getProperties
* @see #loadAgentLibrary * @see #loadAgentLibrary
...@@ -591,11 +592,80 @@ public abstract class VirtualMachine { ...@@ -591,11 +592,80 @@ public abstract class VirtualMachine {
* *
* @return The agent properties * @return The agent properties
* *
* @throws AttachOperationFailedException
* If the target virtual machine is unable to complete the
* attach operation. A more specific error message will be
* given by {@link AttachOperationFailedException#getMessage()}.
*
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs, a communication error for example,
* that cannot be identified as an error to indicate that the
* operation failed in the target VM.
*/ */
public abstract Properties getAgentProperties() throws IOException; public abstract Properties getAgentProperties() throws IOException;
/**
* Starts the JMX management agent in the target virtual machine.
*
* <p> The configuration properties are the same as those specified on
* the command line when starting the JMX management agent. In the same
* way as on the command line, you need to specify at least the
* {@code com.sun.management.jmxremote.port} property.
*
* <p> See the online documentation for <a
* href="../../../../../../../../technotes/guides/management/agent.html">
* Monitoring and Management Using JMX Technology</a> for further details.
*
* @param agentProperties
* A Properties object containing the configuration properties
* for the agent.
*
* @throws AttachOperationFailedException
* If the target virtual machine is unable to complete the
* attach operation. A more specific error message will be
* given by {@link AttachOperationFailedException#getMessage()}.
*
* @throws IOException
* If an I/O error occurs, a communication error for example,
* that cannot be identified as an error to indicate that the
* operation failed in the target VM.
*
* @throws IllegalArgumentException
* If keys or values in agentProperties are invalid.
*
* @throws NullPointerException
* If agentProperties is null.
*
* @since 1.8
*/
public abstract void startManagementAgent(Properties agentProperties) throws IOException;
/**
* Starts the local JMX management agent in the target virtual machine.
*
* <p> See the online documentation for <a
* href="../../../../../../../../technotes/guides/management/agent.html">
* Monitoring and Management Using JMX Technology</a> for further details.
*
* @return The String representation of the local connector's service address.
* The value can be parsed by the
* {@link javax.management.remote.JMXServiceURL#JMXServiceURL(String)}
* constructor.
*
* @throws AttachOperationFailedException
* If the target virtual machine is unable to complete the
* attach operation. A more specific error message will be
* given by {@link AttachOperationFailedException#getMessage()}.
*
* @throws IOException
* If an I/O error occurs, a communication error for example,
* that cannot be identified as an error to indicate that the
* operation failed in the target VM.
*
* @since 1.8
*/
public abstract String startLocalManagementAgent() throws IOException;
/** /**
* Returns a hash-code value for this VirtualMachine. The hash * Returns a hash-code value for this VirtualMachine. The hash
* code is based upon the VirtualMachine's components, and satifies * code is based upon the VirtualMachine's components, and satifies
......
/* /*
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -130,11 +130,15 @@ public final class Class<T> implements java.io.Serializable, ...@@ -130,11 +130,15 @@ public final class Class<T> implements java.io.Serializable,
} }
/* /*
* Constructor. Only the Java Virtual Machine creates Class * Private constructor. Only the Java Virtual Machine creates Class objects.
* objects. * This constructor is not used and prevents the default constructor being
* generated.
*/ */
private Class() {} private Class(ClassLoader loader) {
// Initialize final field for classLoader. The initialization value of non-null
// prevents future JIT optimizations from assuming this final field is null.
classLoader = loader;
}
/** /**
* Converts the object to a string. The string representation is the * Converts the object to a string. The string representation is the
...@@ -677,8 +681,10 @@ public final class Class<T> implements java.io.Serializable, ...@@ -677,8 +681,10 @@ public final class Class<T> implements java.io.Serializable,
} }
// Package-private to allow ClassLoader access // Package-private to allow ClassLoader access
native ClassLoader getClassLoader0(); ClassLoader getClassLoader0() { return classLoader; }
// Initialized in JVM not by private constructor
private final ClassLoader classLoader;
/** /**
* Returns an array of {@code TypeVariable} objects that represent the * Returns an array of {@code TypeVariable} objects that represent the
......
/* /*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -129,16 +129,24 @@ public class AccessibleObject implements AnnotatedElement { ...@@ -129,16 +129,24 @@ public class AccessibleObject implements AnnotatedElement {
setAccessible0(this, flag); setAccessible0(this, flag);
} }
/* Check that you aren't exposing java.lang.Class.<init>. */ /* Check that you aren't exposing java.lang.Class.<init> or sensitive
fields in java.lang.Class. */
private static void setAccessible0(AccessibleObject obj, boolean flag) private static void setAccessible0(AccessibleObject obj, boolean flag)
throws SecurityException throws SecurityException
{ {
if (obj instanceof Constructor && flag == true) { if (obj instanceof Constructor && flag == true) {
Constructor<?> c = (Constructor<?>)obj; Constructor<?> c = (Constructor<?>)obj;
if (c.getDeclaringClass() == Class.class) { if (c.getDeclaringClass() == Class.class) {
throw new SecurityException("Can not make a java.lang.Class" + throw new SecurityException("Cannot make a java.lang.Class" +
" constructor accessible"); " constructor accessible");
} }
} else if (obj instanceof Field && flag == true) {
Field f = (Field)obj;
if (f.getDeclaringClass() == Class.class &&
f.getName().equals("classLoader")) {
throw new SecurityException("Cannot make java.lang.Class.classLoader" +
" accessible");
}
} }
obj.override = flag; obj.override = flag;
} }
......
/* /*
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -33,7 +33,7 @@ import com.sun.tools.attach.spi.AttachProvider; ...@@ -33,7 +33,7 @@ import com.sun.tools.attach.spi.AttachProvider;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Properties; import java.util.Properties;
import java.util.Map; import java.util.stream.Collectors;
/* /*
* The HotSpot implementation of com.sun.tools.attach.VirtualMachine. * The HotSpot implementation of com.sun.tools.attach.VirtualMachine.
...@@ -161,6 +161,50 @@ public abstract class HotSpotVirtualMachine extends VirtualMachine { ...@@ -161,6 +161,50 @@ public abstract class HotSpotVirtualMachine extends VirtualMachine {
return props; return props;
} }
private static final String MANAGMENT_PREFIX = "com.sun.management.";
private static boolean checkedKeyName(Object key) {
if (!(key instanceof String)) {
throw new IllegalArgumentException("Invalid option (not a String): "+key);
}
if (!((String)key).startsWith(MANAGMENT_PREFIX)) {
throw new IllegalArgumentException("Invalid option: "+key);
}
return true;
}
private static String stripKeyName(Object key) {
return ((String)key).substring(MANAGMENT_PREFIX.length());
}
@Override
public void startManagementAgent(Properties agentProperties) throws IOException {
if (agentProperties == null) {
throw new NullPointerException("agentProperties cannot be null");
}
// Convert the arguments into arguments suitable for the Diagnostic Command:
// "ManagementAgent.start jmxremote.port=5555 jmxremote.authenticate=false"
String args = agentProperties.entrySet().stream()
.filter(entry -> checkedKeyName(entry.getKey()))
.map(entry -> stripKeyName(entry.getKey()) + "=" + escape(entry.getValue()))
.collect(Collectors.joining(" "));
executeJCmd("ManagementAgent.start " + args);
}
private String escape(Object arg) {
String value = arg.toString();
if (value.contains(" ")) {
return "'" + value + "'";
}
return value;
}
@Override
public String startLocalManagementAgent() throws IOException {
executeJCmd("ManagementAgent.start_local");
return getAgentProperties().getProperty("com.sun.management.jmxremote.localConnectorAddress");
}
// --- HotSpot specific methods --- // --- HotSpot specific methods ---
// same as SIGQUIT // same as SIGQUIT
...@@ -257,6 +301,20 @@ public abstract class HotSpotVirtualMachine extends VirtualMachine { ...@@ -257,6 +301,20 @@ public abstract class HotSpotVirtualMachine extends VirtualMachine {
return value; return value;
} }
/*
* Utility method to read data into a String.
*/
String readErrorMessage(InputStream sis) throws IOException {
byte b[] = new byte[1024];
int n;
StringBuffer message = new StringBuffer();
while ((n = sis.read(b)) != -1) {
message.append(new String(b, 0, n, "UTF-8"));
}
return message.toString();
}
// -- attach timeout support // -- attach timeout support
private static long defaultAttachTimeout = 5000; private static long defaultAttachTimeout = 5000;
......
/* /*
* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -33,10 +33,12 @@ import java.util.ArrayList; ...@@ -33,10 +33,12 @@ import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import com.sun.tools.attach.AttachOperationFailedException;
import com.sun.tools.attach.VirtualMachine; import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor; import com.sun.tools.attach.VirtualMachineDescriptor;
import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.AttachNotSupportedException;
import sun.tools.attach.HotSpotVirtualMachine; import sun.tools.attach.HotSpotVirtualMachine;
import sun.tools.jstat.JStatLogger; import sun.tools.jstat.JStatLogger;
import sun.jvmstat.monitor.Monitor; import sun.jvmstat.monitor.Monitor;
...@@ -119,6 +121,7 @@ public class JCmd { ...@@ -119,6 +121,7 @@ public class JCmd {
pids.add(arg.getPid() + ""); pids.add(arg.getPid() + "");
} }
boolean success = true;
for (String pid : pids) { for (String pid : pids) {
System.out.println(pid + ":"); System.out.println(pid + ":");
if (arg.isListCounters()) { if (arg.isListCounters()) {
...@@ -126,11 +129,16 @@ public class JCmd { ...@@ -126,11 +129,16 @@ public class JCmd {
} else { } else {
try { try {
executeCommandForPid(pid, arg.getCommand()); executeCommandForPid(pid, arg.getCommand());
} catch(AttachOperationFailedException ex) {
System.err.println(ex.getMessage());
success = false;
} catch(Exception ex) { } catch(Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
success = false;
} }
} }
} }
System.exit(success ? 0 : 1);
} }
private static void executeCommandForPid(String pid, String command) private static void executeCommandForPid(String pid, String command)
...@@ -150,13 +158,18 @@ public class JCmd { ...@@ -150,13 +158,18 @@ public class JCmd {
// read to EOF and just print output // read to EOF and just print output
byte b[] = new byte[256]; byte b[] = new byte[256];
int n; int n;
boolean messagePrinted = false;
do { do {
n = in.read(b); n = in.read(b);
if (n > 0) { if (n > 0) {
String s = new String(b, 0, n, "UTF-8"); String s = new String(b, 0, n, "UTF-8");
System.out.print(s); System.out.print(s);
messagePrinted = true;
} }
} while (n > 0); } while (n > 0);
if (!messagePrinted) {
System.out.println("Command executed successfully");
}
} }
} }
vm.detach(); vm.detach();
......
/* /*
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -32,8 +32,6 @@ import java.io.File; ...@@ -32,8 +32,6 @@ import java.io.File;
// Sun specific // Sun specific
import com.sun.tools.attach.VirtualMachine; import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor; import com.sun.tools.attach.VirtualMachineDescriptor;
import com.sun.tools.attach.AgentInitializationException;
import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.AttachNotSupportedException;
// Sun private // Sun private
...@@ -238,35 +236,7 @@ public class LocalVirtualMachine { ...@@ -238,35 +236,7 @@ public class LocalVirtualMachine {
throw ioe; throw ioe;
} }
String home = vm.getSystemProperties().getProperty("java.home"); vm.startLocalManagementAgent();
// Normally in ${java.home}/jre/lib/management-agent.jar but might
// be in ${java.home}/lib in build environments.
String agent = home + File.separator + "jre" + File.separator +
"lib" + File.separator + "management-agent.jar";
File f = new File(agent);
if (!f.exists()) {
agent = home + File.separator + "lib" + File.separator +
"management-agent.jar";
f = new File(agent);
if (!f.exists()) {
throw new IOException("Management agent not found");
}
}
agent = f.getCanonicalPath();
try {
vm.loadAgent(agent, "com.sun.management.jmxremote");
} catch (AgentLoadException x) {
IOException ioe = new IOException(x.getMessage());
ioe.initCause(x);
throw ioe;
} catch (AgentInitializationException x) {
IOException ioe = new IOException(x.getMessage());
ioe.initCause(x);
throw ioe;
}
// get the connector address // get the connector address
Properties agentProps = vm.getAgentProperties(); Properties agentProps = vm.getAgentProperties();
......
/* /*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -426,9 +426,6 @@ JVM_GetClassName(JNIEnv *env, jclass cls); ...@@ -426,9 +426,6 @@ JVM_GetClassName(JNIEnv *env, jclass cls);
JNIEXPORT jobjectArray JNICALL JNIEXPORT jobjectArray JNICALL
JVM_GetClassInterfaces(JNIEnv *env, jclass cls); JVM_GetClassInterfaces(JNIEnv *env, jclass cls);
JNIEXPORT jobject JNICALL
JVM_GetClassLoader(JNIEnv *env, jclass cls);
JNIEXPORT jboolean JNICALL JNIEXPORT jboolean JNICALL
JVM_IsInterface(JNIEnv *env, jclass cls); JVM_IsInterface(JNIEnv *env, jclass cls);
......
/* /*
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -1357,16 +1357,9 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset) ...@@ -1357,16 +1357,9 @@ verify_opcode_operands(context_type *context, unsigned int inumber, int offset)
} }
(*env)->DeleteLocalRef(env, super); (*env)->DeleteLocalRef(env, super);
/* The optimizer make cause this to happen on local code */ /* The optimizer may cause this to happen on local code */
if (not_found) { if (not_found) {
#ifdef BROKEN_JAVAC CCerror(context, "Illegal use of nonvirtual function call");
jobject loader = JVM_GetClassLoader(env, context->class);
int has_loader = (loader != 0);
(*env)->DeleteLocalRef(env, loader);
if (has_loader)
#endif /* BROKEN_JAVAC */
CCerror(context,
"Illegal use of nonvirtual function call");
} }
} }
} }
......
/* /*
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -45,7 +45,6 @@ extern jboolean VerifyFixClassname(char *utf_name); ...@@ -45,7 +45,6 @@ extern jboolean VerifyFixClassname(char *utf_name);
#define CLS "Ljava/lang/Class;" #define CLS "Ljava/lang/Class;"
#define CPL "Lsun/reflect/ConstantPool;" #define CPL "Lsun/reflect/ConstantPool;"
#define STR "Ljava/lang/String;" #define STR "Ljava/lang/String;"
#define JCL "Ljava/lang/ClassLoader;"
#define FLD "Ljava/lang/reflect/Field;" #define FLD "Ljava/lang/reflect/Field;"
#define MHD "Ljava/lang/reflect/Method;" #define MHD "Ljava/lang/reflect/Method;"
#define CTR "Ljava/lang/reflect/Constructor;" #define CTR "Ljava/lang/reflect/Constructor;"
...@@ -56,7 +55,6 @@ static JNINativeMethod methods[] = { ...@@ -56,7 +55,6 @@ static JNINativeMethod methods[] = {
{"getName0", "()" STR, (void *)&JVM_GetClassName}, {"getName0", "()" STR, (void *)&JVM_GetClassName},
{"getSuperclass", "()" CLS, NULL}, {"getSuperclass", "()" CLS, NULL},
{"getInterfaces0", "()[" CLS, (void *)&JVM_GetClassInterfaces}, {"getInterfaces0", "()[" CLS, (void *)&JVM_GetClassInterfaces},
{"getClassLoader0", "()" JCL, (void *)&JVM_GetClassLoader},
{"isInterface", "()Z", (void *)&JVM_IsInterface}, {"isInterface", "()Z", (void *)&JVM_IsInterface},
{"getSigners", "()[" OBJ, (void *)&JVM_GetClassSigners}, {"getSigners", "()[" OBJ, (void *)&JVM_GetClassSigners},
{"setSigners", "([" OBJ ")V", (void *)&JVM_SetClassSigners}, {"setSigners", "([" OBJ ")V", (void *)&JVM_SetClassSigners},
...@@ -81,7 +79,6 @@ static JNINativeMethod methods[] = { ...@@ -81,7 +79,6 @@ static JNINativeMethod methods[] = {
#undef OBJ #undef OBJ
#undef CLS #undef CLS
#undef STR #undef STR
#undef JCL
#undef FLD #undef FLD
#undef MHD #undef MHD
#undef CTR #undef CTR
......
/* /*
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -24,14 +24,14 @@ ...@@ -24,14 +24,14 @@
*/ */
package sun.tools.attach; package sun.tools.attach;
import com.sun.tools.attach.VirtualMachine; import com.sun.tools.attach.AttachOperationFailedException;
import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.spi.AttachProvider; import com.sun.tools.attach.spi.AttachProvider;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.io.File; import java.io.File;
import java.util.Properties;
/* /*
* Bsd implementation of HotSpotVirtualMachine * Bsd implementation of HotSpotVirtualMachine
...@@ -191,6 +191,8 @@ public class BsdVirtualMachine extends HotSpotVirtualMachine { ...@@ -191,6 +191,8 @@ public class BsdVirtualMachine extends HotSpotVirtualMachine {
} }
if (completionStatus != 0) { if (completionStatus != 0) {
// read from the stream and use that as the error message
String message = readErrorMessage(sis);
sis.close(); sis.close();
// In the event of a protocol mismatch then the target VM // In the event of a protocol mismatch then the target VM
...@@ -205,7 +207,11 @@ public class BsdVirtualMachine extends HotSpotVirtualMachine { ...@@ -205,7 +207,11 @@ public class BsdVirtualMachine extends HotSpotVirtualMachine {
if (cmd.equals("load")) { if (cmd.equals("load")) {
throw new AgentLoadException("Failed to load agent library"); throw new AgentLoadException("Failed to load agent library");
} else { } else {
throw new IOException("Command failed in target VM"); if (message == null) {
throw new AttachOperationFailedException("Command failed in target VM");
} else {
throw new AttachOperationFailedException(message);
}
} }
} }
...@@ -237,8 +243,9 @@ public class BsdVirtualMachine extends HotSpotVirtualMachine { ...@@ -237,8 +243,9 @@ public class BsdVirtualMachine extends HotSpotVirtualMachine {
if ((off < 0) || (off > bs.length) || (len < 0) || if ((off < 0) || (off > bs.length) || (len < 0) ||
((off + len) > bs.length) || ((off + len) < 0)) { ((off + len) > bs.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException(); throw new IndexOutOfBoundsException();
} else if (len == 0) } else if (len == 0) {
return 0; return 0;
}
return BsdVirtualMachine.read(s, bs, off, len); return BsdVirtualMachine.read(s, bs, off, len);
} }
......
/* /*
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -24,14 +24,14 @@ ...@@ -24,14 +24,14 @@
*/ */
package sun.tools.attach; package sun.tools.attach;
import com.sun.tools.attach.VirtualMachine; import com.sun.tools.attach.AttachOperationFailedException;
import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.spi.AttachProvider; import com.sun.tools.attach.spi.AttachProvider;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.io.File; import java.io.File;
import java.util.Properties;
/* /*
* Linux implementation of HotSpotVirtualMachine * Linux implementation of HotSpotVirtualMachine
...@@ -207,6 +207,8 @@ public class LinuxVirtualMachine extends HotSpotVirtualMachine { ...@@ -207,6 +207,8 @@ public class LinuxVirtualMachine extends HotSpotVirtualMachine {
} }
if (completionStatus != 0) { if (completionStatus != 0) {
// read from the stream and use that as the error message
String message = readErrorMessage(sis);
sis.close(); sis.close();
// In the event of a protocol mismatch then the target VM // In the event of a protocol mismatch then the target VM
...@@ -221,7 +223,11 @@ public class LinuxVirtualMachine extends HotSpotVirtualMachine { ...@@ -221,7 +223,11 @@ public class LinuxVirtualMachine extends HotSpotVirtualMachine {
if (cmd.equals("load")) { if (cmd.equals("load")) {
throw new AgentLoadException("Failed to load agent library"); throw new AgentLoadException("Failed to load agent library");
} else { } else {
throw new IOException("Command failed in target VM"); if (message == null) {
throw new AttachOperationFailedException("Command failed in target VM");
} else {
throw new AttachOperationFailedException(message);
}
} }
} }
......
/* /*
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -24,15 +24,15 @@ ...@@ -24,15 +24,15 @@
*/ */
package sun.tools.attach; package sun.tools.attach;
import com.sun.tools.attach.VirtualMachine; import com.sun.tools.attach.AttachOperationFailedException;
import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.spi.AttachProvider; import com.sun.tools.attach.spi.AttachProvider;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.Properties;
/* /*
* Solaris implementation of HotSpotVirtualMachine. * Solaris implementation of HotSpotVirtualMachine.
...@@ -147,11 +147,17 @@ public class SolarisVirtualMachine extends HotSpotVirtualMachine { ...@@ -147,11 +147,17 @@ public class SolarisVirtualMachine extends HotSpotVirtualMachine {
// If non-0 it means an error but we need to special-case the // If non-0 it means an error but we need to special-case the
// "load" command to ensure that the right exception is thrown. // "load" command to ensure that the right exception is thrown.
if (completionStatus != 0) { if (completionStatus != 0) {
// read from the stream and use that as the error message
String message = readErrorMessage(sis);
sis.close(); sis.close();
if (cmd.equals("load")) { if (cmd.equals("load")) {
throw new AgentLoadException("Failed to load agent library"); throw new AgentLoadException("Failed to load agent library");
} else { } else {
throw new IOException("Command failed in target VM"); if (message == null) {
throw new AttachOperationFailedException("Command failed in target VM");
} else {
throw new AttachOperationFailedException(message);
}
} }
} }
......
/* /*
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -198,14 +198,14 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_BsdVirtualMachine_read ...@@ -198,14 +198,14 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_BsdVirtualMachine_read
len = remaining; len = remaining;
} }
RESTARTABLE(read(fd, buf+off, len), n); RESTARTABLE(read(fd, buf, len), n);
if (n == -1) { if (n == -1) {
JNU_ThrowIOExceptionWithLastError(env, "read"); JNU_ThrowIOExceptionWithLastError(env, "read");
} else { } else {
if (n == 0) { if (n == 0) {
n = -1; // EOF n = -1; // EOF
} else { } else {
(*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf));
} }
} }
return n; return n;
......
...@@ -416,14 +416,14 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_LinuxVirtualMachine_read ...@@ -416,14 +416,14 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_LinuxVirtualMachine_read
len = remaining; len = remaining;
} }
RESTARTABLE(read(fd, buf+off, len), n); RESTARTABLE(read(fd, buf, len), n);
if (n == -1) { if (n == -1) {
JNU_ThrowIOExceptionWithLastError(env, "read"); JNU_ThrowIOExceptionWithLastError(env, "read");
} else { } else {
if (n == 0) { if (n == 0) {
n = -1; // EOF n = -1; // EOF
} else { } else {
(*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf));
} }
} }
return n; return n;
......
/* /*
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -161,14 +161,14 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_SolarisVirtualMachine_read ...@@ -161,14 +161,14 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_SolarisVirtualMachine_read
len = remaining; len = remaining;
} }
RESTARTABLE(read(fd, buf+off, len), n); RESTARTABLE(read(fd, buf, len), n);
if (n == -1) { if (n == -1) {
JNU_ThrowIOExceptionWithLastError(env, "read"); JNU_ThrowIOExceptionWithLastError(env, "read");
} else { } else {
if (n == 0) { if (n == 0) {
n = -1; // EOF n = -1; // EOF
} else { } else {
(*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf));
} }
} }
return n; return n;
......
/* /*
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -24,15 +24,15 @@ ...@@ -24,15 +24,15 @@
*/ */
package sun.tools.attach; package sun.tools.attach;
import com.sun.tools.attach.VirtualMachine; import com.sun.tools.attach.AttachOperationFailedException;
import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.spi.AttachProvider; import com.sun.tools.attach.spi.AttachProvider;
import sun.tools.attach.HotSpotVirtualMachine; import sun.tools.attach.HotSpotVirtualMachine;
import java.io.IOException; import java.io.IOException;
import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.util.Properties;
import java.util.Random; import java.util.Random;
public class WindowsVirtualMachine extends HotSpotVirtualMachine { public class WindowsVirtualMachine extends HotSpotVirtualMachine {
...@@ -105,11 +105,17 @@ public class WindowsVirtualMachine extends HotSpotVirtualMachine { ...@@ -105,11 +105,17 @@ public class WindowsVirtualMachine extends HotSpotVirtualMachine {
// read completion status // read completion status
int status = readInt(is); int status = readInt(is);
if (status != 0) { if (status != 0) {
// read from the stream and use that as the error message
String message = readErrorMessage(is);
// special case the load command so that the right exception is thrown // special case the load command so that the right exception is thrown
if (cmd.equals("load")) { if (cmd.equals("load")) {
throw new AgentLoadException("Failed to load agent library"); throw new AgentLoadException("Failed to load agent library");
} else { } else {
throw new IOException("Command failed in target VM"); if (message == null) {
throw new AttachOperationFailedException("Command failed in target VM");
} else {
throw new AttachOperationFailedException(message);
}
} }
} }
......
...@@ -341,7 +341,7 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_WindowsVirtualMachine_readPipe ...@@ -341,7 +341,7 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_WindowsVirtualMachine_readPipe
if (nread == 0) { if (nread == 0) {
return (jint)-1; // EOF return (jint)-1; // EOF
} else { } else {
(*env)->SetByteArrayRegion(env, ba, off, (jint)nread, (jbyte *)(buf+off)); (*env)->SetByteArrayRegion(env, ba, off, (jint)nread, (jbyte *)(buf));
} }
} }
......
/* /*
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -100,4 +100,12 @@ class SimpleVirtualMachine extends VirtualMachine { ...@@ -100,4 +100,12 @@ class SimpleVirtualMachine extends VirtualMachine {
public void dataDumpRequest() throws IOException { public void dataDumpRequest() throws IOException {
} }
public String startLocalManagementAgent() {
return null;
}
public void startManagementAgent(Properties agentProperties) {
}
} }
/*
* Copyright (c) 2014 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.
*/
import com.sun.tools.attach.AttachOperationFailedException;
import com.sun.tools.attach.VirtualMachine;
import java.io.File;
import java.io.FileWriter;
import java.util.Properties;
import java.util.HashMap;
import javax.management.remote.JMXServiceURL;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import jdk.testlibrary.ProcessThread;
import jdk.testlibrary.Utils;
/*
* @test
* @summary Test for VirtualMachine.startManagementAgent and VirtualMachine.startLocalManagementAgent
* @library /lib/testlibrary
* @run build Application Shutdown SimpleProvider jdk.testlibrary.*
* @run main StartManagementAgent
*/
/*
* This test is not meant to test all possible configuration parameters to
* the JMX agent, there are other tests for that. This test makes sure it is
* possible to start the agent via attach.
*/
public class StartManagementAgent {
public static void main(String[] args) throws Throwable {
final String pidFile = "StartManagementAgent.Application.pid";
ProcessThread processThread = null;
RunnerUtil.ProcessInfo info = null;
try {
processThread = RunnerUtil.startApplication(pidFile);
info = RunnerUtil.readProcessInfo(pidFile);
runTests(info.pid);
} catch (Throwable t) {
System.out.println("StartManagementAgent got unexpected exception: " + t);
t.printStackTrace();
throw t;
} finally {
// Make sure the Application process is stopped.
RunnerUtil.stopApplication(info.shutdownPort, processThread);
}
}
private static void basicTests(VirtualMachine vm) throws Exception {
// Try calling with null argument
boolean exception = false;
try {
vm.startManagementAgent(null);
} catch (NullPointerException e) {
exception = true;
}
if (!exception) {
throw new Exception("startManagementAgent(null) should throw NPE");
}
// Try calling with a property value with a space in it
Properties p = new Properties();
File f = new File("file with space");
try (FileWriter fw = new FileWriter(f)) {
fw.write("com.sun.management.jmxremote.port=apa");
}
p.put("com.sun.management.config.file", f.getAbsolutePath());
try {
vm.startManagementAgent(p);
} catch(AttachOperationFailedException ex) {
// We expect parsing of "apa" above to fail, but if the file path
// can't be read we get a different exception message
if (!ex.getMessage().contains("java.lang.NumberFormatException")) {
throw ex;
}
}
}
private static final String LOCAL_CONNECTOR_ADDRESS_PROP =
"com.sun.management.jmxremote.localConnectorAddress";
private static final int MAX_RETRIES = 10;
public static void runTests(int pid) throws Exception {
VirtualMachine vm = VirtualMachine.attach(""+pid);
try {
basicTests(vm);
testLocalAgent(vm);
// we retry the remote case several times in case the error
// was caused by a port conflict
int i = 0;
boolean success = false;
do {
try {
System.err.println("Trying remote agent. Try #" + i);
testRemoteAgent(vm);
success = true;
} catch(Exception ex) {
System.err.println("testRemoteAgent failed with exception:");
ex.printStackTrace();
System.err.println("Retrying.");
}
i++;
} while(!success && i < MAX_RETRIES);
if (!success) {
throw new Exception("testRemoteAgent failed after " + MAX_RETRIES + " tries");
}
} finally {
vm.detach();
}
}
public static void testLocalAgent(VirtualMachine vm) throws Exception {
Properties agentProps = vm.getAgentProperties();
String address = (String) agentProps.get(LOCAL_CONNECTOR_ADDRESS_PROP);
if (address != null) {
throw new Exception("Local management agent already started");
}
String result = vm.startLocalManagementAgent();
// try to parse the return value as a JMXServiceURL
new JMXServiceURL(result);
agentProps = vm.getAgentProperties();
address = (String) agentProps.get(LOCAL_CONNECTOR_ADDRESS_PROP);
if (address == null) {
throw new Exception("Local management agent could not be started");
}
}
public static void testRemoteAgent(VirtualMachine vm) throws Exception {
int port = Utils.getFreePort();
// try to connect - should fail
tryConnect(port, false);
// start agent
System.out.println("Starting agent on port: " + port);
Properties mgmtProps = new Properties();
mgmtProps.put("com.sun.management.jmxremote.port", port);
mgmtProps.put("com.sun.management.jmxremote.authenticate", "false");
mgmtProps.put("com.sun.management.jmxremote.ssl", "false");
vm.startManagementAgent(mgmtProps);
// try to connect - should work
tryConnect(port, true);
// try to start again - should fail
boolean exception = false;
try {
vm.startManagementAgent(mgmtProps);
} catch(AttachOperationFailedException ex) {
// expected
exception = true;
}
if (!exception) {
throw new Exception("Expected the second call to vm.startManagementAgent() to fail");
}
}
private static void tryConnect(int port, boolean shouldSucceed) throws Exception {
String jmxUrlStr =
String.format(
"service:jmx:rmi:///jndi/rmi://localhost:%d/jmxrmi",
port);
JMXServiceURL url = new JMXServiceURL(jmxUrlStr);
HashMap<String, ?> env = new HashMap<>();
boolean succeeded;
try {
JMXConnector c = JMXConnectorFactory.connect(url, env);
c.getMBeanServerConnection();
succeeded = true;
} catch(Exception ex) {
succeeded = false;
}
if (succeeded && !shouldSucceed) {
throw new Exception("Could connect to agent, but should not have been possible");
}
if (!succeeded && shouldSucceed) {
throw new Exception("Could not connect to agent");
}
}
}
/* /*
* Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -143,9 +143,12 @@ public class JvmstatCountersTest { ...@@ -143,9 +143,12 @@ public class JvmstatCountersTest {
String vmid = name.substring(0, name.indexOf("@")); String vmid = name.substring(0, name.indexOf("@"));
System.out.println("vmid = " + vmid); System.out.println("vmid = " + vmid);
VirtualMachine vm = VirtualMachine.attach(vmid); VirtualMachine vm = VirtualMachine.attach(vmid);
String agent = vm.getSystemProperties().getProperty("java.home") + Properties p = new Properties();
File.separator + "lib" + File.separator + "management-agent.jar"; p.put("com.sun.management.jmxremote.port", "0");
vm.loadAgent(agent, "com.sun.management.jmxremote.port=0,com.sun.management.jmxremote.authenticate=false,com.sun.management.jmxremote.ssl=false"); p.put("com.sun.management.jmxremote.authenticate", "false");
p.put("com.sun.management.jmxremote.ssl", "false");
vm.startManagementAgent(p);
vm.startLocalManagementAgent();
vm.detach(); vm.detach();
String localAddress2 = ConnectorAddressLink.importFrom(0); String localAddress2 = ConnectorAddressLink.importFrom(0);
if (localAddress2 == null) { if (localAddress2 == null) {
......
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -79,16 +79,6 @@ public class LocalManagementTest { ...@@ -79,16 +79,6 @@ public class LocalManagementTest {
return doTest("1", "-Dcom.sun.management.jmxremote"); return doTest("1", "-Dcom.sun.management.jmxremote");
} }
private static boolean test2() throws Exception {
Path agentPath = findAgent();
if (agentPath != null) {
String agent = agentPath.toString();
return doTest("2", "-javaagent:" + agent);
} else {
return false;
}
}
/** /**
* no args (blank) - manager should attach and start agent * no args (blank) - manager should attach and start agent
*/ */
...@@ -96,41 +86,6 @@ public class LocalManagementTest { ...@@ -96,41 +86,6 @@ public class LocalManagementTest {
return doTest("3", null); return doTest("3", null);
} }
/**
* sanity check arguments to management-agent.jar
*/
private static boolean test4() throws Exception {
Path agentPath = findAgent();
if (agentPath != null) {
ProcessBuilder builder = ProcessTools.createJavaProcessBuilder(
"-javaagent:" + agentPath.toString() +
"=com.sun.management.jmxremote.port=7775," +
"com.sun.management.jmxremote.authenticate=false," +
"com.sun.management.jmxremote.ssl=false",
"-cp",
TEST_CLASSPATH,
"TestApplication",
"-exit"
);
Process prc = null;
try {
prc = ProcessTools.startProcess(
"TestApplication",
builder
);
int exitCode = prc.waitFor();
return exitCode == 0;
} finally {
if (prc != null) {
prc.destroy();
prc.waitFor();
}
}
}
return false;
}
/** /**
* use DNS-only name service * use DNS-only name service
*/ */
...@@ -138,27 +93,6 @@ public class LocalManagementTest { ...@@ -138,27 +93,6 @@ public class LocalManagementTest {
return doTest("5", "-Dsun.net.spi.namservice.provider.1=\"dns,sun\""); return doTest("5", "-Dsun.net.spi.namservice.provider.1=\"dns,sun\"");
} }
private static Path findAgent() {
FileSystem FS = FileSystems.getDefault();
Path agentPath = FS.getPath(
TEST_JDK, "jre", "lib", "management-agent.jar"
);
if (!isFileOk(agentPath)) {
agentPath = FS.getPath(
TEST_JDK, "lib", "management-agent.jar"
);
}
if (!isFileOk(agentPath)) {
System.err.println("Can not locate management-agent.jar");
return null;
}
return agentPath;
}
private static boolean isFileOk(Path path) {
return Files.isRegularFile(path) && Files.isReadable(path);
}
private static boolean doTest(String testId, String arg) throws Exception { private static boolean doTest(String testId, String arg) throws Exception {
List<String> args = new ArrayList<>(); List<String> args = new ArrayList<>();
args.add("-cp"); args.add("-cp");
......
/* /*
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -40,7 +40,6 @@ import java.lang.management.RuntimeMXBean; ...@@ -40,7 +40,6 @@ import java.lang.management.RuntimeMXBean;
import static java.lang.management.ManagementFactory.*; import static java.lang.management.ManagementFactory.*;
import java.net.Socket; import java.net.Socket;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.io.File;
import java.io.IOException; import java.io.IOException;
// Sun specific // Sun specific
...@@ -55,28 +54,8 @@ public class TestManager { ...@@ -55,28 +54,8 @@ public class TestManager {
* Starts the management agent in the target VM * Starts the management agent in the target VM
*/ */
private static void startManagementAgent(String pid) throws IOException { private static void startManagementAgent(String pid) throws IOException {
/*
* JAR file normally in ${java.home}/jre/lib but may be in ${java.home}/lib
* with development/non-images builds
*/
String home = System.getProperty("java.home");
String agent = home + File.separator + "jre" + File.separator + "lib"
+ File.separator + "management-agent.jar";
File f = new File(agent);
if (!f.exists()) {
agent = home + File.separator + "lib" + File.separator +
"management-agent.jar";
f = new File(agent);
if (!f.exists()) {
throw new RuntimeException("management-agent.jar missing");
}
}
agent = f.getCanonicalPath();
System.out.println("Loading " + agent + " into target VM ...");
try { try {
VirtualMachine.attach(pid).loadAgent(agent); VirtualMachine.attach(pid).startLocalManagementAgent();
} catch (Exception x) { } catch (Exception x) {
throw new IOException(x.getMessage()); throw new IOException(x.getMessage());
} }
...@@ -122,8 +101,7 @@ public class TestManager { ...@@ -122,8 +101,7 @@ public class TestManager {
if (agentPropLocalConnectorAddress == null && if (agentPropLocalConnectorAddress == null &&
jvmstatLocalConnectorAddress == null) { jvmstatLocalConnectorAddress == null) {
// No JMX Connector address so attach to VM, and load // No JMX Connector address so attach to VM, and start local agent
// management-agent.jar
startManagementAgent(pid); startManagementAgent(pid);
agentPropLocalConnectorAddress = (String) agentPropLocalConnectorAddress = (String)
vm.getAgentProperties().get(LOCAL_CONNECTOR_ADDRESS_PROP); vm.getAgentProperties().get(LOCAL_CONNECTOR_ADDRESS_PROP);
......
/* /*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -31,16 +31,13 @@ import java.rmi.registry.LocateRegistry; ...@@ -31,16 +31,13 @@ import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry; import java.rmi.registry.Registry;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer; import java.util.function.Consumer;
import javax.management.*; import javax.management.*;
...@@ -60,7 +57,6 @@ import jdk.testlibrary.JDKToolLauncher; ...@@ -60,7 +57,6 @@ import jdk.testlibrary.JDKToolLauncher;
* JCMD achieves the desired results * JCMD achieves the desired results
*/ */
public class JMXStartStopTest { public class JMXStartStopTest {
private static final String TEST_JDK = System.getProperty("test.jdk");
private static final String TEST_SRC = System.getProperty("test.src"); private static final String TEST_SRC = System.getProperty("test.src");
private static final boolean verbose = false; private static final boolean verbose = false;
...@@ -76,8 +72,8 @@ public class JMXStartStopTest { ...@@ -76,8 +72,8 @@ public class JMXStartStopTest {
QueryExp query) QueryExp query)
throws Exception { throws Exception {
Set names = server.queryNames(pattern,query); Set<ObjectName> names = server.queryNames(pattern,query);
for (Iterator i=names.iterator(); i.hasNext(); ) { for (Iterator<ObjectName> i = names.iterator(); i.hasNext(); ) {
ObjectName name = (ObjectName)i.next(); ObjectName name = (ObjectName)i.next();
MBeanInfo info = server.getMBeanInfo(name); MBeanInfo info = server.getMBeanInfo(name);
dbg_print("Got MBean: " + name); dbg_print("Got MBean: " + name);
...@@ -87,7 +83,7 @@ public class JMXStartStopTest { ...@@ -87,7 +83,7 @@ public class JMXStartStopTest {
continue; continue;
for (MBeanAttributeInfo attr : attrs) { for (MBeanAttributeInfo attr : attrs) {
if (attr.isReadable()) { if (attr.isReadable()) {
Object o = server.getAttribute(name, attr.getName()); server.getAttribute(name, attr.getName());
} }
} }
} }
...@@ -108,9 +104,8 @@ public class JMXStartStopTest { ...@@ -108,9 +104,8 @@ public class JMXStartStopTest {
} }
JMXServiceURL url = new JMXServiceURL(jmxUrlStr); JMXServiceURL url = new JMXServiceURL(jmxUrlStr);
Map m = new HashMap();
JMXConnector c = JMXConnectorFactory.connect(url,m); JMXConnector c = JMXConnectorFactory.connect(url, null);
MBeanServerConnection conn = c.getMBeanServerConnection(); MBeanServerConnection conn = c.getMBeanServerConnection();
ObjectName pattern = new ObjectName("java.lang:type=Memory,*"); ObjectName pattern = new ObjectName("java.lang:type=Memory,*");
...@@ -180,9 +175,8 @@ public class JMXStartStopTest { ...@@ -180,9 +175,8 @@ public class JMXStartStopTest {
port); port);
JMXServiceURL url = new JMXServiceURL(jmxUrlStr); JMXServiceURL url = new JMXServiceURL(jmxUrlStr);
Map m = new HashMap();
JMXConnector c = JMXConnectorFactory.connect(url,m); JMXConnector c = JMXConnectorFactory.connect(url, null);
MBeanServerConnection conn = c.getMBeanServerConnection(); MBeanServerConnection conn = c.getMBeanServerConnection();
ObjectName pattern = new ObjectName("java.lang:type=Memory,*"); ObjectName pattern = new ObjectName("java.lang:type=Memory,*");
...@@ -273,25 +267,6 @@ public class JMXStartStopTest { ...@@ -273,25 +267,6 @@ public class JMXStartStopTest {
} }
} }
/**
* Retrieves the PID of the test application using JCMD
* @return The PID of the test application
* @throws InterruptedException
* @throws IOException
*/
private static String getPID() throws InterruptedException, IOException {
final AtomicReference<String> pid = new AtomicReference<>();
jcmd(
null,
line -> {
if (line.endsWith("JMXStartStopDoSomething")) {
pid.set(line.split(" ")[0]);
}
}
);
return pid.get();
}
private static class Something { private static class Something {
private Process p; private Process p;
private final ProcessBuilder pb; private final ProcessBuilder pb;
...@@ -434,7 +409,7 @@ public class JMXStartStopTest { ...@@ -434,7 +409,7 @@ public class JMXStartStopTest {
private static final int port1 = 50234; private static final int port1 = 50234;
private static final int port2 = 50235; private static final int port2 = 50235;
private static void test_01() throws Exception { static void test_01() throws Exception {
// Run an app with JMX enabled stop it and // Run an app with JMX enabled stop it and
// restart on other port // restart on other port
...@@ -459,7 +434,7 @@ public class JMXStartStopTest { ...@@ -459,7 +434,7 @@ public class JMXStartStopTest {
} }
} }
private static void test_02() throws Exception { static void test_02() throws Exception {
// Run an app without JMX enabled // Run an app without JMX enabled
// start JMX by jcmd // start JMX by jcmd
...@@ -478,7 +453,7 @@ public class JMXStartStopTest { ...@@ -478,7 +453,7 @@ public class JMXStartStopTest {
} }
} }
private static void test_03() throws Exception { static void test_03() throws Exception {
// Run an app without JMX enabled // Run an app without JMX enabled
// start JMX by jcmd on one port than on other one // start JMX by jcmd on one port than on other one
...@@ -507,7 +482,7 @@ public class JMXStartStopTest { ...@@ -507,7 +482,7 @@ public class JMXStartStopTest {
} }
} }
private static void test_04() throws Exception { static void test_04() throws Exception {
// Run an app without JMX enabled // Run an app without JMX enabled
// start JMX by jcmd on one port, specify rmi port explicitly // start JMX by jcmd on one port, specify rmi port explicitly
...@@ -528,7 +503,7 @@ public class JMXStartStopTest { ...@@ -528,7 +503,7 @@ public class JMXStartStopTest {
} }
} }
private static void test_05() throws Exception { static void test_05() throws Exception {
// Run an app without JMX enabled, it will enable local server // Run an app without JMX enabled, it will enable local server
// but should leave remote server disabled // but should leave remote server disabled
...@@ -545,7 +520,7 @@ public class JMXStartStopTest { ...@@ -545,7 +520,7 @@ public class JMXStartStopTest {
} }
} }
private static void test_06() throws Exception { static void test_06() throws Exception {
// Run an app without JMX enabled // Run an app without JMX enabled
// start JMX by jcmd on one port, specify rmi port explicitly // start JMX by jcmd on one port, specify rmi port explicitly
// attempt to start it again // attempt to start it again
...@@ -569,7 +544,7 @@ public class JMXStartStopTest { ...@@ -569,7 +544,7 @@ public class JMXStartStopTest {
final boolean[] checks = new boolean[3]; final boolean[] checks = new boolean[3];
jcmd( jcmd(
line -> { line -> {
if (line.equals("java.lang.RuntimeException: Invalid agent state")) { if (line.contains("java.lang.RuntimeException: Invalid agent state")) {
checks[0] = true; checks[0] = true;
} }
}, },
...@@ -580,7 +555,7 @@ public class JMXStartStopTest { ...@@ -580,7 +555,7 @@ public class JMXStartStopTest {
jcmd( jcmd(
line -> { line -> {
if (line.equals("java.lang.RuntimeException: Invalid agent state")) { if (line.contains("java.lang.RuntimeException: Invalid agent state")) {
checks[1] = true; checks[1] = true;
} }
}, },
...@@ -648,7 +623,7 @@ public class JMXStartStopTest { ...@@ -648,7 +623,7 @@ public class JMXStartStopTest {
} }
} }
private static void test_08() throws Exception { static void test_08() throws Exception {
// Run an app with JMX enabled and with some properties set // Run an app with JMX enabled and with some properties set
// in command line. // in command line.
// stop JMX agent and then start it again with different property values // stop JMX agent and then start it again with different property values
...@@ -682,7 +657,7 @@ public class JMXStartStopTest { ...@@ -682,7 +657,7 @@ public class JMXStartStopTest {
} }
} }
private static void test_09() throws Exception { static void test_09() throws Exception {
// Run an app with JMX enabled and with some properties set // Run an app with JMX enabled and with some properties set
// in command line. // in command line.
// stop JMX agent and then start it again with different property values // stop JMX agent and then start it again with different property values
...@@ -718,7 +693,7 @@ public class JMXStartStopTest { ...@@ -718,7 +693,7 @@ public class JMXStartStopTest {
} }
} }
private static void test_10() throws Exception { static void test_10() throws Exception {
// Run an app with JMX enabled and with some properties set // Run an app with JMX enabled and with some properties set
// in command line. // in command line.
// stop JMX agent and then start it again with different property values // stop JMX agent and then start it again with different property values
...@@ -754,7 +729,7 @@ public class JMXStartStopTest { ...@@ -754,7 +729,7 @@ public class JMXStartStopTest {
} }
} }
private static void test_11() throws Exception { static void test_11() throws Exception {
// Run an app with JMX enabled // Run an app with JMX enabled
// stop remote agent // stop remote agent
// make sure local agent is not affected // make sure local agent is not affected
...@@ -775,7 +750,7 @@ public class JMXStartStopTest { ...@@ -775,7 +750,7 @@ public class JMXStartStopTest {
} }
} }
private static void test_12() throws Exception { static void test_12() throws Exception {
// Run an app with JMX disabled // Run an app with JMX disabled
// start local agent only // start local agent only
...@@ -793,28 +768,4 @@ public class JMXStartStopTest { ...@@ -793,28 +768,4 @@ public class JMXStartStopTest {
s.stop(); s.stop();
} }
} }
private static void test_13() throws Exception {
// Run an app with -javaagent make sure it works as expected -
// system properties are ignored
System.out.println("**** Test thirteen ****");
String agent = TEST_JDK + "/jre/lib/management-agent.jar";
if (!new File(agent).exists()) {
agent = TEST_JDK + "/lib/management-agent.jar";
}
Something s = doSomething("test_14",
"-javaagent:" + agent + "=com.sun.management.jmxremote.port=" +
port1 + ",com.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=false"
);
try {
testNoConnect(port1);
} finally {
s.stop();
}
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册