问题标签 [javaagents]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
174 浏览

java - 将 javaagent 用于托管在 tomcat 中的特定应用程序

我有一个包含 premain 类的 xyz.jar 文件,用于获取文本文件中 Java 应用程序的执行时间。我有一个托管在 Tomcat 服务器中的 web 应用程序(比如 myapp.war),我需要使用这个 javaagent。我尝试放入"SET JAVA_OPTS=%JAVA_OPTS% -javaagent:/C:/xyz.jar"catalina.bat。我启动了服务器,但找不到所需的输出。

0 投票
0 回答
504 浏览

java - does premain class of javaagent work for Web application deployed in tomcat

i'm learning about javaagent and i created a simple profiler

http://www.javabeat.net/2012/06/introduction-to-java-agents/

I profiled a java application and it works fine. can i use this profiler to profile an web application deployed in tomcat. i tried this setting in CATALINA.bat "SET JAVA_OPTS=%JAVA_OPTS% -javaagent:/path-to-profiler/profiler.jar" and started the server but i didn't find the required output.

0 投票
1 回答
577 浏览

java - 集中式日志记录 - 跨服务器关联消息

我们有一个非常分布式的系统。用户在站点上的请求可能涉及对多个服务的调用。例如,当用户登录网站时,会调用广告服务、个性化服务、相关新闻服务等,以构建登录时显示所需的数据。高级设计:对 URL 的请求被映射到 Spring MVC 控制器,并且该控制器对不同的服务进行调用(大多数使用 HttpClient)。

我们正在使用 Logstash、ElasticSearch、Kibana、Log4j/SLF4J 实施集中式日志解决方案。当网站上报告问题时,我们希望能够更改日志级别以进行调试并查看所有服务中特定请求的日志消息。我们在 Log4j MDC 中填充请求 ID,因此我们能够识别 webapp 服务器上该特定请求的日志消息。如何关联来自对其他服务的调用的消息?

流程:用户登录 --> 请求映射到 Spring MVC 控制器,该控制器通过在 Log4j MDC 中填充请求 id 来记录消息 --> http 客户端调用服务 1、服务 2、服务 3

如何将来自 service1、service2、service3 的消息与 MVC 控制器记录的消息相关联。一种解决方案是在 http 客户端调用中传递请求 ID。有很多应用程序遵循这种范式,因此到处更改代码并不是一个理想的解决方案。

更新1:

我对jvm代理了解不多,但我想知道是否可以开发自定义代理来拦截网络调用并添加参数。接收方的客户代理将检测到参数并将其添加到 ThreadLocal 变量中。Dynatrace PurePath 技术以某种方式关联跨 JVM 的调用——它们需要注入他们的 jvm 代理,所以我猜他们正在拦截代理中的调用。看看这个视频

0 投票
1 回答
322 浏览

jmx - 如何将 JMXClient 包装在 JavaAgent 中

我想通过将客户端包装在 javaagent 包中并在本地查询 MBean 来将自定义 JMX 客户端加载到 JVM 中。我的意图是 JMX 客户端将定期查询主机应用程序的 MBean 或接收通知。但是,由于 javaagent 在主 jar 之前加载(通过 premain),所以宿主应用程序的 MBean 尚不可用。我应该如何处理这个“先有鸡”的问题?线程适合这个吗?还是有其他一些首选的 JMX 机制?谢谢

0 投票
5 回答
18746 浏览

java - 如何将 javaagent 的类放在类路径中

我正在尝试开发一个 javaagent,它可以在 asm-4 的帮助下检测代码。现在我遇到了一个非常基本的问题,javaagent 的类加载器没有看到 asm 依赖项,因此失败了。我是否必须提供一个 jar-with-dependencies(又名 maven 构建插件),其中包含代理所需的所有类,还是有另一种方法可以将类添加到 java 代理?直接在类路径中引用 jar asm-all.jar 没有帮助。最初构建 jar-with-dependencies 并没有帮助,因为 Premain-Class 属性无法使用程序集插件设置。帮助表示赞赏;-)

0 投票
0 回答
493 浏览

java - 在播放框架 2.1.0-java 上使用带有 -javaagent 的检测类时出错

我一直在使用检测类“SizeOfAgent”来计算我的 play 2.0.4 环境的内存需求。为了做到这一点,我将“-javaagent:lib\sizeof.jar”放在文件 framework\build.bat 中的 java 命令行上。这个 jar 文件有一个清单文件,其中包含对 sizeof.agent 的预主类配置。 SizeOfAgent 这工作正常,我一直在我的应用程序的某些组件上使用 fullSizeOf 方法。

升级到play 2.1.0版本后,此功能不再起作用。我收到错误消息:play.api.UnexpectedException:意外异常 [IllegalStateException:无法访问检测环境。请检查是否在 java 的“-javaagent”命令行参数中指定了包含 SizeOfAgent 类的 jar 文件。]

