@@ -70,31 +70,51 @@ final class Attachment extends Thread implements Response {
70
70
private static final class MethodRefsHolder {
71
71
static Method startLocalManagementAgentMethod = null ;
72
72
static Method startRemoteManagementAgentMethod = null ;
73
+ static final Throwable managementAgentMethodThrowable ;
73
74
static {
74
- AccessController .doPrivileged ((PrivilegedAction <Object >) () -> {
75
- Class <?> agentClass ;
76
- Class <?> startRemoteArgumentType ;
75
+ managementAgentMethodThrowable = AccessController .doPrivileged ((PrivilegedAction <Throwable >) () -> {
76
+ String agentClassName =
77
+ /*[IF Sidecar19-SE]*/
78
+ "jdk.internal.agent.Agent" ; //$NON-NLS-1$
79
+ /*[ELSE] Sidecar19-SE
80
+ "sun.management.Agent"; //$NON-NLS-1$
81
+ /*[ENDIF] Sidecar19-SE */
82
+ IPC .logMessage ("Loading " + agentClassName ); //$NON-NLS-1$
83
+ Throwable mamtTemp = null ;
77
84
try {
78
- /*[IF Sidecar19-SE-OpenJ9]*/
79
- agentClass = Class .forName ("jdk.internal.agent.Agent" ); //$NON-NLS-1$
80
- /*[ELSE] Sidecar19-SE-OpenJ9 */
81
- agentClass = Class .forName ("sun.management.Agent" ); //$NON-NLS-1$
82
- /*[ENDIF] Sidecar19-SE-OpenJ9 */
83
-
84
- /*[IF Sidecar19-SE-OpenJ9 | Sidecar18-SE-OpenJ9]*/
85
+ Class <?> agentClass = null ;
86
+ Class <?> startRemoteArgumentType = null ;
87
+ /*[IF Sidecar19-SE]*/
88
+ String jmaName = "jdk.management.agent" ; //$NON-NLS-1$
89
+ java .lang .Module jmaModule = jdk .internal .module .Modules .loadModule (jmaName );
90
+ /* this should not happen because loadModule() should throw java.lang.module.FindException */
91
+ if (null == jmaModule ) {
92
+ throw new ClassNotFoundException ("Cannot load " + jmaName ); //$NON-NLS-1$
93
+ }
94
+ /* This does not throw ClassNotFoundException. */
95
+ agentClass = Class .forName (jmaModule , agentClassName );
96
+ if (null == agentClass ) {
97
+ throw new ClassNotFoundException ("Cannot load " + agentClassName ); //$NON-NLS-1$
98
+ }
99
+ /*[ELSE] Sidecar19-SE */
100
+ agentClass = Class .forName (agentClassName );
101
+ /*[ENDIF] Sidecar19-SE */
102
+
103
+ /*[IF Sidecar19-SE | Sidecar18-SE-OpenJ9]*/
85
104
startRemoteArgumentType = String .class ;
86
- /*[ELSE] Sidecar19-SE-OpenJ9 | Sidecar18-SE-OpenJ9 */
105
+ /*[ELSE] Sidecar19-SE | Sidecar18-SE-OpenJ9 */
87
106
startRemoteArgumentType = Properties .class ;
88
- /*[ENDIF] Sidecar19-SE-OpenJ9 | Sidecar18-SE-OpenJ9 */
107
+ /*[ENDIF] Sidecar19-SE | Sidecar18-SE-OpenJ9 */
89
108
startLocalManagementAgentMethod = agentClass .getDeclaredMethod (START_LOCAL_MANAGEMENT_AGENT );
90
109
startRemoteManagementAgentMethod = agentClass .getDeclaredMethod (START_REMOTE_MANAGEMENT_AGENT , startRemoteArgumentType );
91
110
startLocalManagementAgentMethod .setAccessible (true );
92
111
startRemoteManagementAgentMethod .setAccessible (true );
93
- } catch (ClassNotFoundException | NoSuchMethodException | SecurityException e ) {
94
- startLocalManagementAgentMethod = null ;
95
- startRemoteManagementAgentMethod = null ;
112
+ IPC .logMessage ("Loaded " + agentClassName ); //$NON-NLS-1$
113
+ } catch (Throwable e ) {
114
+ IPC .logMessage ("Error loading " + agentClassName , e ); //$NON-NLS-1$
115
+ mamtTemp = e ;
96
116
}
97
- return null ;
117
+ return mamtTemp ;
98
118
});
99
119
}
100
120
}
@@ -222,8 +242,8 @@ boolean doCommand(InputStream cmdStream, OutputStream respStream) {
222
242
String serviceAddress = startLocalAgent ();
223
243
AttachmentConnection .streamSend (respStream , Response .ATTACH_RESULT + serviceAddress );
224
244
} catch (IbmAttachOperationFailedException e ) {
225
- AttachmentConnection .streamSend (respStream , Response . ERROR + " " //$NON-NLS-1$
226
- + EXCEPTION_ATTACH_OPERATION_FAILED_EXCEPTION + " in startLocalManagementAgent: " + e . getMessage ()); //$NON-NLS-1$
245
+ AttachmentConnection .streamSend (respStream , String . format ( "%s: %s in startLocalManagementAgent: %s" , //$NON-NLS-1$
246
+ Response . ERROR , EXCEPTION_ATTACH_OPERATION_FAILED_EXCEPTION , e . toString ()));
227
247
return false ;
228
248
}
229
249
} else if (cmd .startsWith (Command .START_MANAGEMENT_AGENT )) {
@@ -416,13 +436,13 @@ private boolean startAgent(Properties agentProperties) {
416
436
IPC .logMessage ("startAgent" ); //$NON-NLS-1$
417
437
if (null != MethodRefsHolder .startRemoteManagementAgentMethod ) {
418
438
Object startArgument ;
419
- /*[IF Sidecar19-SE-OpenJ9 | Sidecar18-SE-OpenJ9]*/
439
+ /*[IF Sidecar19-SE | Sidecar18-SE-OpenJ9]*/
420
440
startArgument = agentProperties .entrySet ().stream ()
421
441
.map (entry -> entry .getKey () + "=" + entry .getValue ()) //$NON-NLS-1$
422
442
.collect (java .util .stream .Collectors .joining ("," )); //$NON-NLS-1$
423
- /*[ELSE] Sidecar19-SE-OpenJ9 | Sidecar18-SE-OpenJ9 */
443
+ /*[ELSE] Sidecar19-SE | Sidecar18-SE-OpenJ9 */
424
444
startArgument = agentProperties ;
425
- /*[ENDIF] Sidecar19-SE-OpenJ9 | Sidecar18-SE-OpenJ9 */
445
+ /*[ENDIF] Sidecar19-SE | Sidecar18-SE-OpenJ9 */
426
446
MethodRefsHolder .startRemoteManagementAgentMethod .invoke (null , startArgument );
427
447
return true ;
428
448
}
@@ -439,19 +459,24 @@ private boolean startAgent(Properties agentProperties) {
439
459
440
460
private static String startLocalAgent () throws IbmAttachOperationFailedException {
441
461
IPC .logMessage ("startLocalAgent" ); //$NON-NLS-1$
442
- try {
443
- if ( null != MethodRefsHolder . startLocalManagementAgentMethod ) { /* forces initialization */
462
+ if ( null != MethodRefsHolder . startLocalManagementAgentMethod ) { /* forces initialization */
463
+ try {
444
464
MethodRefsHolder .startLocalManagementAgentMethod .invoke (null );
445
- } else {
446
- throw new IbmAttachOperationFailedException ("startLocalManagementAgent cannot access " + START_LOCAL_MANAGEMENT_AGENT ); //$NON-NLS-1$
465
+ } catch (Throwable exc ) {
466
+ IPC .logMessage ("Exception starting management agent:" , exc ); //$NON-NLS-1$
467
+ throw new IbmAttachOperationFailedException ("startLocalManagementAgent error starting agent" , exc ); //$NON-NLS-1$
447
468
}
448
- } catch (Throwable e ) {
449
- throw new IbmAttachOperationFailedException ("startLocalManagementAgent error starting agent:" + e .getClass () + " " + e .getMessage ()); //$NON-NLS-1$ //$NON-NLS-2$
469
+ } else {
470
+ Throwable exc = MethodRefsHolder .managementAgentMethodThrowable ;
471
+ String msg = "Target VM cannot access " + START_LOCAL_MANAGEMENT_AGENT ; //$NON-NLS-1$
472
+ IPC .logMessage (msg , exc );
473
+ throw new IbmAttachOperationFailedException (msg , exc );
450
474
}
451
475
452
476
String addr = saveLocalConnectorAddress ();
453
477
if (Objects .isNull (addr )) {
454
- throw new IbmAttachOperationFailedException ("startLocalManagementAgent: " + LOCAL_CONNECTOR_ADDRESS + " not defined" ); //$NON-NLS-1$ //$NON-NLS-2$
478
+ throw new IbmAttachOperationFailedException (
479
+ "startLocalManagementAgent: " + LOCAL_CONNECTOR_ADDRESS + " not defined" ); //$NON-NLS-1$ //$NON-NLS-2$
455
480
}
456
481
return addr ;
457
482
}
0 commit comments