欢迎大家关注我公众号“从零开始的it转行生”

不停机不更新代码线上调试BUG的工具

如果你有以下痛点,请你查看本文章:
1、我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
2、遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
3、线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
4、是否有一个全局视角来查看系统的运行状况?
5、有什么办法可以监控到JVM的实时运行状态?
6、怎么快速定位应用的热点,生成火焰图?

Arthas-解决以上所有问题
一、快速启动,(我的第一给demo)
1、下载git代码,本地启动app应用
演示的源码

package com.eujian.arthaslearn.controller;

import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping
@RestController
public class ArthasController {

@GetMapping("/arthasGet")
public String arthasGet(String a,String b){
    System.out.println("arthasGet");
    System.out.println(String.format("a=%s,b=%s",a,b));
    return a;
}

@GetMapping("/arthasTrace")
public String arthasTrace() throws InterruptedException {
    Thread.sleep(100);
    new MyService().send();
    return "arthasTrace";
}

@PostMapping("/arthasInvote")
public ObjectNode arthasInvote(@RequestBody ObjectNode objectNode){
    System.out.println("arthasInvote");
    System.out.println(String.format("objectNode=%s",objectNode));
    return objectNode;
}

}

package com.eujian.arthaslearn.controller;

public class MyService {

public String send(){
    System.out.println("send被调用了");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "send";
}

}
github地址:xxxx
gitlab地址:xxx
启动应用
java -jar ./target/arthas-learn-1.0.0.jar

2、下载arthas的jar包(linux命令)

curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
运行arthas结果

选择1然后回车

3、 查看dashboard
输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。
dashboard
4、通过thread命令来获取到app线程
通过thread 2获取线程id为1的线程
thread命令
5、通过jad来反编译Main Class
jad com.eujian.arthaslearn.controller.ArthasController
jad结果
6、watch某个函数的入参和出参
输入命令watch com.eujian.arthaslearn.controller.ArthasController arthasGet '{params[0],params[1],returnObj}'
用来监听ArthasController这个类的arthasGet方法

访问接口 curl localhost:8085/arthasGet?a=heetget&b=saas
监听结果
watch命令
7、trace命令 输出方法路径上的每个节点上耗时
输入 trace com.eujian.arthaslearn.controller.ArthasController arthasTrace
另外另个终端输入curl localhost:8085/arthasTrace

trace命令

posted @ 2020-05-25 15:32  大佬健  阅读(219)  评论(0编辑  收藏  举报

欢迎大家关注我公众号“从零开始的it转行生”