生成此错误是因为“静态 Instrumentation inst”返回 null:

有没有人尝试使用带有 play 2.1.0 的仪器类?

0 投票
1 回答
937 浏览

java - 使用 javaagent 获取托管在 tomcat 中的应用程序的开始和结束时间

我编写了一个 javaagent 应用程序来获取 java 应用程序的执行时间,它工作正常。我尝试使用此应用程序来获取托管在 tomcat 服务器中的应用程序的执行时间。我没有得到所需的输出。我的 javaagent 代码来自“ http://www.ibm.com/developerworks/java/library/j-jip/ ”。我有两个疑问 1.如何过滤掉托管在tomcat和profile中的特定应用程序使用javaagent。2. javaagent如何在tomcat中检测应用程序的开始和结束。

0 投票
1 回答
1946 浏览

java - Javassist 的 CtMethod.insertAt(line,src) 在错误的字节码位置检测代码

我的目标是在每个基本代码块的开头插入一点检测代码。使用 Javaassist 的 ControlFlow.Block 和 CtMethod.insertAt() 似乎是一项相当简单的任务。到目前为止,这是相关的代码块(它位于转换函数中):

注意其中的“line”参数CtMethod.insertAt(line,srcCode)源代码行位置,而不是字节码行位置。在源代码中,一些基本块报告了相同的行号!这是输出:

At #表示我请求放置代码-> #的位置, 表示它在源代码中实际插入的位置(如果一切正常,它们应该是相同的)。其中的所有内容都是{ ... }我想要放置的代码(_JDA_mse是我使用 Javassist 方法添加到函数中的局部变量,因此使用它没有问题)。

问题在于它for(int i=0; i<size; ++i)包含多个在源代码中不可分割但在字节码中明显不同的基本块。这就是为什么多个基本块被映射到同一源代码行的原因,它只是表明源代码行没有提供足够的检测精度来记录基本块。 有没有办法模拟 CtMethod.insertAt(bytecodePosition,srcString) 而不是使用提供的 CtMethod.insertAt(sourceLine,srcString)?

0 投票
2 回答
2962 浏览

java - 带有 ASM 的 Java 字节码检测:在 INVOKESPECIAL 指令中代码注入时的验证错误

我是字节码注入的新手。到目前为止,通过详尽的研究和痛苦的反复试验,我能够得到我想要的一切 :-) 但我似乎已经达到了我目前追求的目标的极限。所以,这就是:我的第一个 stackoverflow 问题!

我的目标是通过 java 代理跟踪方法调用的对象引用。我正在使用 ASM 4.0 库并实现了 AdviceAdapter。我重写的 visitMethodInsn() 方法如下所示:

简而言之,我试图在 INVOKESOMETHING 操作执行到局部变量之前保存堆栈上的所有内容。为了启用方法操作的执行,我必须将整个东西放回堆栈。之后我假设被调用对象的引用是我本地数组中的第一个条目。

以下是我的测试课程之一。这个很简单:它只是启动另一个线程:

关于 INVOKEVIRTUAL、INVOKEINTERFACE 和 INVOKESTATIC,我没有遇到任何问题。一切似乎都很好,日志输出正是我所期望的。但是,INVOKESPECIAL 指令似乎存在问题。我在这里遇到了一个丑陋的 VerifyError,所以我想我处理堆栈的方式一定有问题。

使用“-noverify”启动测试类会使 VerifyError 消失。一切似乎都很完美,我得到了想要的输出。我可以就这样离开它,但实际上整个问题让我感到痛苦,让我睡得很糟糕;-)

如果我的理解是正确的,那么像“new Thread()”这样的语句就会变成

在字节码中。新创建的对象在调用构造函数之前仍未初始化,会不会是个问题?

我不明白为什么代码可以正常工作,但 JVM 在验证期间抱怨。

即使在检测后查看反编译的代码也无济于事:

一些附加信息:我正在使用 IntelliJ IDEA 10.5.4 进行开发并使用 jdk1.6.0_39。

最后,我希望这里有人可以帮助我获得必要的见解。提前致谢!

0 投票
1 回答
955 浏览

playframework-2.0 - 玩 2.1 / 在运行测试时考虑 javaagent

我的目标是启动我的Play应用程序中包含的集成测试。

为此,我曾经通过 Intellij 启动它们。这些测试需要 Spring aspectJ 编织,因此我在我的 Intellij 测试中精确地配置了这个 VM 参数:

整个作品。

现在我希望能够通过命令行使用play命令后面的简单命令来启动它们test-only

首先,我阅读了这篇文章,讨论了将任何 javaagent 添加到 Play 应用程序的方法。

因此,我像这样修改我的 Playbuild文件,添加 Spring 的 javaagent:

然而,我的测试只是失败了......抱怨缺少 Spring 的 aspectJ 编织。但这肯定是逻辑,因为test-only启动了另一个进程......

有没有办法让我的测试关心使用 javaagent 编织的 aspectJ?