zoukankan      html  css  js  c++  java
  • 不停机不更新代码线上调试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命令

  • 相关阅读:
    MySQL + Atlas --- 部署读写分离(实现,其他的技术有参考文档)
    基于Redis、Storm的实时数据查询实践
    Redis 配置
    Redis 安装
    redis简介
    Java-Enumeration总结
    spring源码剖析(四)自定义标签解析流程
    svn 把主干合到分支 分支合到主干
    关于Class.getResource和ClassLoader.getResource的路径问题
    instanceof, isinstance,isAssignableFrom的区别
  • 原文地址:https://www.cnblogs.com/yeyongjian/p/12957223.html
Copyright © 2011-2022 走看看