【问题标题】:GUI on top of a JVMTI agentJVMTI 代理之上的 GUI
【发布时间】:2011-03-15 09:04:09
【问题描述】:

我计划使用 Oracle 提供的 JVMTI API 开发一个分析器。对于可视化,我想在代理代码之上实现一个 GUI(Qt 框架)。我的第一个 jvmti 代理正在编译和运行,我开始将代理集成到我的 Qt 项目中。

现在我面临如何将代理与 GUI 耦合的问题。 GUI 应该在代理内部启动吗?比如在 Agent_OnLoad 函数中?

长期的做法是从 GUI 开始分析,尽管我无法想象如何实现这一点。

【问题讨论】:

    标签: java c++ qt jvmti


    【解决方案1】:

    嗯.. 你有很多选择,最明显的是基于套接字的通信。您必须假设大多数分析用例将涉及服务器上的远程无头 JVM。在我的分析器中,您可以在与代理相同的机器上使用小型启动/停止/控制实用程序进行无头操作,数据在服务器上收集并传输到客户端进行可视化。您还可以使用代理启动远程(或本地)jvm,并通过完整 GUI 中的套接字连接到侦听代理。通过该套接字收集到客户端。

    还有新的“JVM Attach API”允许您将代理“插入”到已经运行的 JVM 中,因此如果目标机器是 UNI*,那么您可以使用 GUI 中的 ssh/scp 并编写 sCP 脚本将代理传输到服务器和 SSH 以启动附加。

    所以...套接字(IP 和/或域)并将 GUI 中的代码重用于无头控制/收集客户端

    【讨论】:

    • Socket 将涵盖有用的用例,但恐怕这有点高级。我可以想象提供一个套接字服务器是从 AgentOnLoad 开始的。我想对于我的第一步,将 GUI 直接附加到代理会更容易——这甚至可能吗?我的意思是代理被编译为一个库。
    • Hmmmm...然后您正在寻找开始将 JVM 作为 JNI JVM 使用 GUI 进程启动,这实际上会限制您能够分析的内容...。没有应用程序服务器等... . 如果它是 JNI JVM,那么您将具有直接调用能力,因为 GUI 和 JVM 实际上运行在相同的地址空间中......套接字并不难 QT 对这些讨厌的东西很有帮助
    • 我认为这改变了我的想法。所以一种实用的方法是在代理内部实现客户端套接字并将事件发送到 GUI 或其他方式?代理不会和JVM一起死吗?我会自己去尝试一下,我只是想在脑海中画一个小草图! :-)
    • 是的,典型的代理会在新线程上打开一个服务器套接字并监听 GUI 连接...为简单起见,您可以随时将其限制为单个代理/gui 连接。您可以在两者之间开发一个非常简单的命令协议(启动、停止、重置等)。
    • 监听网络线程将收到启动命令,该命令在同一个线程中调用 JVM 以“开始分析”,然后 JVM 从 JVM 线程调用您的代理回调...这些回调将“收集”事件并将它们放在缓冲区中...您将启动的另一个线程将通过已建立的套接字异步将此缓冲区发送到 GUI...。现在您可以通过没有发送来简化上述操作线程,但是当缓冲区已满时,JVM 基本上会停止,因为您的代码将收集到的数据发送到 GUI……这对于第一次尝试来说还不错
    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2017-09-19
    • 1970-01-01
    • 2010-11-28
    • 2011-09-01
    • 2011-02-15
    相关资源
    最近更新 更多