Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error modifying class for cglib proxy creation parameter recording #407

Closed
bric3 opened this issue Dec 1, 2021 · 12 comments
Closed

Error modifying class for cglib proxy creation parameter recording #407

bric3 opened this issue Dec 1, 2021 · 12 comments

Comments

@bric3
Copy link

bric3 commented Dec 1, 2021

Hi,

I'd like to use the hotswap agent as an external library with the JetBrains runtime (11.x at the moment) to run IntelliJ itself.

I am using the latest HA snapshot 1.4.2-SNAPSHOT.

The java process is started with : -XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=external -javaagent:hotswap-agent-1.4.2-SNAPSHOT.jar among other flags and options.

However I noticed an error with a stacktrace on stdout.

HOTSWAP AGENT: 13:50:18.121 ERROR (org.hotswap.agent.plugin.proxy.ProxyPlugin) - Error modifying class for cglib proxy creation parameter recording
org.hotswap.agent.javassist.CannotCompileException: [source error] no such class: org.hotswap.agent.plugin.proxy.hscglib.GeneratorParametersRecorder

I am not sure if this is an actual bug or a misconfiguration on my end.

org.hotswap.agent.javassist.CannotCompileException
HOTSWAP AGENT: 13:50:18.121 ERROR (org.hotswap.agent.plugin.proxy.ProxyPlugin) - Error modifying class for cglib proxy creation parameter recording
org.hotswap.agent.javassist.CannotCompileException: [source error] no such class: org.hotswap.agent.plugin.proxy.hscglib.GeneratorParametersRecorder
	at org.hotswap.agent.javassist.CtBehavior.insertAfter(CtBehavior.java:909)
	at org.hotswap.agent.javassist.CtBehavior.insertAfter(CtBehavior.java:824)
	at org.hotswap.agent.plugin.proxy.hscglib.GeneratorParametersTransformer.transform(GeneratorParametersTransformer.java:57)
	at org.hotswap.agent.plugin.proxy.ProxyPlugin.transformDefinitions(ProxyPlugin.java:145)
	at jdk.internal.reflect.GeneratedMethodAccessor183.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.hotswap.agent.annotation.handler.PluginClassFileTransformer.transform(PluginClassFileTransformer.java:218)
	at org.hotswap.agent.annotation.handler.PluginClassFileTransformer.transform(PluginClassFileTransformer.java:112)
	at org.hotswap.agent.util.HotswapTransformer.transform(HotswapTransformer.java:246)
	at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
	at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
	at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:563)
	at java.base/java.lang.ClassLoader.defineClass2(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1109)
	at com.intellij.util.lang.UrlClassLoader.consumeClassData(UrlClassLoader.java:290)
	at com.intellij.util.lang.ZipResourceFile.findClass(ZipResourceFile.java:116)
	at com.intellij.util.lang.JarLoader.findClass(JarLoader.java:55)
	at com.intellij.util.lang.ClassPath.findClassInLoader(ClassPath.java:217)
	at com.intellij.util.lang.ClassPath.findClass(ClassPath.java:176)
	at com.intellij.util.lang.UrlClassLoader.findClass(UrlClassLoader.java:223)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at net.sf.cglib.core.AbstractClassGenerator.<init>(AbstractClassGenerator.java:39)
	at net.sf.cglib.proxy.AdvancedEnhancer.<init>(AdvancedEnhancer.java:159)
	at net.sf.cglib.proxy.AdvancedProxy.createProxy(AdvancedProxy.java:111)
	at net.sf.cglib.proxy.AdvancedProxy.createProxy(AdvancedProxy.java:94)
	at net.sf.cglib.proxy.AdvancedProxy.createProxy(AdvancedProxy.java:79)
	at com.intellij.util.xml.impl.DomInvocationHandler.getProxy(DomInvocationHandler.java:523)
	at com.intellij.util.xml.impl.DomFileElementImpl.getRootElement(DomFileElementImpl.java:271)
	at com.intellij.spring.index.SpringIndexUtil.getAllBeanInfos(SpringIndexUtil.java:122)
	at com.intellij.spring.index.SpringIndexUtil.indexFile(SpringIndexUtil.java:31)
	at com.intellij.util.indexing.impl.MapReduceIndex.mapByIndexer(MapReduceIndex.java:306)
	at com.intellij.util.indexing.impl.MapReduceIndex.mapInput(MapReduceIndex.java:297)
	at com.intellij.util.indexing.impl.storage.VfsAwareMapReduceIndex.mapInput(VfsAwareMapReduceIndex.java:182)
	at com.intellij.util.indexing.impl.storage.VfsAwareMapReduceIndex.mapInput(VfsAwareMapReduceIndex.java:47)
	at com.intellij.util.indexing.impl.MapReduceIndex.mapInputAndPrepareUpdate(MapReduceIndex.java:244)
	at com.intellij.indexing.composite.CompositeInvertedIndexBase.updateBaseIndex(CompositeInvertedIndexBase.java:240)
	at com.intellij.indexing.composite.CompositeInvertedIndexBase.mapInputAndPrepareUpdate(CompositeInvertedIndexBase.java:60)
	at com.intellij.indexing.composite.CompositeInvertedIndexBase.mapInputAndPrepareUpdate(CompositeInvertedIndexBase.java:27)
	at com.intellij.util.indexing.FileBasedIndexImpl.updateSingleIndex(FileBasedIndexImpl.java:1534)
	at com.intellij.util.indexing.FileBasedIndexImpl.lambda$doIndexFileContent$27(FileBasedIndexImpl.java:1408)
	at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.freezeFileTypeTemporarilyIn(FileTypeManagerImpl.java:627)
	at com.intellij.util.indexing.FileBasedIndexImpl.doIndexFileContent(FileBasedIndexImpl.java:1376)
	at com.intellij.util.indexing.FileBasedIndexImpl.indexFileContent(FileBasedIndexImpl.java:1330)
	at com.intellij.util.indexing.contentQueue.IndexUpdateRunner.lambda$indexOneFileOfJob$5(IndexUpdateRunner.java:267)
	at com.intellij.openapi.application.impl.NonBlockingReadActionImpl$Submission.insideReadAction(NonBlockingReadActionImpl.java:521)
	at com.intellij.openapi.application.impl.NonBlockingReadActionImpl$Submission.lambda$attemptComputation$3(NonBlockingReadActionImpl.java:486)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1084)
	at com.intellij.openapi.progress.util.ProgressIndicatorUtils.lambda$runInReadActionWithWriteActionPriority$0(ProgressIndicatorUtils.java:75)
	at com.intellij.openapi.progress.util.ProgressIndicatorUtils.runActionAndCancelBeforeWrite(ProgressIndicatorUtils.java:158)
	at com.intellij.openapi.progress.util.ProgressIndicatorUtils.lambda$runWithWriteActionPriority$1(ProgressIndicatorUtils.java:115)
	at com.intellij.openapi.progress.ProgressManager.lambda$runProcess$0(ProgressManager.java:57)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:188)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$12(CoreProgressManager.java:624)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:698)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:646)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:623)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:66)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:175)
	at com.intellij.openapi.progress.ProgressManager.runProcess(ProgressManager.java:57)
	at com.intellij.openapi.progress.util.ProgressIndicatorUtils.runWithWriteActionPriority(ProgressIndicatorUtils.java:112)
	at com.intellij.openapi.progress.util.ProgressIndicatorUtils.runInReadActionWithWriteActionPriority(ProgressIndicatorUtils.java:75)
	at com.intellij.openapi.application.impl.NonBlockingReadActionImpl$Submission.attemptComputation(NonBlockingReadActionImpl.java:486)
	at com.intellij.openapi.application.impl.NonBlockingReadActionImpl$Submission.executeSynchronously(NonBlockingReadActionImpl.java:421)
	at com.intellij.openapi.application.impl.NonBlockingReadActionImpl.executeSynchronously(NonBlockingReadActionImpl.java:186)
	at com.intellij.util.indexing.contentQueue.IndexUpdateRunner.indexOneFileOfJob(IndexUpdateRunner.java:270)
	at com.intellij.util.indexing.contentQueue.IndexUpdateRunner.lambda$indexJobsFairly$4(IndexUpdateRunner.java:210)
	at com.intellij.openapi.progress.impl.ProgressSuspender.executeNonSuspendableSection(ProgressSuspender.java:83)
	at com.intellij.util.indexing.contentQueue.IndexUpdateRunner.indexJobsFairly(IndexUpdateRunner.java:213)
	at com.intellij.util.indexing.contentQueue.IndexUpdateRunner.lambda$doIndexFiles$3(IndexUpdateRunner.java:147)
	at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:246)
	at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:32)
	at com.intellij.util.concurrency.BoundedTaskExecutor$1.execute(BoundedTaskExecutor.java:225)
	at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:213)
	at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:214)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:668)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:665)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:665)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: compile error: no such class: org.hotswap.agent.plugin.proxy.hscglib.GeneratorParametersRecorder
	at org.hotswap.agent.javassist.compiler.MemberResolver.searchImports(MemberResolver.java:479)
	at org.hotswap.agent.javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:422)
	at org.hotswap.agent.javassist.compiler.MemberResolver.lookupClassByJvmName(MemberResolver.java:329)
	at org.hotswap.agent.javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:711)
	at org.hotswap.agent.javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:170)
	at org.hotswap.agent.javassist.compiler.ast.CallExpr.accept(CallExpr.java:49)
	at org.hotswap.agent.javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:266)
	at org.hotswap.agent.javassist.compiler.CodeGen.atStmnt(CodeGen.java:360)
	at org.hotswap.agent.javassist.compiler.ast.Stmnt.accept(Stmnt.java:53)
	at org.hotswap.agent.javassist.compiler.Javac.compileStmnt(Javac.java:578)
	at org.hotswap.agent.javassist.CtBehavior.insertAfterAdvice(CtBehavior.java:931)
	at org.hotswap.agent.javassist.CtBehavior.insertAfter(CtBehavior.java:883)
	... 82 more
