问题标签 [jvmti]

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 投票
1 回答
516 浏览

java - 在 JVMTI 中的 MethodEntry / MethodExit 中检索作业

当方法进入或方法退出事件被触发时,是否可以检索当前的作业?我想标记在某些方法上输入的作业。目前我只能检索定义类的方法,但不能检索对象。

JVMTI API中我找不到任何类似的东西。

我可以遍历堆中定义类的方法的所有实例,但是,这不会给我任何关于该方法被调用的对象的任何信息。

0 投票
1 回答
193 浏览

java - 如何在 JVMTI 中跟踪锁定事件

JVMTI 提供事件ContendedMonitorEnterContendedMonitorEntered检测与使用相关的事件synchronizedsynchronized不是别的,而是一个可重入锁。

现在我还想跟踪与锁结构相关的事件:ReentrantLock. 我可以挂钩它lock()unlock()事件的方法进入/退出。但是,这些事件挂钩不提供有关调用它们的对象的任何信息。因此我无法区分不同的ReentrantLock,因此无法记录有关当前锁定哪个锁的任何信息。

有没有其他方法可以跟踪这个?

0 投票
1 回答
1099 浏览

java - lsof counterpart for a JVM?

lsof is a nice tool for Unix, showing all currently open file handles.

Does anyone know a similar tool that would show all open files inside a running JVM (via JVMTI or any similar interface)?

In this particular case, it would be sufficient for me to know which class has a handle open. Method/line or even an entire chain to GC root would be fantastic, but handler owner class is already a good start.

I know I could make a heap dump, open it in a profiler and find this out, but this is a tedious task, especially for the big heaps.

0 投票
2 回答
176 浏览

java - How do I catch the read and writes in a java program?

I am trying to create a tool that can capture all the read and writes made by a java program. Also, I would like to know what fields of what object is access/modified.

I currently looked at:-

1) java.lang.instrument I could not do much with that. I could not understand how to write an agent that can get access to the a running program and create a watch on different objects/fields and anything related. I would appreciated if you have any idea or information on that.

2) jvmti I looked at jvmti and tried to create a jvmti tool, but I figured out that to get the objects, I would need the JVMTI_EVENT_OBJECT_ALLOC be a potential capability. But, I figured that, it is not. Moreover, I read that this event is not called for new command. Hence, at the moment, even this does not seem applicable.

So, I would like to know if you guys know any way to do what I want to do, either using the above mentioned methods or any other technique/tool that you may be aware of?

NOTE: I do not have access to the source code of the application. All, I have are the class files.

0 投票
1 回答
1769 浏览

java - JVMTI - 如何从回调中获取方法参数的值

感谢 JVMTI 代理,我正在记录我的 Java 应用程序中的所有方法条目。现在,我能够获取每个方法的名称,但我希望能够获取该方法接收到的参数的值。

此问题已在较早的主题中讨论过(请参阅如何在 MethodEntry 回调中获取参数值);它非常适合我正在寻找的东西,所以我知道我必须使用 GetLocalObject 函数,但我不知道如何使用(主题中给出的示例已损坏)。

谁能帮我找出如何做到这一点?谢谢。

0 投票
1 回答
484 浏览

java - JVMTI 获取被调用类/文件的名称

我试图通读整个 jvmti 文档,但没有找到解决问题的方法。

我想获取命令行中用于调用程序的类/文件的名称:

在大写的情况下,我想获得 < calledJavaProgram > 的名称。

GetSourceFileName(jclass klass,...) 只给我“klass”的名称,这是在参数列表中设置的,但是自从我启动程序后,我什至不知道这个......对吗?

有没有(其他)方法来获得这个名字?

感谢您的帮助 Markus G.

0 投票
1 回答
212 浏览

.net - .NET 的 JVMTI 等效项

我正在寻找一些 Microsoft API,它们具有与 JVMTI 对 Java 应用程序相同的监视 .NET 应用程序的功能。例如,我希望能够查看每个方法调用及其花费的时间(我可以在我的 Java 应用程序上使用 JVMTI 做到这一点)。感谢您的帮助。

0 投票
1 回答
1837 浏览

bytecode-manipulation - 字节码检测 - 实现本机或 Java 代理?

如果我想使用字节码检测来实现分析器,我应该使用JVMTI编写本机代理还是应该使用包编写Java 代理java.lang.instrument

如果我想使用像ASM这样的库——如果你想创建一个严肃的分析器,这似乎是强制性的——我必须使用 java 代理。这让我很困惑,因为我认为本地代理可以做 Java 代理可以做的所有事情,甚至更多。但对我来说,编写 java 代理似乎更容易。

有替代品吗?无论如何都应该使用Java代理和本机代理吗?

0 投票
1 回答
3274 浏览

java - JVMTI 代理崩溃

我正在将橡皮擦数据竞争检测算法实现为 JVMTI 代理。当我尝试运行一些示例输入来测试我的代码时,JVM 崩溃,转储如下(也可能显示相同错误的其他堆栈跟踪):

FATAL ERROR in native method: Using JNIEnv in the wrong thread at Proxy.monitor_enter_(Native Method) at Proxy.monitor_enter(Proxy.java:30) at ex1.LifeThreads.setNeighborThreadChange(LifeThreads.java:36) at ex1.LifeThreads.neighbor(LifeThreads.java:425) at ex1.LifeThreads.standardItr(LifeThreads.java:321) at ex1.LifeThreads.run(LifeThreads.java:462)

(这种事后跟踪可以通过 Sun JVM 的 -Xcheck:jni 选项获得)

在代码中,我执行了与各种 JDK 示例(heapViewer、heapTracker 等通过具有本机方法的一些代理 java 类)中所示相同的检测。在每条指令Proxy.monitor_enter_之后调用本机方法。monitorenter

这是 monitor_enter_ 的代码:

,其中scoped_lock基本上是 JVMTI Raw Monitor 进入/退出的范围锁, thread_t只是一个包装 some 的结构std::vector,其中存储类的实例lock(它本身仅包装jobject全局引用global_ref),当thread->lock( lock(global_ref))被调用时。

JVMTI 环境。在代理单例中全局缓存,而线程本地的 JNI env 在每次使用之前都会重新加载(效率不高,但现在我不在乎),如下所示:

0 投票
2 回答
407 浏览

java - JVMTI Agent_OnLoad 处理程序无法创建系统属性

我正在使用 JVM 工具接口。我正在尝试使用 SetSystemProperty() 调用在 Agent_OnLoad 事件中创建 SystemProperty。如果该属性存在,它会正确设置一个新值。但是,如果该属性不存在,SetSystemProperty 将返回一个错误代码,说明它无法写入该属性(错误 98)。

在加载类之前,是否有另一种方法可以在 JVM 生命周期的早期创建系统属性?

2012 年 5 月 24 日更新:作为代理,我被各种程序加载。我不能要求程序设置此属性(在我的用例中不实用)。我正在寻找一种从代理代码本身设置属性的方法。经过大量的实验,我得出的结论是,这是不可能的。