调试Java代理

15

我目前正在开发一个Java代理程序,以便于对新的和旧的Java应用程序进行动态仪表化。

就IDE调试而言,可以将Java代理程序视为一种特殊情况,因为需要将它们注入到目标JVM进程中才能运行。这自然引出了一个问题:如何调试、测试和分析代理类型的应用程序。

初步搜索现有解决方案时,发现了一些基于命令行的选项(例如YourKit、JIP等),但其中许多也是Java代理程序。使用它们可能会导致一种奇怪的情况,即一个代理程序调试/分析另一个代理程序。我知道代理程序可以堆叠在分层结构中,但我不确定是否可以通过堆叠代理程序来调试代理应用程序。

1个回答

10

Java How To ... The -javaagent: Option中所述:

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

名称有误导性,因为单词“代理”通常意味着远程和与主实体分离工作的东西。但是,实际上-javaagent:中使用的Java代理比那要简单得多。

通过多次使用选项-javaagent:,一个Java应用程序可以拥有任意数量的代理。代理按指定的顺序依次调用。

每个代理也可以使用字符串参数。我想这就是我们不得不为多个代理多次使用此选项的原因。否则,我们本可以像这样做:

-javaagent agent1.jar:agent2.jar

因此,在您自己的代理之前放置分析器代理(例如YourKit、JIP等)将使您拥有调试控制权,这很不正确。


1
你大部分的帖子都是从Java How To ... The -javaagent: Option中抄袭而来,没有注明出处。 - Daniel A.A. Pelsmaeker
我已经在文本中提供了参考,所以我不明白你的意思。你有什么建议? - Mohammad Dashti
@MohammadDashti - 在您的帖子中简单地插入链接并不是可接受的归属方式。您必须将任何复制的文字放在块引用中,并清楚地标明其来源。我已经在上面这样做了。 - Brad Larson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接