@skybber
Copy link
Contributor

skybber commented Dec 29, 2021

Is your intention to use HA+dcevm for running+development Idea from Idea?

@bric3
Copy link
Author

bric3 commented Dec 30, 2021

@skybber yes, that's my current use case.

Currently I'm using DCEVM a longer with the enhanced class redefinition, I'm not quite sure what HA brings for me use case. I'm write new to DCEVM and HA.

@skybber
Copy link
Contributor

skybber commented Dec 30, 2021

HA extends dcevm capabilities. For idea-from-idea use case does make sense :

  • new static field + enum items initialization
  • cglib proxy redefinition

may be much more, I don't know Idea code base a lot.

@bric3
Copy link
Author

bric3 commented Dec 30, 2021

It's mostly Swing related stuff. Sometimes there's serialization code that maybe useful they have both their XML stuff (which is related to the cglib error shown above) and maybe some Json.

I had issues with some incompatible changes in anonymous classes, and I saw that HA could help in this regard.

Regardless I'm not quite sure what was wrong in my setup.

@skybber
Copy link
Contributor

skybber commented Dec 30, 2021

Your setup is OK, HotswapAgent does not support Idea class loading mechanism now. I can create a new plugin for it if you are interested.

@bric3
Copy link
Author

bric3 commented Dec 30, 2021

That'd be neat

@bric3
Copy link
Author

bric3 commented Dec 30, 2021

By the way how can I help on the matter ?

@skybber
Copy link
Contributor

skybber commented Dec 30, 2021

May be by testing later.

@skybber
Copy link
Contributor

skybber commented Dec 30, 2021

There is a new intelliJ IDEA plugin now, it patches Idea class loader to be able to load Hotswap Agent's classes.

@bric3
Copy link
Author

bric3 commented Jan 4, 2022

So I did some testing, and the changes you've made look good. I believe the issue is now fixed.
Thank you very much !

@skybber skybber closed this as completed Jan 4, 2022
@bric3
Copy link
Author

bric3 commented Jan 4, 2022

@skybber By the way: happy new year.

Oh and do you know if a release is near.
And anyway if there's still work to do I know how to build my agent.

Thank you again !

@skybber
Copy link
Contributor

skybber commented Jan 4, 2022

We are planning to release v1.5 in near future. Thanks for help.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants