普通情况下,Btrace脚本有诸多的限制:
BTrace的作者这样做也是有安全方面的考虑,不过有些时候,如果能关闭这些限制,BTrace的功能将大大增强。
通过starfish的脚本发现这个限制的开关原理就是com.sun.btrace.unsafe,设置在${BTRACE_HOME}/bin/btrace 中
${JAVA_HOME}/bin/java -Dcom.sun.btrace.probeDescPath=. -Dcom.sun.btrace.dumpClasses=false -Dcom.sun.btrace.debug=false -Dcom.sun.btrace.unsafe=false -cp ${BTRACE_HOME}/build/btrace-client.jar:${TOOLS_JAR}:/usr/share/lib/java/dtrace.jar com.sun.btrace.client.Main $*
一行,
测试如下:
测试程序源代码:
测试btrace脚本:
启动测试程序,输出如下:
正常情况下启动btrace:
报错,显然不允许调用BTraceUtils以外的方法,修改com.sun.btrace.unsafe为true,再次启动测试:
目标测试程序输出所需结果:
哈哈,done!随便拦截任何目标java程序代码并执行其他代码,功能好强大!
不过线上使用时,还是要小心小心再小心,才可以开启unsafe开关,避免造成事故。
-- EOF --