-
Notifications
You must be signed in to change notification settings - Fork 1.6k
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
sandbox 是否存在当 执行到spyMethodOnReturn 之后 当Ret.state==1 的时候栈未清空的情况,麻烦帮忙确认。 #328
Comments
问题应该是出在了 如下代码,如果是的 这个问题会不会造成内存溢出 先抛开我这个问题不谈 ,sandbox是不是有 栈 没有清空 的危险,在 131行栈里面还有两个值 可是只pop 了一个 要清理最早的一个需要交换两个栈顶值后再pop 一次 否则会有栈未清空的可能,难道你们之前用的areturn 会清理最后的所有栈中值吗? 请帮忙确认这个问题。。 |
131执行完后,栈中只有Spy$Ret,在132中会用上, 131执行完后栈里应该是只有一个值 |
最好把完整方法的字节码全部贴出来分析 |
这个问题我已经在自己的代码修复掉了,这里131 还有一个 object 的,只是sanbox不容易发现,因为 sandbox 在135 行用的return 之类的指令 栈会被清空 所以不会看出问题,但是一旦 出现多个 agent 同时 注入一个方法的时候就会出现 ,这里会有 类检查 会报栈平衡问题错误。 |
我贴的这个就已经可以看出问题了。 |
我就是通过这段代码分析出来的 |
我明白你的意思了,栈底状态是 [Ret.respond, object],对吧,object 98行真实调用返回的 |
是的 |
需要把object 的 给pop 掉 |
需要在ARETURN 的合适位置,swap pop一下,有时间的话,可以提交一份修复的PR吗 |
我可以把修复代码贴出来哈 |
感谢 |
我的修复点在 public class EventWeaver extends ClassVisitor implements Opcodes, AsmTypes, AsmMethods 中 的 1.添加两个个新方法 2.修改一个 方法
|
这里面 有 构造器的问题所以 只有 有返回值需要多pop一次 |
这里有些不严谨的地方,我再看看,解决ARETURN是够了, 如果是LRETURN或DRETURN,似乎应该 用POP2,会更加复杂一些 |
关键是看 [Ret.respond, object] 中的 object 是什么类型,因为我们要移除掉的是object。 |
似乎如果出现了 lreturn 和drentrun swap 是不是也会有问题,具体我没有调查过。我当时想的比较好的办法是定义变量来 存 返回值 需要的时候取出来 用完就释放掉,这样是最靠谱的做法。只是当时为了尽快解决就修复了areturn 的。 |
@xiaoxiaocaiiao hello,可以提一个PR么?我们merge进去 |
已发布1.4.0,多谢 |
复现step
at jdk.internal.org.objectweb.asm.tree.analysis.Analyzer.analyze(Analyzer.java:324)
这种情况 大多数因为try catch 引起
The text was updated successfully, but these errors were encountered: