Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java ASM验证java.lang.VerifyError错误_Java_Bytecode_Java Bytecode Asm_Bytecode Manipulation - Fatal编程技术网

使用java ASM验证java.lang.VerifyError错误

使用java ASM验证java.lang.VerifyError错误,java,bytecode,java-bytecode-asm,bytecode-manipulation,Java,Bytecode,Java Bytecode Asm,Bytecode Manipulation,我正在尝试为Java程序编写一个插装模块。我希望添加的一个特定工具是收集方法参数列表中的所有对象,并对它们进行一些处理 目前,为了获得对象参数列表,我从堆栈中弹出所有的方法参数,然后一个接一个地推入它们,在它们之间添加我的插装调用。虽然这基本上是有效的,但我看到了一些 java.lang.VerifyError, [1] (****) Incompatible argument to function 在大型程序中输入错误。弹出然后将对象推回堆栈是否会以某种方式改变其类型?或者,是否有更好的解

我正在尝试为Java程序编写一个插装模块。我希望添加的一个特定工具是收集方法参数列表中的所有对象,并对它们进行一些处理

目前,为了获得对象参数列表,我从堆栈中弹出所有的方法参数,然后一个接一个地推入它们,在它们之间添加我的插装调用。虽然这基本上是有效的,但我看到了一些

java.lang.VerifyError, [1] (****) Incompatible argument to function

在大型程序中输入错误。弹出然后将对象推回堆栈是否会以某种方式改变其类型?或者,是否有更好的解决方案可以在不弹出的情况下从堆栈中复制“N”个参数?

将参数弹出到哪里?我想您需要将它们存储在局部变量数组中?您完全有可能重写已经存储在那里但以后可以访问的变量。在这种情况下,您可能更改了存储变量的类型,从而在验证过程中产生错误


因为验证是一个确定的过程:只需将失败方法的字节码与验证器的投诉进行比较,并确保类型匹配。

jvm堆栈指令也是类型化的,也就是说,您不能推2个浮点数并使用双精度键调用一个方法。一个错误是忘记了
这个
参数。在每种情况下,似乎要么调用了错误的方法签名,要么堆栈参数错误。我确保了原语类型被正确调用。我只在对象中看到此错误。当我有一个演员,我弹出推对象时会发生什么?还有其他我会错过的关键案例吗?我只知道一个错误的函数调用、参数、对象、结果,要负责任——正如错误消息所说。尝试重新启动原始类并应用修补程序,直到错误发生。您可以发布实际的字节码吗?没有它,我们做不了什么。否则,我赞同约普·艾根的建议。另外,您使用的是推断还是堆栈映射验证?您的初始前提听起来是错误的,因为方法参数是在局部变量中传递的,而不是在堆栈中传递的,所以您不能首先弹出它们。因此,如果您尝试使用正确的术语解释您真正在做什么,或者更好,发布实际代码,这将是一件好事。很抱歉,我忘记更新此内容。你是对的-我在某个地方有一个bug,导致我覆盖了现有局部变量数组的最后一个元素。我发现调试这个很有帮助。谢谢