- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 ASM 和字节码操作还很陌生。我的任务相当简单:我告诉我的代理要访问什么类和方法,它会测量该方法的执行时间。测量是用 Guava 库的 Stopwatch 类完成的。 ASM 基本上通过在开头启动 Stopwatch 并在方法主体结束时停止它并打印出执行时间来包围方法主体。这对某些方法有效,但对大多数方法都失败了。
这是 ASM 访问目标方法开头的部分。
package com.agent.agentclasses;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.LocalVariablesSorter;
import org.objectweb.asm.Type;
public class ModifierMethodWriter extends LocalVariablesSorter /*MethodVisitor*/ {
private int time;
protected ModifierMethodWriter(int api, int access, String desc, MethodVisitor mv) {
super(api, access, desc, mv);
}
@Override
public void visitCode() {
System.out.println("I am @ModifierMethodWriter!");
/*
* Guava - beginning of the method !
*/
time = newLocal(Type.getObjectType("stopwatch"));
super.visitMethodInsn(Opcodes.INVOKESTATIC, "com/google/common/base/Stopwatch", "createStarted", "()Lcom/google/common/base/Stopwatch;", false);
super.visitVarInsn(Opcodes.ASTORE, time);
super.visitCode();
}
在最后添加代码!
package com.agent.agentclasses;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.AdviceAdapter;
public class AddCodeBeforeReturn extends AdviceAdapter {
public AddCodeBeforeReturn(int api, MethodVisitor mv,
int acc, String name, String desc){
super(api, mv, acc, name, desc);
}
@Override
protected void onMethodExit(int opcode) {
/*
* Guava - Before return !
*/
super.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
super.visitIntInsn(Opcodes.ALOAD, 2);
super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "com/google/common/base/Stopwatch", "stop", "()Lcom/google/common/base/Stopwatch;", false);
super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "com/google/common/base/Stopwatch", "toString", "()Ljava/lang/String;", false);
super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
}
}
这是我要测试我的代理的测试类:它是 HSQL 数据库类,我想测量 selectAll() 方法的执行时间。
package com.agent.database;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import com.agent.testclasses.*;
public class Database {
private Connection connection = null;
private ResultSet resultSet = null;
private Statement statement = null;
private String createtablestr = " CREATE TABLE IF NOT EXISTS Students(Id int,Name varchar(255));";
private static int id = 1;
public String connect() {
System.out.println("I am in connect!");
try{
Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:file:C:/hsqldb/studentdb", "sa", "");
if (connection == null)
{
return "Error: Connection failed.";
}
statement = connection.createStatement();
statement.executeUpdate(createtablestr);
}catch(Throwable ex){
ex.printStackTrace();
}
return "Connection succesful!";
}
public String insert(Student student){
connect();
try {
String insertStr = "INSERT INTO Students VALUES ('"+ id +"','"+ student.getName() + "')";
statement.executeUpdate(insertStr);
id++;
}catch(Throwable ex){ex.printStackTrace(); return "Error: Data was not written!";}
return "Data written succesfully!";
}
public String selectAll() {
connect();
String outputHTML="";
try{
resultSet = statement.executeQuery("SELECT * FROM Students");
while (resultSet.next())
{
outputHTML+= "<tr>" + "<td>" + resultSet.getString("Id") + "</td>" + "<td>" + resultSet.getString("Name") + "</td>" + "</tr>";
}
resultSet.close();
connection.commit();
connection.close();
}
catch (Throwable e)
{
e.printStackTrace();
}
return outputHTML;
}
}
最后,jvm thorws 的异常:
Exception in thread "main" java.lang.VerifyError: Stack map does not match the one at exception handler 85
Exception Details:
Location:
com/agent/database/Database.connect()Ljava/lang/String; @85: astore_2
Reason:
Type top (current frame, locals[1]) is not assignable to 'stopwatch' (stack map, locals[1])
Current Frame:
bci: @12
flags: { }
locals: { 'com/agent/database/Database', top, 'com/google/common/base/Stopwatch' }
stack: { 'java/lang/Throwable' }
Stackmap Frame:
bci: @85
flags: { }
locals: { 'com/agent/database/Database', 'stopwatch' }
stack: { 'java/lang/Throwable' }
Bytecode:
0x0000000: b800 2a4d b200 3212 34b6 003a 123c b800
0x0000010: 4257 2a12 4412 4612 48b8 004e b500 182a
0x0000020: b400 18c7 0014 1250 b200 3219 02b6 0053
0x0000030: b600 56b6 003a b02a 2ab4 0018 b900 5e01
0x0000040: 00b5 001c 2ab4 001c 2ab4 0020 b900 6402
0x0000050: 0057 a700 084d 2cb6 0067 1269 b200 3219
0x0000060: 02b6 0053 b600 56b6 003a b0
Exception Handler Table:
bci [12, 38] => handler: 85
bci [55, 82] => handler: 85
Stackmap Table:
append_frame(@55,Object[#88])
same_locals_1_stack_item_frame(@85,Object[#44])
same_frame(@90)
at com.agent.testers.tester1.main(tester1.java:15)
在我看来,ASM 在秒表的局部变量表中创建新条目后,jvm 会尝试用我尝试定位的方法(在本例中为 selectAll())的局部变量覆盖它。因此:
Type top (current frame, locals[1]) is not assignable to 'stopwatch' (stack map, locals[1])
我不确定这是否是实际问题,但我需要解决它!最后我的代理应该可以用任何方法插入。您的所有帮助将不胜感激!谢谢。
最佳答案
您正在新分配的“time”局部变量中创建“StopWatch”实例,然后从局部变量槽 2 加载它的实例,您应该在“super.visitCode()”之后添加代码。
另见 ASM FAQ Why do I get the xxx verifier error有关如何使用的更多详细信息 CheckClassAdapter调试您的字节码转换。
关于java - ASM 字节码操作 : Measuring method execution speed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27342044/
我一直在尝试实现塔詹的算法来测量图中的强连通分量。既然我还没有找到任何东西,谁能提供指导,说明如何在阿帕奇时代实现塔詹的算法来测量节点之间的连通性?以下是用python编写的代码。如何使用Apache
我正在尝试更新我的一个 Android 项目的依赖项,但我收到了这个奇怪的错误。 罪魁祸首是这一行,对于 AdMob(我之前使用的是 20.6.0): implementation "com.goog
我在一个目录中有六个 .txt 文件。因此,我创建了一个变量: $foo = gci -Name *.txt $foo 现在是一个包含六个字符串的数组。就我而言,我有 PS > $foo Extens
可能已经在其他一些上下文和依赖项中询问了这个问题。 但即使花了一整天,我仍然无法弄清楚这一点。 所以下面我将完整的错误日志与我的项目级 Gradle 文件和应用级 Gradle 文件一起粘贴。 尝试运
对于我的应用程序,我需要保留用户首选的度量单位。 目前可能的单位是: 升(存储我数据库其余部分的值的单位) 千克(随产品密度变化) 美国液体加仑(3.785411784 升) 美国液体夸脱(以上的 1
我的应用程序遇到性能问题。本质上,我单击一个按钮,列表中填充了数据绑定(bind)数据(由于数据量大,这是虚拟化的),然后单击另一个按钮,该按钮将向关联的 ListView 添加一行。我含糊其词是因为
我需要将一个 Path 对象与另一个进行比较。首先,我在 onTouchEvent 的一个路径中收集所有绘制的对象: switch (event.getAction()) {
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
swift 4.2 Xcode 10β2 背景 我正在整合一个与天文学相关的 API 来处理我正在开发的应用程序中的数学运算。目的是使用 Measurement 类来处理角度和距离的输入和输出。通过这
前言 View 的工作原理中最重要的就是测量、布局、绘制三大过程,而其中测量是最复杂的; 那么我们就来介绍下View 的测量过程; 1、MeasureSpec 测量自身的大小的时候,会
我知道 getBoundingClientRect() 返回类型为 ClientRect 或 DOMRect 的对象,并且每个对象通常都具有 x、y、width、height 等。如果您 typeof
我有一个脚本来测量执行时间,但是当我使用 Measure-Command 时,我收到了似乎不准确的信息。例如,我自己为脚本计时,大约需要 15 秒才能完成。然而,这里是最后两个输出。如您所见,一个为负
我想从屏幕顶部确定元素的位置。从其他问题来看,一种方法是使用 react native 的 .measure 属性? 引用问题:React Native: Getting the position o
我编写了以下类来通过 GoogleAnalytics 测量我的服务器端流量测量协议(protocol)。 问题是所有活跃的访问者都来自我的服务器当前所在的意大利 - 我假设问题原因来自 fsockop
我想根据规则的数量和规则的复杂性来衡量流口水的表现。因此,我需要测量处理事件所需的时间。我想编写一个像这样的简单测试: long start = System.currentTimeMillis();
考虑以下代码 import numpy as np from skimage import measure def mse(x, y): return np.mean(np.square(x
什么是统一坐标测量? (厘米、米、公里) 如何在其中实现实实在在的措施? 我想在 Unity 中实现一个真正的措施。怎么做? public Vector2 GetAsMeters (Vector2 v
我正在从事一个情感分析项目,而且我是 Python 初学者。我需要计算召回率、精度和 f 度量,但我不知道数据集的语法,如下所示: #The train data format ,contains t
我正在使用 javax.measure 将用户输入转换为秒,秒数可以从秒到天不等,但是从任何单位转换为另一个单位不起作用,这是我设置的。 String units = "d"; double valu
我正在尝试开发 android 应用程序以获取有关网络信息测量的低级信息。 我想知道如何获取这些数据? 3G:-RSCP-ECNO(不是 Eclo)-BER 2G:-RxLevelQuality-Rx
我是一名优秀的程序员,十分优秀!