btrace使用总结(完全突破安全限制,引用第三方包)

简介: btrace使用总结(完全突破安全限制,引用第三方包)

由于认识JAVA代码热更新在先,所以Btrace这一神器似乎失去了一些光芒,但他的优势是无任何侵入性,可以做一些代码热更新没法做的事情,做到两者互补。

比如

1 可以直接运行java文件,少了一步编译,更可以在线上直接修改代码

2.可以独立的打印到单独的文件中

3.想进第三方jar包里的方法里方法内的数据track,

4.输入和返回数据track

5.内存不够时的track

6.异常未有捕获时的track

Kind.Error, Kind.Throw和 Kind.Catch

Throw:异常抛出,Catch:异常被捕获,Error:异常没被捕获而被抛出函数之外,主要用于对某些异常情况的跟踪。

缺点:

1.BTrace植入过的代码,会一直在,直到应用重启为止。所以即使BTrace退出了,业务函数每次执行时都会多出一次BTrace是否Attach状态的判断。

2.必须到相关java进程所在的机器上去执行,不能远程执行

1.如何解除安全限制:

只能调用BTraceUtils 里的一系列方法和脚本里定义的static方法,不允许其他调用任何类的任何方法。 比如不允许创建对象,比如不允许For 循环等等

但我们其实很需要调用第三方包,自己写的类,所以如何突破限制呢?

命令行加 -u,BTrace类的头加上@BTrace(trusted=true)

2.如何引用第三方包:

-cp .:game-common.jar:game-data-1.0.0-RELEASE.jar

每个jar包都要显式的列出来,这个有点笨,不能直接指向一个目录?有什么更好的办法请告之。

3.打印到单独的文件,并可以一直tracer

./btrace  -cp .:game-common.jar:game-data-1.0.0-RELEASE.jar -u -v 15659   HelloWorld.java > btrace.log 2>&1 &

package com.sun.btrace.samples;
import static com.sun.btrace.BTraceUtils.println;
import com.imi.common.id.ServerObject;
import com.imi.common.util.StringUtil;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Duration;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.Return;
import com.sun.btrace.annotations.Self;
@BTrace(trusted=true)
public class HelloWorld {
  @OnMethod(clazz = "com.imi.gate.action.UserAction", method = "login", location = @Location(value = Kind.RETURN))
  public static void onUserAction_login(@Return Void value, @Duration long duration) {
    println("interval:" + duration / 1000000);
  }
  @OnMethod(clazz = "com.imi.common.id.ServerObject", method = "newId", location = @Location(value = Kind.ENTRY))
  public static void onnewId(@Self ServerObject value) {
    {
      println(StringUtil.format("id={}", value.getId()));
      if(value.getId()>0){
        BTraceUtils.jstack();
      }
    }
  }
}

 

 

BTrace是神器,每一个需要每天解决线上问题,但完全不用BTrace的Java工程师,都是可疑的 -- 凯尔文. 萧

下载地址:

http://github.com/btraceio/btrace

参考文档:

BTrace使用总结(江南白衣)

目录
相关文章
|
3天前
|
编译器 Linux C语言
编译并运行 Cython 代码的几种方式
编译并运行 Cython 代码的几种方式
11 0
|
3月前
|
Java Maven 编译器
Java编译器注解运行和自动生成代码问题之Maven编译时设置生成的源码的文件夹路径问题如何解决
Java编译器注解运行和自动生成代码问题之Maven编译时设置生成的源码的文件夹路径问题如何解决
|
存储 IDE Java
命令行下的Java包结构编译与执行
本文介绍命令行下的Java包结构编译与执行方法
142 0
命令行下的Java包结构编译与执行
|
编译器 C++ Windows
Qt程序运行依赖环境打包方法:windeployqt方法
3分钟学会Qt程序运行依赖环境打包方法:windeployqt方法!
431 0
Qt程序运行依赖环境打包方法:windeployqt方法
|
Java Linux 计算机视觉
JAVA加载一个目录下有依赖关系本地库的通用代码
JAVA加载一个目录下有依赖关系本地库的通用代码
74 0
|
Java
运行JAVA程序发现找不到或无法加载主类问题解决方法
运行JAVA程序发现找不到或无法加载主类问题解决方法
503 0
运行JAVA程序发现找不到或无法加载主类问题解决方法
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(一)
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(一)
259 0
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(一)
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(二)
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(二)
166 0
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(二)
|
XML Java jenkins
Jenkins教程之java代码编译、打包、代码扫描
java代扫描的话,可以集成一下sonarqube的扫描,同时可以在扫描代码的同时再统计一下代码行数等信息。
Jenkins教程之java代码编译、打包、代码扫描
java类中无法识别依赖包的问题
前段时间因为当前项目比较闲,被换到其他项目组做事情。换项目组带来的问题是,需要下载新的项目,并配置新的开发环境。这次换项目的过程中,有个环节让我花了不少时间折腾,以下就是遇到的问题。
1533 0