BTrace 是一款利用hotSpot虚拟机可以动态替换class的特点而完成的,可以对online的程序动态的改变类的行为(一般为加些打印日志),进而进行线上调试的一个工具。
主要步骤如下(本次测试只针对BTrace和测试的程序在同一台机器上,remote的还待实验):
1、下载地址:http://kenai.com/projects/btrace/downloads/download/releases/
2、解压到linux相应的目录下。
3、编写普通运行的程序如下:
package com.ddc.mem;
public class CaseObject{
private static int sleepTotalTime=0;
public boolean execute(int sleepTime) throws Exception{
System.out.println("sleep: "+sleepTime);
sleepTotalTime+=sleepTime;
Thread.sleep(sleepTime);
if(sleepTime%2==0)
return true;
else
return false;
}
}
Main函数运行:
package com.ddc.mem;
import java.util.Random;
public class CaseObjectMain {
public static void main(String[] args) throws Exception{
Random random=new Random();
CaseObject object=new CaseObject();
while(true){
boolean result=object.execute(random.nextInt(1000));
Thread.sleep(1000);
}
}
}
4、将以上两个类编译并运行 。
5、编写BTrace 文件,按照java规范,java文件名称为TracingScript.java
/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TracingScript {
/* put your code here */
/*指明要查看的方法,类*/
@OnMethod(
clazz="com.ddc.mem.CaseObject",
method="execute",
location=@Location(Kind.RETURN)
)
/*主要两个参数是对象自己的引用 和 返回值,其它参数都是方法调用时传入的参数*/
public static void traceExecute(@Self com.ddc.mem.CaseObject object,int sleepTime, @Return boolean result){
println("调用堆栈!!");
println(strcat("返回结果是:",str(result)));
jstack();
println(strcat("时间是:",str(sleepTime)));
}
}
6、对于btrace文件夹加运行时路径(java_home 和 classpath)
修改{btrace_home}/bin/btrace 文件
#! /bin/sh
#需要设置jdk的路径,因为需要动态编译,所以需要设置这个路径
JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.22
#因为需要动态编译,所以需要设置原类库的classpath,主要是要编译BTRACE文件,它里面肯定有依赖原类
CLASS_PATH=/data/testxiao/
#BTRACE_HOME路径,编译以及运行时都需要BTRACE自己的jar包
BTRACE_HOME=/data/btrace
if [ -z "$BTRACE_HOME" -o ! -d "$BTRACE_HOME" ] ; then
# resolve links - $0 could be a link to btrace's home
PRG="$0"
progname=`basename "$0"`
BTRACE_HOME=`dirname "$PRG"`/..
BTRACE_HOME=`cd "$BTRACE_HOME" && pwd`
fi
if [ -f "${BTRACE_HOME}/build/btrace-client.jar" ] ; then
if [ "${JAVA_HOME}" != "" ]; then
case "`uname`" in
Darwin*)
# In Mac OS X, tools.jar is classes.jar and is kept in a
# different location. Check if we can locate classes.jar
# based on ${JAVA_VERSION}
TOOLS_JAR="/System/Library/Frameworks/JavaVM.framework/Versions/${JAVA_VERSION}/Classes/classes.jar"
# if we can't find, try relative path from ${JAVA_HOME}. Usually,
# /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
# is JAVA_HOME. (or whatever version beyond 1.6.0!)
if [ ! -f ${TOOLS_JAR} ] ; then
TOOLS_JAR="${JAVA_HOME}/../Classes/classes.jar"
fi
# If we still can't find, tell the user to set JAVA_VERSION.
# This way, we can avoid zip file errors from the agent side
# and "connection refused" message from client.
if [ ! -f ${TOOLS_JAR} ] ; then
echo "Please set JAVA_VERSION to the target java version"
exit 1
fi
;;
*)
TOOLS_JAR="${JAVA_HOME}/lib/tools.jar"
;;
esac
${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:${CLASS_PATH} com.sun.btrace.client.Main $*
else
echo "Please set JAVA_HOME before running this script"
exit 1
fi
else
echo "Please set BTRACE_HOME before running this script"
exit 1
fi
7、jps CaseObjectMain进程的pid,假设pid为1478 ,刚才的btrace 为TracingScript.java
则运行命令为 :bin/btrace 1478 TracingScript.java
8、一切ok
输出如下:
调用堆栈!!
返回结果是:false
com.ddc.mem.CaseObject.execute(CaseObject.java:14)
com.ddc.mem.CaseObjectMain.main(CaseObjectMain.java:11)
时间是:483
调用堆栈!!
返回结果是:true
com.ddc.mem.CaseObject.execute(CaseObject.java:12)
com.ddc.mem.CaseObjectMain.main(CaseObjectMain.java:11)
时间是:998
调用堆栈!!
返回结果是:false
com.ddc.mem.CaseObject.execute(CaseObject.java:14)
com.ddc.mem.CaseObjectMain.main(CaseObjectMain.java:11)
时间是:611
调用堆栈!!
返回结果是:true
com.ddc.mem.CaseObject.execute(CaseObject.java:12)
com.ddc.mem.CaseObjectMain.main(CaseObjectMain.java:11)
时间是:524
相关推荐
MQTT调试工具:mqttfx-1.7.1-windows-x64
### ILITEK 触摸屏 ITS调试工具中文版——Windows-Studio-ITS-User-Guide(CHT)-v1.0.3.5 #### 一、概述 ILITEK触摸屏ITS调试工具是一款专为ILITEK触摸屏设计的专业调试与优化软件。此工具能够帮助用户实现对触摸屏...
vue开发调试工具--vuejs-deltools
【调试工具|mqtt-spy】mqtt客户端调试工具 mqtt-spy 详细使用教程
《信捷串口调试工具T-COM及其使用详解》 在工业自动化领域,串口通讯是一种常见的设备间通信方式,而信捷串口调试工具T-COM是针对此类通讯问题的专业辅助工具。本文将深入探讨T-COM的功能、特点以及如何有效使用它...
WEB调试工具---Firebug.txt 前端必备技能,助你快速掌握
发条JS调试工具JS-ED_1.9.rar
在使用NB-IoT串口调试工具时,你需要了解以下关键知识点: 1. **串口通信**:串口通信是一种常见的硬件接口,允许计算机或其他设备之间进行数据交换。在NB-IoT应用中,串口常用于将控制指令和数据发送到NB-IoT模块...
**发条JS调试工具JS-ED 1.9:深入理解与应用** 发条JS调试工具JS-ED 1.9是一款专为JavaScript开发者设计的强大调试工具,它可以帮助程序员高效地定位并解决代码中的错误,优化性能,以及提升开发效率。在本文中,...
本文将详细介绍JavaScript调试工具的关键知识点,并以WT-JS.exe为例,探讨其特性和使用方法。 **一、JavaScript调试基础** 1. **断点调试**:断点是调试的核心功能,可以在代码的特定行设置,当程序运行到该行时...
E-Tool, A Tool Easy To Use , 用于嵌入式软件工程师、创客等的开发工作。 功能: 串口相关工具 串口助手 串口文本传输 ISP下载工具 串口绘图 串口摄像头 网络相关工具 网络调试助手
西门子V90伺服调试工具SINAMICS-V-ASSISTANT-v1-05-05是一款专为西门子V90系列伺服驱动器设计的强大调试软件。该工具集成了最新的技术,版本号1.05.05,确保了与最新的硬件和系统兼容性,为用户提供高效便捷的调试...
在实际应用中,103调试工具的使用步骤大致包括: 1. 配置通信参数:根据设备手册设定正确的串口或网络参数。 2. 建立连接:连接到目标设备,进行链路层的测试。 3. 发送测试报文:通过工具发送预设的报文,测试接收...
DL-T645-2007调试软件是针对这一通信规约开发的专业工具,它主要用于测试、验证和调试符合该规约的电能表和数据采集设备。软件提供了丰富的功能,包括数据帧的构建、发送、接收和解析,确保了设备之间的通信准确无误...
USR-TCP232-Test是一款专为网络设备调试设计的工具,主要针对USR IOT公司的TCP/IP到串口转换器进行测试和配置。这款工具能够帮助用户在没有物理连接的情况下,通过网络对设备进行远程调试,极大地提升了工作效率。...
vs2015远程调试端,用于远程调试使用的工具,远程调试必备。
2. **安全性**:BTrace使用JDK的动态代理机制,确保只在安全的点插入探查代码,避免引发运行时错误或性能下降。 3. **实时性能分析**:通过BTrace,你可以实时查看方法调用的时间、对象创建频率、内存分配情况等,...
本文将详细讲解103规约及其调试工具的相关知识点。 1. **103规约概述** IEC60870-103标准是国际电工委员会制定的电力系统自动化设备间通信协议的一部分,主要应用于电力系统的遥测、遥控和遥信功能。它支持通过...
在Linux下,通常使用命令行工具如`tcpdump`、`netstat`、`ss`等进行网络调试,但这些工具对于初学者或者需要快速可视化分析的场景可能不够友好。这就是`sokit-master`的作用,它提供了图形化的界面,能够帮助用户...
PELCO-D协议调试助手是一款专门针对PELCO-D协议进行测试和开发的工具,它提供了用户友好的界面,使得用户能够轻松地进行指令发送,从而简化了在开发过程中的调试工作。PELCO-D是一种广泛应用在闭路电视监控系统...