调试 Java 代理

2022-09-04 03:51:58

我目前正在开发一个Java代理,以促进对新的和旧的Java应用程序的动态检测。

我突然想到,就IDE调试而言,Java代理可能被认为是一种特殊情况,因为它们需要注入到目标JVM进程中才能运行。因此,这自然会产生一个问题,即如何调试,测试和分析代理类型的应用程序。

粗略地搜索现有解决方案会发现一些基于命令行的选项(即YourKit,JIP等),但是其中许多也是底层的Java代理。至少在我看来,如果利用这一点将导致代理调试/分析另一个代理的相当奇怪的场景。我知道代理可以按层次结构堆叠,但是我不确定是否可以通过在此庄园中堆叠代理来调试代理应用程序。


答案 1

如 Java 中所述 如何 ...The -javaagent: Option

代理只是主方法前面的拦截器,在相同的 JVM 中执行,并由相同的系统类加载器加载,并由相同的安全策略和上下文控制。

该名称具有误导性,因为“代理”一词通常表示与主要实体远程工作且分开工作的内容。但事实证明,-javaagent:中使用的java代理比这更简单。

一个 Java 应用程序可以使用 -javaagent: 选项任意次数地具有任意数量的代理。代理的调用顺序与选项中指定的顺序相同。

每个代理还可以采用字符串值的参数。我想这就是为什么我们必须对多个代理多次使用此选项的原因。否则,我们可以做这样的事情:

-javaagent agent1.jar:agent2.jar

,这是不正确的。

因此,通过将探查器代理(例如 YourKit、JIP 等)放在您自己的代理之前,将调试控制权交给您。


答案 2