`
sswh
  • 浏览: 163843 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

BTrace二三事之四:unsafe脚本需要注意的

    博客分类:
  • java
阅读更多

unsafe脚本怎样才是安全的??除了脚本对已有对象应该限于只读操作,
并且不应该持有对象的引用外,暂时所能想到的,先列几条吧:

1、启用unsafe模式:
   修改BTrace启动参数 -Dcom.sun.btrace.unsafe=true
   BTrace脚本注解:@BTrace(unsafe = true)

2、BTrace脚本类的ClassLoader为引导类加载器;
   被跟踪的类的加载器仍为原类加载器不变;
   agent在加载脚本类之前会对脚本类进行修改,
   包括修改脚本方法名称、@TLS变量修改为ThreadLocal等;

3、BTrace脚本编译后,@OnMethod、@OnError等注解的方法,
   将被添加到目标类中。而脚本中的公共调用方法,仍保留在脚本中。
   所以,被注解的方法中可以引用目标类加载器可见的类型;
   但脚本的公共调用方法中,只能引用引导类加载器可见的类型,
   否则运行期报NoClassDefFoundError

4、进入方法为location = @Location(Kind.ENTER)
   退出方法的途径有2个:
   正常退出:location = @Location(Kind.RETURN)
   异常退出:location = @Location(Kind.ERROR)

5、可以用-Dcom.sun.btrace.dumpClasses=true
   -Dcom.sun.btrace.dumpDir=./yourDumpDir方式将修改后的类转储,
   借助反编译工具查看增强后的代码;

6、BTrace1.2.2版本的BUG:
   @OnMethod(clazz = "+my.Command", method = "execute")
   如果agent附加到目标进程时,已经加载过“+”对应的子类,
   那么只有已加载的子类会被修改,之后加载的子类不会被脚本代码所修改;
  
@BTrace(unsafe = true)
public class SampleScript {

	@TLS
	// 在转换后的Script脚本类中,@TLS变量会自动声明为ThreadLocal变量
	static Object fooParam;

	@OnMethod(clazz = "/my\\..*?Command/", method = "execute", type = "void(my.FooParam)")
	public static void onExecute(@ProbeClassName
	String className, AnyType fooParam) {
		SampleScript.fooParam = fooParam;
	}

	@OnMethod(clazz = "/my\\..*?Command/", method = "execute", location = @Location(Kind.RETURN), type = "void(my.FooParam)")
	public static void onExecuteReturn(@ProbeClassName
	String className) {
		BTraceUtils.println("execute return : className = " + className);
		BTraceUtils.println("param : fooParam = " + fooParam);
		// 这儿引用Foo1Command不会有问题
		Foo1Command command = new Foo1Command();
		System.out.println(command.toString());
		// 在test()引用Foo1Command将抛出NoClassDefFoundError
		test();
	}

	@OnMethod(clazz = "/my\\..*?Command/", method = "execute", location = @Location(Kind.ERROR), type = "void(my.FooParam)")
	public static void onExecuteError(@ProbeClassName
	String className, Throwable e) {
		BTraceUtils.println("execute error : className = " + className);
		BTraceUtils.println("param : fooParam = " + fooParam);
		BTraceUtils.println("throw : message = " + e.getMessage());
	}

	public static void test() {
		System.out.println("test...");
		// 将抛出NoClassDefFoundError
		Foo1Command command = new Foo1Command();
		System.out.println(command.toString());
	}
}


public class BTraceStarter {

	public static void main(String[] args) throws Exception {

		String classpath = System.getProperty("java.class.path");
		if (!classpath.contains("tools.jar")) {
			throw new RuntimeException("请在类路径中设置tools.jar!");
		}

		System.setProperty("com.sun.btrace.probeDescPath", ".");
		System.setProperty("com.sun.btrace.dumpClasses", "true");
		System.setProperty("com.sun.btrace.dumpDir", "./dump");
		System.setProperty("com.sun.btrace.debug", "false");
		System.setProperty("com.sun.btrace.unsafe", "true");

		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("请输入目标进程PID: ");
		String pid = in.readLine();

		String script = new File(BTraceStarter.class.getResource("SampleScript.class").getFile()).getCanonicalPath();
		com.sun.btrace.client.Main.main(new String[] { pid, script });
	}
}
1
0
分享到:
评论
1 楼 xwqiang 2015-04-08  
我执行这个脚本有异常:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at com.sun.btrace.client.Client.attach(Client.java:224)
at com.sun.btrace.client.Main.main(Main.java:156)
at my.app.test.BTraceStarter.main(BTraceStarter.java:35)

也就是执行com.sun.btrace.client.Main.main(new String[] { pid, script });
的时候异常。
方法中pid script都有且script文件存在,请问是怎么回事。谢过!

相关推荐

    java魔法类:Unsafe应用

    java魔法类:Unsafe应用

    JDK8中sun.misc下UnSafe类源代码 UnSafe.java

    四、风险与注意事项 尽管UnSafe提供了强大的功能,但使用时必须谨慎。不恰当的使用可能导致数据不一致、内存泄漏甚至安全问题。此外,由于Java版本的更新,某些方法可能在未来的JDK中被弃用或改变行为,因此依赖于...

    sun.misc.Unsafe源码

    尽管`Unsafe`提供了强大且底层的接口,但它的使用需要谨慎。不当的使用可能导致内存泄漏、数据不一致、安全风险等问题。在大多数情况下,Java的标准API和并发工具已经足够处理大部分编程需求。不过,了解`Unsafe`的...

    探秘Java并发:Atomic&Unsafe的强大魔法

    本文深入解析Java并发编程中的两个关键类:Atomic和Unsafe。...风险与挑战:文中也强调了使用这些高级特性时的风险和挑战,特别是Unsafe类的使用,需要特别注意以避免潜在的安全问题和稳定性影响。

    JDK Unsafe 源码注释

    标题“JDK Unsafe 源码注释”和描述提示我们,接下来的内容将围绕JDK中非标准的Unsafe类进行。Unsafe类是Sun公司内部的一个类,它不是JDK标准API的一部分,而存在于sun.misc包中。虽然Oracle发行的JDK版本不包含...

    MySQL:Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEM

    150602 14:40:02 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT… SELECT… ON DUPLICATE KEY UPDATE is unsafe because the order in ...

    解决VS中This function or variable may be unsafe的安全检查错误.docx

    在Visual Studio中,开发者可能会遇到一个警告或错误,提示"This function or variable may be unsafe",这是由于Microsoft引入的安全开发生命周期(Security Development Lifecycle, SDL)检查机制。该机制旨在提高...

    看雪2017安全开发者峰会ppt-10.Java_JSON反序列化之殇

    在本篇文档中,主题聚焦于“看雪2017安全开发者峰会ppt-10.Java_JSON反序列化之殇”,探讨了Java语言中JSON处理库的安全问题和防御措施。首先,我们将分析目前主流的JSON处理库,包括Gson、Jackson和Fastjson,并...

    CS使用Unsafe的方法向DLL传参

    ### CS使用Unsafe的方法向DLL传参 #### 背景介绍 在跨语言编程中,经常会出现需要在不同编程语言间传递数据的情况。比如,在C#中调用C/C++编写的动态链接库(DLL)时,就可能遇到类型不匹配的问题。本文将通过一个...

    netty-unsafe总结

    对Netty中的Unsafe做了简单的总结,构建自己的知识网!!!

    一篇看懂Java中的Unsafe类

    3. **直接内存访问**:`Unsafe`可以分配非堆内存,不占用Java堆空间,但需要手动管理。这对于提高性能、减少垃圾收集的开销很有帮助,但同时也可能导致内存泄漏。 ### 2. `Unsafe`类源码分析 `Unsafe`类包含大量...

    unsafe:使用sun.misc.Unsafe的各种Java类

    unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不存储对集合内对象的引用,而是直接将元素复制到列表中。 这有一些有趣的特性...

    跨站点脚本编制问题解决

    跨站点脚本(Cross-Site Scripting,简称XSS)是一种常见的网络安全问题,它发生在攻击者能够在用户浏览器中注入恶意脚本时。这些脚本可以伪装成受信任的网站,从而窃取用户的敏感信息,如登录凭据或执行其他恶意...

    解决VS中This function or variable may be unsafe的安全检查错误.pdf

    值得注意的是,虽然这样可以绕过编译器的安全检查,降低编译错误,但同时也可能使程序更容易遭受安全攻击。因此,如果决定不使用安全检查,需要有充分的理由,并对潜在风险有清晰的认识。 微软提供SDL检查是为了...

    JDK8中sun.misc包下的UnSafe类

    JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com

    Java Unsafe类1

    Java中的`Unsafe`类是一个非常特殊且强大的工具类,它提供了对Java内存模型的底层访问。这个类在`sun.misc`包下,由于其潜在的危险性和不稳定性,官方并不推荐直接使用,甚至在Java 9之后有计划移除部分功能。然而,...

    Java并发编程之LockSupport、Unsafe详解.docx

    在Java并发编程中,LockSupport和Unsafe是两个关键的工具类,它们提供了底层的线程控制功能,使得开发者能够深入地管理和控制线程的行为。LockSupport是Java并发库中的一个核心工具类,它提供了线程的阻塞和唤醒功能...

    glsp:GameLisp脚本语言

    请注意,目前GameLisp需要最新版本的夜间锈病。 贡献 支持项目持续发展的最直接方法是通过 。如果您发现GameLisp有用或有趣,请考虑做出贡献! 错误报告和请求请求是受欢迎的。提交给作品的所有贡献将按以下所述获得...

    Unsafe_jdk1.5_rt.jar

    《深入理解Java Unsafe类在JDK 1.5中的应用》 在Java编程语言中,`Unsafe`类是一个特殊的存在,它提供了对内存操作的直接访问权限,绕过了Java的一些安全机制。在JDK 1.5版本的`rt.jar`库中,`Unsafe`类扮演着一个...

Global site tag (gtag.js) - Google Analytics