Skip to content

Commit 9334fe2

Browse files
committed
8361725: Do not load Java agent with "-Xshare:dump -XX:+AOTClassLinking"
Reviewed-by: matsaave, ccheung
1 parent 03230f8 commit 9334fe2

File tree

5 files changed

+64
-8
lines changed

5 files changed

+64
-8
lines changed

src/hotspot/share/cds/cdsConfig.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,7 @@ void CDSConfig::check_aotmode_create() {
598598
//
599599
// Since application is not executed in the assembly phase, there's no need to load
600600
// the agents anyway -- no one will notice that the agents are not loaded.
601+
log_info(aot)("Disabled all JVMTI agents during -XX:AOTMode=create");
601602
JvmtiAgentList::disable_agent_list();
602603
}
603604

@@ -702,6 +703,13 @@ bool CDSConfig::check_vm_args_consistency(bool patch_mod_javabase, bool mode_fla
702703
}
703704
}
704705

706+
if (is_dumping_classic_static_archive() && AOTClassLinking) {
707+
if (JvmtiAgentList::disable_agent_list()) {
708+
FLAG_SET_ERGO(AllowArchivingWithJavaAgent, false);
709+
log_warning(cds)("Disabled all JVMTI agents with -Xshare:dump -XX:+AOTClassLinking");
710+
}
711+
}
712+
705713
return true;
706714
}
707715

src/hotspot/share/prims/jvmtiAgentList.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -273,11 +273,13 @@ JvmtiAgent* JvmtiAgentList::lookup(JvmtiEnv* env, void* f_ptr) {
273273
return nullptr;
274274
}
275275

