问题标签 [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.
java - 在 JVMTI 中的 MethodEntry / MethodExit 中检索作业
当方法进入或方法退出事件被触发时,是否可以检索当前的作业?我想标记在某些方法上输入的作业。目前我只能检索定义类的方法,但不能检索对象。
在JVMTI API中我找不到任何类似的东西。
我可以遍历堆中定义类的方法的所有实例,但是,这不会给我任何关于该方法被调用的对象的任何信息。
java - 如何在 JVMTI 中跟踪锁定事件
JVMTI 提供事件ContendedMonitorEnter
和ContendedMonitorEntered
检测与使用相关的事件synchronized
。synchronized
不是别的,而是一个可重入锁。
现在我还想跟踪与锁结构相关的事件:ReentrantLock
. 我可以挂钩它lock()
和unlock()
事件的方法进入/退出。但是,这些事件挂钩不提供有关调用它们的对象的任何信息。因此我无法区分不同的ReentrantLock
,因此无法记录有关当前锁定哪个锁的任何信息。
有没有其他方法可以跟踪这个?
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.
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.
java - JVMTI - 如何从回调中获取方法参数的值
感谢 JVMTI 代理,我正在记录我的 Java 应用程序中的所有方法条目。现在,我能够获取每个方法的名称,但我希望能够获取该方法接收到的参数的值。
此问题已在较早的主题中讨论过(请参阅如何在 MethodEntry 回调中获取参数值);它非常适合我正在寻找的东西,所以我知道我必须使用 GetLocalObject 函数,但我不知道如何使用(主题中给出的示例已损坏)。
谁能帮我找出如何做到这一点?谢谢。
java - JVMTI 获取被调用类/文件的名称
我试图通读整个 jvmti 文档,但没有找到解决问题的方法。
我想获取命令行中用于调用程序的类/文件的名称:
在大写的情况下,我想获得 < calledJavaProgram > 的名称。
GetSourceFileName(jclass klass,...) 只给我“klass”的名称,这是在参数列表中设置的,但是自从我启动程序后,我什至不知道这个......对吗?
有没有(其他)方法来获得这个名字?
感谢您的帮助 Markus G.
.net - .NET 的 JVMTI 等效项
我正在寻找一些 Microsoft API,它们具有与 JVMTI 对 Java 应用程序相同的监视 .NET 应用程序的功能。例如,我希望能够查看每个方法调用及其花费的时间(我可以在我的 Java 应用程序上使用 JVMTI 做到这一点)。感谢您的帮助。
bytecode-manipulation - 字节码检测 - 实现本机或 Java 代理?
如果我想使用字节码检测来实现分析器,我应该使用JVMTI编写本机代理还是应该使用包编写Java 代理?java.lang.instrument
如果我想使用像ASM这样的库——如果你想创建一个严肃的分析器,这似乎是强制性的——我必须使用 java 代理。这让我很困惑,因为我认为本地代理可以做 Java 代理可以做的所有事情,甚至更多。但对我来说,编写 java 代理似乎更容易。
有替代品吗?无论如何都应该使用Java代理和本机代理吗?
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 在每次使用之前都会重新加载(效率不高,但现在我不在乎),如下所示:
java - JVMTI Agent_OnLoad 处理程序无法创建系统属性
我正在使用 JVM 工具接口。我正在尝试使用 SetSystemProperty() 调用在 Agent_OnLoad 事件中创建 SystemProperty。如果该属性存在,它会正确设置一个新值。但是,如果该属性不存在,SetSystemProperty 将返回一个错误代码,说明它无法写入该属性(错误 98)。
在加载类之前,是否有另一种方法可以在 JVM 生命周期的早期创建系统属性?
2012 年 5 月 24 日更新:作为代理,我被各种程序加载。我不能要求程序设置此属性(在我的用例中不实用)。我正在寻找一种从代理代码本身设置属性的方法。经过大量的实验,我得出的结论是,这是不可能的。