3

我正在做与这个问题的原始海报基本相同的事情。就我而言,我正在尝试在 OS X 10.8.5 上的 Eclipse Kepler 中使用 Oracle jdk1.7.0_72 运行 Sun/Oracle JPDA 示例程序。但是,这些示例的文档似乎假定它们将从命令行运行。

我想使用 com.sun.jdi.connect.LaunchingConnector 来启动调试对象程序。它需要类 Map <String, Argument> 的参数。其中一个映射条目具有键“main”,并且其关联对象包含一个字符串,该字符串是被调试对象的主类名称。就我而言,那是“debuggee.DebuggerTest”。调用启动的程序具有主类“debugger.TraceLaunch”。

我的 Eclipse 项目具有默认结构,因此有一个名为“classes”的文件夹,每个包都有一个子文件夹。就我而言,它们是“com”、“debugger”和“debuggee”。“com”包包括“示例 JDI 应用程序”中的所有类。

我正在使用上面引用的帖子中引用的“ VMLauncher ”来进行启动。发射失败;它报告找不到我的主类“debuggee.DebuggerTest”。如果我尝试将完整路径包含在我的主类名中,它也会失败。

如果我打开一个终端并导出一个 CLASSPATH 变量,该变量指定我的 Eclipse 项目(和 JDI 库)中的“类”文件夹,我可以使用命令“java debuggee.DebuggerTest”启动调试器,它运行正常。我还可以使用命令“java debugger.TraceLaunch”启动调试器,然后它又会成功启动调试对象。这表明 VMLauncher 正在做所有正确的事情。

因此,问题似乎在于,在 Oracle 的“tools.jar”中的示例包或 JDI 包的深处,LaunchingConnector 调用了命令行启动器。它似乎属于 SunCommandLineLauncher 类。该启动器似乎假定了一个类路径。启动器参数似乎没有记录,所以我不知道是否有指定类路径的选项。Oracle jdk1.7.0 JDI 类的源代码(在“lib/tools.jar”中)显然尚未发布,因此我无法查看代码以了解启动器如何使用其参数的详细信息。

另一个可能有用的线索:在示例 JDI 应用程序中,GUI 调试器示例允许指定它尝试解析的类路径。不幸的是,它不能像 UNIX shell 那样识别引用或字符转义,并且它不理解包含空格字符的文件夹名称。

理想情况下,我想知道如何为 LaunchingConnector 指定类路径。

我的第二个选择是在调整命令行程序以在 Eclipse 中运行时如何指定类路径的一些更一般的建议。

4

1 回答 1

5

Trace 创建的新 VM 具有不同的类路径。如果要在 eclipse 中运行程序,需要在跟踪程序中添加以下代码。

Connector.Argument options =(Connector.Argument)arguments.get("options");
options.setValue("-cp \"F:\\Workspace\\TraceProgram\\bin\"");

其中 -cp 将类路径设置为新创建的 VM,您需要更改为 eclipse 工作目录。

它对我有用。

于 2014-11-30T05:58:45.840 回答