src/share/vm/services/attachListener.cpp
Print this page
*** 33,42 ****
--- 33,43 ----
#include "runtime/java.hpp"
#include "runtime/javaCalls.hpp"
#include "runtime/os.hpp"
#include "services/attachListener.hpp"
#include "services/heapDumper.hpp"
+ #include "services/diagnosticCommand.hpp"
volatile bool AttachListener::_initialized;
// Implementation of "properties" command.
//
*** 146,155 ****
--- 147,177 ----
VMThread::execute(&op3);
return JNI_OK;
}
+ /**
+ * A jcmd attach operation request was received, which will now
+ * dispatch to the diagnostic commands used for serviceability functions.
+ */
+ static jint jcmd(AttachOperation* op, outputStream* out) {
+ Thread* THREAD = Thread::current();
+ // All the supplied jcmd arguments are stored as a single
+ // string (op->arg(0)). This is parsed by the Dcmd framework.
+ DCmd::parse_and_execute(out, op->arg(0), ' ', THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ java_lang_Throwable::print(PENDING_EXCEPTION, out);
+ CLEAR_PENDING_EXCEPTION;
+ // The exception has been printed on the output stream
+ // If the JVM returns JNI_ERR, the attachAPI throws a generic I/O
+ // exception and the content of the output stream is not processed.
+ // By returning JNI_OK, the exception will be displayed on the client side
+ return JNI_OK;
+ }
+ return JNI_OK;
+ }
+
#ifndef SERVICES_KERNEL // Heap dumping not supported
// Implementation of "dumpheap" command.
//
// Input arguments :-
// arg0: Name of the dump file
*** 364,373 ****
--- 386,396 ----
{ "properties", get_system_properties },
{ "threaddump", thread_dump },
{ "inspectheap", heap_inspection },
{ "setflag", set_flag },
{ "printflag", print_flag },
+ { "jcmd", jcmd },
{ NULL, NULL }
};