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 } };