需求
当我们线上程序运行的时候,难免会遇到一些业务问题,在排查问题的时候我们会去看日志,查看一些函数输入输出来定位问题;然而许多时候,我们在项目开发的时候并没有留下足够的日志来排查问题,这时候就需要一些特殊的方法来排查,比如远程debug,重新增加日志重启服务,或者用btrace等工具来排查,各种工具都有各自的优点和使用的场景,具体不足本篇暂不讨论,本文只介绍一种新的简单的工具,这个工具可以提供在运行中的进程中调用里面的方法,然后自己定义输入输出来判断方法的运行情况,简单来说,就是触发进程中某个service的某个方法
原理
类似于jstack,jmap这样的小工具,此工具也是利用attach的技术,利用java tool工具attach到运行的进程上,然后执行其中的agentmain方法,如果在agentmain方法体里获取其中的service的bean,就可以执行其方法了,当然具体还要重写一个类加载器来完成这个工作
以下是原理介绍,实际使用会有classLoader加载相关的问题,具体的解决方案可以链接里面的处理方法:https://github.com/fengzhongke/attach-runner
1、先attach到目标进程中
public static void main(String[] args) throws Exception {
//两个参数,第一个参数中目标进程的pid, 第二个参数为要执行的代码
String pid = args[0];
Str