Java agent 入门遇到点问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
moxiaowei
V2EX    Java

Java agent 入门遇到点问题

  •  
  •   moxiaowei 2023-05-26 09:08:25 +08:00 3211 次点击
    这是一个创建于 900 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个普通的 springboot 项目,我想对项目中的方法执行时间进行计算。然后用 maven 搭了个 agent ,但是使用 java -javaagent 把探针加进去的时候,提示在探针中找不到对应的类。探针的代码,很简单,就是这样的:

    ClassPool classPool = new ClassPool(true); classPool.insertClassPath(new LoaderClassPath(LoadTimeAgent.cass.getClassLoader())); String targentClassName = "com.example.utils.BitStringUtil"; //根据类名获取到要修改的 class CtClass targetClass = classPool.get(targentClassName); ......下面的代码省略了...... 

    想想确实,agent 里面没有 com.example.utils.BitStringUtil 这样的类,然后我查了资料,说是 springboot 项目,java -javaagent:agent.jar -jar app.jar 的时候,探针中的 class 文件是被 AppClassLoader 加载的,而 springboot 中的 class 文件是被 LunchedURLClassLoader 加载的,而 LunchedURLClassLoader 是 AppClassLoader 的子类,子类( LunchedURLClassLoader )是无法被父类( AppClassLoader )看到的,所以在探针中是无法获取到 springboot 中的类的,那么有没有什么方法能处理?我想,别的探针项目,比如 sw 也不至于获取不到吧?

    11 条回复    2023-05-26 15:15:49 +08:00
    dk7952638
        1
    dk7952638  
       2023-05-26 09:19:10 +08:00
    有可能是 agent 打包的时候没有把依赖打包进去,可以是看看 shadowjar 那种 fatjar 的打包模式
    langmanxiaoa
        2
    langmanxiaoa  
       2023-05-26 09:35:00 +08:00
    熟悉的 javassist 代码
    cppc
        3
    cppc  
       2023-05-26 09:38:47 +08:00
    技术分享:How To Write a JavaAgent (袁伟)

    &t=4s
    jiakme
        4
    jiakme  
       2023-05-26 09:43:23 +08:00
    探针的原理不是去 classload 中捞取已加载的类, 而是在 classload 加载类文件之前, 动态注入增强信息. 建议再看看 agent 的原理.
    senninha
        5
    senninha  
       2023-05-26 09:49:11 +08:00
    SpringBoot jar in jar 打包方式是这样的。
    你可以直接在探针里拿到 Instrumentation 对象,用 Instrumentation#getAllLoadedClasses 获取所有虚拟机加载的类,直接过滤出需要的,或者从以上加载的类中遍历拿到 springboot 的加载器也行。
    senninha
        6
    senninha  
       2023-05-26 09:52:19 +08:00
    @jiakme 看 op 的需求,更像是直接注册一个 Transformer 拦截增强就行。
    moxiaowei
        7
    moxiaowei  
    OP
       2023-05-26 10:00:27 +08:00
    @senninha 是的
    moxiaowei
        8
    moxiaowei  
    OP
       2023-05-26 10:01:56 +08:00
    感谢各位,目前已经搞定了,就是在探针中手动加载了 LaunchedURLClassLoader ,然后修改了它的初始化方法,手动把需要加载的类加载进去,就可以了。
    crossoverJie
        9
    crossoverJie  
       2023-05-26 10:26:32 +08:00
    有一个简单方法,直接使用 skywalking 的 agent ,然后写 skywalking 的插件,删除不需要的,API 相对要好理解一些。
    moxiaowei
        10
    moxiaowei  
    OP
       2023-05-26 10:40:59 +08:00
    @crossoverJie 是入门 agent ,肯定要自己动手去写的,直接使用 sw 是不是有点太快了
    MartinDai
        11
    MartinDai  
       2023-05-26 15:15:49 +08:00
    https://github.com/MartinDai/my-attach 给你个我自己写的入门 demo 做参考
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3605 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 04:20 PVG 12:20 LAX 20:20 JFK 23:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86