java线上实时debug利器

BTrace

BTrace可用于动态跟踪正在运行的Java程序。BTrace官网:https://github.com/btraceio/btrace

安装

1
2
3
4
5
6
7
8
#下载安装包
wget https://github.com/btraceio/btrace/releases/download/v1.3.11.3/btrace-bin-1.3.11.3.tgz
#解压
tar -xzvf btrace-bin-1.3.11.3.tgz
#添加PATH和JAVA_HOME环境变量
vim ~/.bashrc
export PATH=$PATH:/root/btrace/bin
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64

编写BTrace脚本

BTrace脚本是纯java代码,主要使用BTrace提供的工具btrace.BTraceUtils和注解btrace.annotations来实现对监控对象的实时打印统计。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class V2RTrace {
@OnMethod(
clazz="com.serverbase.controller.V2RForClientController",
method="sendSms",
location=@Location(Kind.RETURN)
)
public static void traceExecute(String mobile , @Return Object result){
println("call V2RForClientController.");
println(strcat("param mobile is:",(mobile)));
println(strcat("return status is:",str(get(field("com.serverbase.common.dto.ServerReturn", "status"), result))));
println(strcat("return msg is:",str(get(field("com.serverbase.common.dto.ServerReturn", "msg"), result))));
}
}

运行btrace

btrace运行命令如下所示:

btrace -cp /root/btrace/build -p 16111 4634 ./V2RTrace.java

-cp 指定classpath包含btrace的jar包路径

-p 指定btrace运行的端口

4634 被监控的Java进程号

V2RTrace.java btrace监控脚本java代码文件

监控效果如图所示:

Arthas

Arthas 可以说是BTrace的进阶版,提供了操作更方便的命令行界面,不需要再编写脚本,通过Arthas提供的命令即可实现在线debug。使用方式详见官网:https://github.com/alibaba/arthas

实践中远程debug搞了好久,以免踩坑记录一下。

一键脚本安装arthas

1
curl -L https://alibaba.github.io/arthas/install.sh | sh

修改as.sh脚本,让执行as.sh脚本时,只attach,不进入交互debug界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# target process id to attach
# 此默认配置表示arthas server只允许本机可访问,要允许远程debug,修改为:0.0.0.0
TARGET_IP="127.0.0.1"

# telnet port
# 此默认配置表示arthas server telnet端口为3685
TELNET_PORT="3658"

# http port
#此默认配置表示arthas server http端口为8563
HTTP_PORT="8563"
# attach only, do not telnet connect
#此配置默认为false,改为true表示执行as.sh脚本时,只attach java process,不进入交互debug界面
ATTACH_ONLY=true

启动arthas server,attach要debug 的java进程

as.sh PID

1
2
3
4
5
6
7
8
9
10
11
[root@qiaojian ~]# as.sh 32431
Arthas script version: 3.1.1
[INFO] JAVA_HOME: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.i386
Arthas home: /root/.arthas/lib/3.1.1/arthas
Calculating attach execution time...
Attaching to 32431 using version /root/.arthas/lib/3.1.1/arthas...

real 0m1.109s
user 0m0.200s
sys 0m0.025s
Attach success.

远程telnet连接

远程http连接

-------------本文结束感谢您的阅读-------------
Good for you!