用过Btrace unsafe模式来解答下,unsafe模式能不能创建对象?

shigangxing 2013-12-14
Btrace UserGuide(https://kenai.com/projects/btrace/pages/UserGuide )中提到 BTrace Restrictions ,又提到设置unsafe参数就不会检查‘BTrace Restrictions’

BTrace Restrictions
      can not create new objects.
      can not create new arrays.
      can not throw exceptions.
      ... ...

Supported Arguments
      unsafe - do not check for btrace restrictions violations (true/false)

     
我在btrace shell 脚本中指定了-Dcom.sun.btrace.unsafe=true,但还是不能create new object?

在网上找了两篇文章,都说unsafe管用:
        https://blogs.oracle.com/sundararajan/entry/btrace_unsafe_mode
        http://ar.newsmth.net/thread-cc7a8616494125.html

到底unsafe模式下能不能创建对象?如果不能,unsafe模式有什么用?
shigangxing 2013-12-17
no body use btrace? 还是我描述的不明白?
sswh 2013-12-18
unsafe模式下,我之前写过的脚本经常会在里面new HashMap()来用。

所以,这点是确信无疑的。

---------------------

我觉得,unsafe模式下几乎没有什么限制。

我唯一确认的,就是因为:

1、BTrace脚本是使用系统类加载器加载的;
2、BTrace脚本中的@OnMethod(..){}中的字节码会被复制到目标类中。
   (注意是复制字节码!!)
3、BTrace脚本中的静态方法,则会保留在BTrace脚本类中,
   (注意是静态方法不会被复制到目标类!!)
4、所以,在脚本的静态方法中,不能引用系统类加载器以外的类!!
   否则运行时,会报NoClassDefFoundError。(比如静态方法不要访问WebApp里面的类)

---------------
这是我确认的使用BTrace的限制。 除了因为类加载器的缘故导致的一些限制外,
其他BTrace脚本和普通的Java代码没区别。

当然,BTrace脚本编译后的Class,被BTrace加载的时候,会使用字节码工具对
脚本Class进行一些修改和增强,典型的就是@TLS这样的变量会被修改为ThreadLocal对象。
shigangxing 2013-12-18
sswh 写道
unsafe模式下,我之前写过的脚本经常会在里面new HashMap()来用。

所以,这点是确信无疑的。

---------------------

我觉得,unsafe模式下几乎没有什么限制。

我唯一确认的,就是因为:

1、BTrace脚本是使用系统类加载器加载的;
2、BTrace脚本中的@OnMethod(..){}中的字节码会被复制到目标类中。
   (注意是复制字节码!!)
3、BTrace脚本中的静态方法,则会保留在BTrace脚本类中,
   (注意是静态方法不会被复制到目标类!!)
4、所以,在脚本的静态方法中,不能引用系统类加载器以外的类!!
   否则运行时,会报NoClassDefFoundError。(比如静态方法不要访问WebApp里面的类)

---------------
这是我确认的使用BTrace的限制。 除了因为类加载器的缘故导致的一些限制外,
其他BTrace脚本和普通的Java代码没区别。

当然,BTrace脚本编译后的Class,被BTrace加载的时候,会使用字节码工具对
脚本Class进行一些修改和增强,典型的就是@TLS这样的变量会被修改为ThreadLocal对象。

请问你用btrace哪个版本?
sswh 2013-12-18
1.2.2
shigangxing 2013-12-18
@BTrace(unsafe=true)  https://kenai.com/jira/browse/BTRACE-105

最终在注解上加unsafe=true解决。感谢@sswh回复
Global site tag (gtag.js) - Google Analytics