首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向Java的JDI隐藏变量?

如何向Java的JDI隐藏变量?
EN

Stack Overflow用户
提问于 2020-08-09 11:51:09
回答 1查看 271关注 0票数 0

我正在测试一些类并引入一些新的局部变量。现在,当用户在代码中放置一个断点并停止执行时,可以在Intellij的调试器窗口中看到新引入的局部变量。我怎么能把它们藏起来?

更新:我将不得不以某种方式从检测代码中删除调试信息,但不确定如何做到这一点。

更新2:我正在使用ASM库进行测试。

代码语言:javascript
复制
 public void visitCode() {
       this.mv.visitLdcInsn(stringToPass);
       this.mv.visitMethodInsn(Opcodes.INVOKESTATIC, "MyAgentClass", "loadData", "(Ljava/lang/String;)LDataClass;", false);
       this.mv.visitVarInsn(Opcodes.ASTORE, this.getDataIndex());
}


public void visitMaxs(int maxStack, int maxLocals) {
     if (this.myStartLabel != null && this.myEndLabel != null) {
        this.mv.visitLocalVariable("__my__data__", "Ljava/lang/Object;", (String) null, this.myStartLabel, this.myEndLabel, this.getDataIndex());
     }

       super.visitMaxs(maxStack, maxLocals);
 }

__my__data__显示在Intellij中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-15 15:04:56

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.13

根据JVM规范,可以从LocalVariableTable中删除本地变量。Javassist在生成的代码中自动执行此操作,在运行过程中我看不到变量secretCode:

反编译结果类可以显示它没有LocalVariableTable条目:

代码语言:javascript
复制
  public void run();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=1
         0: ldc           #39                 // int -889275714
         2: istore_1
         3: iload_1
         4: invokestatic  #43                 // Method org/example/App.test:(I)Ljava/lang/Integer;
         7: astore_2
         8: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
        11: aload_2
        12: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
        15: new           #2                  // class SecreFoo
        18: dup
        19: invokespecial #3                  // Method "<init>":()V
        22: astore_1
        23: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
        26: aload_1
        27: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
        30: return
      LineNumberTable:
        line 14: 15
        line 15: 23
        line 16: 30
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      31     0  this   LSecreFoo;
           23       8     1 fCopy   LSecreFoo;

因此,在对类进行检测时,从表中删除所有局部变量(或不添加它们)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63325980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档