使用重要的新信息进行了更新(请参阅底部)
使用更好的记录代码进行编辑
我正在跟踪应用程序中的某些图形损坏,并将其追溯到此功能(我随便记录了日志):
public final int p_PostDraw(){
bb_std_lang.print("Dissolve encountered.");
float t_d=c_GColour.m_dissolve;
bb_std_lang.print("Cached dissolve value locally: "+c_GColour.m_dissolve+ " " + t_d);
c_GColour.m_dissolve=c_Gel.m_colstack.p_Top().m_a;
bb_std_lang.print("Updated dissolve value: " + c_GColour.m_dissolve);
c_Gel.m_colstack.p_Top().m_a=1.0f;
bb_std_lang.print("Monitoring t_d="+t_d);
super.p_PostDraw();
bb_std_lang.print("Monitoring t_d="+t_d);
c_GColour.m_dissolve=t_d;
bb_std_lang.print("Dissolve post restore " + c_GColour.m_dissolve);
return 0;
}
在大多数情况下,它会按预期运行,但是在游戏中的某个时刻,会记录下来:
09-30 14:40:59.086 10545-11101/? I/[Monkey]: Dissolve encountered.
09-30 14:40:59.086 10545-11101/? I/[Monkey]: Cached dissolve value locally: 1.0 1.0
09-30 14:40:59.086 10545-11101/? I/[Monkey]: Updated dissolve value: 0.1
09-30 14:40:59.086 10545-11101/? I/[Monkey]: Monitoring t_d=1.0
09-30 14:40:59.087 10545-11101/? I/[Monkey]: Monitoring t_d=-1.6314132E-19
09-30 14:40:59.087 10545-11101/? I/[Monkey]: Dissolve post restore -1.6314132E-19
为您分解:静态值m_dissolve复制到局部变量t_d中,并且值为1.0f。然后将静态值修改为0.1f,并将其用于子对象的呈现中。完成此操作后,局部变量t_d在用于恢复静态值之前再次被记录,但同时神秘地变为-1.6314132E-19(此值每次看起来都无法预测地不同)。]]
我不知道以何种方式可以破坏本地Java变量。
UPDATE:
作为测试,我使t_d成为包含上面代码清单的类的成员变量(而不是局部变量),并且其值不再损坏。
作为进一步的测试,我然后添加了一些局部浮点变量(m_e至m_j),除了在super.p_PostDraw()之前和之后打印出来之外,这些变量什么都没用。这就是发生的情况:
09-30 15:20:51.219 28384-28877/? I/[Monkey]: M_E ETC BEFORE: 1.0 1.0 1.0 1.0 1.0 1.0 09-30 15:20:51.220 28384-28877/? I/[Monkey]: M_E ETC AFTER: 6.7E-44 6.7E-44 6.7E-44 6.7E-44 6.7E-44 6.7E-44
然后我从logcat中删除了所有过滤器,并发现它们潜伏在这两行之间:
09-30 15:20:51.219 28384-28877/? I/[Monkey]: M_E ETC BEFORE: 1.0 1.0 1.0 1.0 1.0 1.0 09-30 15:20:51.220 28384-28877/? I/zygote64: Deoptimizing int app.hidden.name.c_IffLT.p_Update4(app.hidden.name.c_Gel) due to JIT inline cache 09-30 15:20:51.220 28384-28877/? I/zygote64: Deoptimizing int app.hidden.name.c_Delay.p_Pump2(app.hidden.name.c_Gel) due to JIT inline cache 09-30 15:20:51.220 28384-28877/? I/zygote64: Deoptimizing int app.hidden.name.c_SetUniform_4F.p_Update4(app.hidden.name.c_Gel) due to JIT inline cache 09-30 15:20:51.220 28384-28877/? I/zygote64: Deoptimizing int app.hidden.name.c_EX_VarString.p_Set7(app.hidden.name.c_Expression) due to JIT inline cache 09-30 15:20:51.220 28384-28877/? I/zygote64: Deoptimizing java.lang.String app.hidden.name.c_EX_Format.p_AsString() due to JIT inline cache 09-30 15:20:51.220 28384-28877/? I/zygote64: Deoptimizing int app.hidden.name.c_IffNotEqual.p_Update4(app.hidden.name.c_Gel) due to JIT inline cache 09-30 15:20:51.220 28384-28877/? I/zygote64: Deoptimizing int app.hidden.name.c_PinVP.p_Update4(app.hidden.name.c_Gel) due to JIT inline cache 09-30 15:20:51.220 28384-28877/? I/[Monkey]: M_E ETC AFTER: 6.7E-44 6.7E-44 6.7E-44 6.7E-44 6.7E-44 6.7E-44
UPDATE:
我调整了上面的代码以将局部变量设置为不同的值,而不是全部设置为1.0f,并且发生了这种情况:
。09-30 15:56:37.686 1815-2373/? I/[Monkey]: M_E BEFORE: 2.0 1.0 3.0 4.0 5.0 1.0 09-30 15:56:37.687 1815-2373/? I/zygote64: Deoptimizing int app.hidden.name.c_IffLT.p_Update4(app.hidden.name.c_Gel) due to JIT inline cache 09-30 15:56:37.687 1815-2373/? I/zygote64: Deoptimizing int app.hidden.name.c_Delay.p_Pump2(app.hidden.name.c_Gel) due to JIT inline cache 09-30 15:56:37.687 1815-2373/? I/zygote64: Deoptimizing int app.hidden.name.c_SetUniform_4F.p_Update4(app.hidden.name.c_Gel) due to JIT inline cache 09-30 15:56:37.687 1815-2373/? I/zygote64: Deoptimizing int app.hidden.name.c_EX_VarString.p_Set7(app.hidden.name.c_Expression) due to JIT inline cache 09-30 15:56:37.688 1815-2373/? I/zygote64: Deoptimizing java.lang.String app.hidden.name.c_EX_Format.p_AsString() due to JIT inline cache 09-30 15:56:37.688 1815-2373/? I/zygote64: Deoptimizing int app.hidden.name.c_IffNotEqual.p_Update4(app.hidden.name.c_Gel) due to JIT inline cache 09-30 15:56:37.688 1815-2373/? I/zygote64: Deoptimizing int app.hidden.name.c_PinVP.p_Update4(app.hidden.name.c_Gel) due to JIT inline cache 09-30 15:56:37.688 1815-2373/? I/[Monkey]: M_E AFTER: 2.0 -5.6063644E-30 3.0 4.0 5.0 -5.6063644E-30
换句话说,只有设置为1.0f的局部变量被破坏。不是第一个声明的内容或任何东西,只是将其设置为1.0f。然后,我尝试将所有局部变量设置为1.0f以外的其他数字,并且未发生损坏
当然,对于有史以来最晦涩的错误,肯定有某种奖励吗?如果ART取消优化功能,则局部变量将被破坏,但前提是该局部变量的值为1.0?]
使用重要的新信息更新(请参阅底部),使用更好的日志记录代码进行编辑,我正在跟踪应用程序中的某些图形损坏,并将其追溯到此功能(我已经自由地使用了...
我不知道以何种方式可以破坏本地Java变量。