276-
void JvmtiAgentList::disable_agent_list() {
276+
bool JvmtiAgentList::disable_agent_list() {
277277
#if INCLUDE_CDS
278-
assert(CDSConfig::is_dumping_final_static_archive(), "use this only for -XX:AOTMode=create!");
279278
assert(!Universe::is_bootstrapping() && !Universe::is_fully_initialized(), "must do this very early");
280-
log_info(aot)("Disabled all JVMTI agents during -XX:AOTMode=create");
281-
_head = nullptr; // Pretend that no agents have been added.
279+
if (_head != nullptr) {
280+
_head = nullptr; // Pretend that no agents have been added.
281+
return true;
282+
}
282283
#endif
284+
return false;
283285
}

src/hotspot/share/prims/jvmtiAgentList.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class JvmtiAgentList : AllStatic {
8383
static Iterator java_agents();
8484
static Iterator native_agents();
8585
static Iterator xrun_agents();
86-
static void disable_agent_list() NOT_JVMTI_RETURN;
86+
static bool disable_agent_list() NOT_JVMTI_RETURN_(false);
8787
};
8888

8989
#endif // SHARE_PRIMS_JVMTIAGENTLIST_HPP

test/hotspot/jtreg/runtime/cds/appcds/aotCache/JavaAgent.java

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,18 @@
2424

2525

2626
/*
27-
* @test
27+
* @test id=static
28+
* @bug 8361725
29+
* @summary -javaagent should be disabled with -Xshare:dump -XX:+AOTClassLinking
30+
* @requires vm.cds.supports.aot.class.linking
31+
* @library /test/lib /test/hotspot/jtreg/runtime/cds/appcds/test-classes
32+
* @build JavaAgent JavaAgentTransformer Util
33+
* @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar JavaAgentApp JavaAgentApp$ShouldBeTransformed
34+
* @run driver JavaAgent STATIC
35+
*/
36+
37+
/*
38+
* @test id=aot
2839
* @summary -javaagent should be allowed in AOT workflow. However, classes transformed/redefined by agents will not
2940
* be cached.
3041
* @requires vm.cds.supports.aot.class.linking
@@ -68,7 +79,13 @@ public String classpath(RunMode runMode) {
6879

6980
@Override
7081
public String[] vmArgs(RunMode runMode) {
71-
return new String[] { "-javaagent:" + agentJar, "-Xlog:aot,cds"};
82+
return new String[] {
83+
"-XX:+UnlockDiagnosticVMOptions",
84+
"-XX:+AllowArchivingWithJavaAgent",
85+
"-javaagent:" + agentJar,
86+
"-Xlog:aot,cds",
87+
"-XX:+AOTClassLinking",
88+
};
7289
}
7390

7491
@Override
@@ -80,7 +97,18 @@ public String[] appCommandLine(RunMode runMode) {
8097

8198
@Override
8299
public void checkExecution(OutputAnalyzer out, RunMode runMode) throws Exception {
83-
String agentLoadedMsg = "JavaAgentTransformer.premain() is called";
100+
if (isAOTWorkflow()) {
101+
checkExecutionForAOTWorkflow(out, runMode);
102+
} else {
103+
checkExecutionForStaticWorkflow(out, runMode);
104+
}
105+
}
106+
107+
static String agentLoadedMsg = "JavaAgentTransformer.premain() is called";
108+
static String agentPremainFinished = "JavaAgentTransformer::premain() is finished";
109+
110+
public void checkExecutionForAOTWorkflow(OutputAnalyzer out, RunMode runMode) throws Exception {
111+
84112
if (runMode.isApplicationExecuted()) {
85113
out.shouldContain(agentLoadedMsg);
86114
out.shouldContain("Transforming: JavaAgentApp$ShouldBeTransformed; Class<?> = null");
@@ -91,12 +119,26 @@ public void checkExecution(OutputAnalyzer out, RunMode runMode) throws Exception
91119

92120
switch (runMode) {
93121
case RunMode.TRAINING:
122+
out.shouldContain(agentPremainFinished);
94123
out.shouldContain("Skipping JavaAgentApp$ShouldBeTransformed: From ClassFileLoadHook");
95124
out.shouldContain("Skipping JavaAgentTransformer: Unsupported location");
96125
break;
97126
case RunMode.ASSEMBLY:
98127
out.shouldContain("Disabled all JVMTI agents during -XX:AOTMode=create");
128+
out.shouldNotContain(agentPremainFinished);
129+
break;
130+
}
131+
132+
}
133+
134+
public void checkExecutionForStaticWorkflow(OutputAnalyzer out, RunMode runMode) throws Exception {
135+
switch (runMode) {
136+
case RunMode.DUMP_STATIC:
137+
out.shouldContain("Disabled all JVMTI agents with -Xshare:dump -XX:+AOTClassLinking");
138+
out.shouldNotContain(agentPremainFinished);
99139
break;
140+
default:
141+
out.shouldContain(agentPremainFinished);
100142
}
101143
}
102144
}

test/hotspot/jtreg/runtime/cds/appcds/aotCache/JavaAgentTransformer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
*
2323
*/
2424

25+
import java.lang.System.Logger.Level;
2526
import java.lang.instrument.ClassFileTransformer;
2627
import java.lang.instrument.IllegalClassFormatException;
2728
import java.lang.instrument.Instrumentation;
@@ -30,11 +31,14 @@
3031
// This class is available on the classpath so it can be accessed by JavaAgentApp
3132
public class JavaAgentTransformer implements ClassFileTransformer {
3233
private static Instrumentation savedInstrumentation;
34+
private static final System.Logger LOGGER = System.getLogger(JavaAgentTransformer.class.getName());
3335

3436
public static void premain(String agentArguments, Instrumentation instrumentation) {
3537
System.out.println("JavaAgentTransformer.premain() is called");
3638
instrumentation.addTransformer(new JavaAgentTransformer(), /*canRetransform=*/true);
3739
savedInstrumentation = instrumentation;
40+
41+
LOGGER.log(Level.WARNING, "JavaAgentTransformer::premain() is finished");
3842
}
3943

4044
public static Instrumentation getInstrumentation() {

0 commit comments

Comments
 (0)