2020年4月

0、无法连接jvm

错误信息如下:

com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
    at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
    at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78)
    at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250)
    at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:85)
    at com.taobao.arthas.core.Arthas.<init>(Arthas.java:28)
    at com.taobao.arthas.core.Arthas.main(Arthas.java:123)
[ERROR] attach fail, targetPid: 6958

排查思路如下:

  1. 目标pid是否正确,可以通过jps或ps进行确认
  2. 观察pid的执行用户是否和执行arthas的用户一致,比如常见的跑jvm的是tomcat用户,但是登录用户并不是

- 阅读剩余部分 -

重新定义七点半,不知道你有没有听过这个梗。
我不知道这个梗最初是来源于哪里,我第一次见是在老罗的发布会,因为老罗的发布会总会有各种各样的问题,说是七点半开,从来没有准时过,所以说,“重新定义了七点半”。

前面几篇都讲了怎么去获取数据(参数、静态字段、返回值、执行时间、执行链路),或者怎么去执行方法(静态方法、获取实例调用方法)。

这篇就说一个大招,怎么在运行时去修改代码。

0、前置工作

有下面这样一个接口,获取开始时间:


package com.chengjf.snippet.spring.mvc.service;

public interface HelloService {
    
    /**
     * 获取开始时间
     *
     * @return
     */
    String getStartTime();
}

实现是直接返回开始时间“七点半”:

package com.chengjf.snippet.spring.mvc.service.impl;

@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String getStartTime() {
        return "七点半";
    }
}

然后整个controller调用这个getStartTime方法:

@RequestMapping("startTime")
public Object getStartTime() {
    HashMap<Object, Object> objectObjectHashMap = Maps.newHashMap();
    String result = helloService.getStartTime();
    objectObjectHashMap.put("startTime", result);
    return objectObjectHashMap;
}

返回就是说好的“七点半”:

{
    "startTime": "七点半"
}

- 阅读剩余部分 -