6

我正在使用 Eclipse 开发一个 Java 程序,并认为如果没有参数,我会在我的程序中添加一个选项来解析标准输入。(否则它会解析一个文件)

如果我执行"somecommand | java -jar myjar.jar"并去调试,我会遇到问题......然后意识到我不知道如何在 Eclipse 中启动这样的进程。如果我在命令提示符下运行它,我无法附加到正在运行的进程,因为该进程会立即启动。

关于如何调试的任何建议?

编辑:看,问题是,我最初编写程序是为了获取文件名参数。然后我认为它也可以使用标准输入,所以我从我的程序抽象了 InputStream(正如 Queue 先生所建议的那样)。它在文件(java -jar myjar.jar myfile)上运行良好,但在我运行时无法运行type myfile | java -jar myjar.jar。我怀疑这两种情况有一些不同(eof 检测不同?)但我真的很想调试。

// overall program structure follows:

public static void doit(InputStream is)
{
    ...
}

public static void main(String[] args)
{
    if (args.length > 0)
    {
        // this leaves out the try-catch-finally block,
        // but you get the idea. 
        FileInputStream fis = new FileInputStream(args[0]);
        doit(fis);
        fis.close();
    }
    else
    {
        doit(System.in);
    }
}
4

4 回答 4

11

使用管道在命令行上运行您的应用程序,但添加 JVM 参数以进行远程调试,如下所示:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044

suspend=y将告诉 JVM 在附加调试器之前不要实际运行程序。

接下来,进入 Eclipse 调试启动配置 ( Run -> Debug Configurations...) 并创建一个“远程 Java 应用程序”以连接到您的应用程序。在 Eclipse 中运行启动(设置一些断点之后),您应该能够调试。不是很方便,但是如果您在没有管道的情况下无法重现您的问题,这是一个选项。

于 2009-10-17T00:20:44.407 回答
4

如果我正确地解释了您的问题,我相信您只想知道如何在标准输入中发送输入并在 eclipse 中通过它进行调试。

如果是简单的输入,其实可以在程序运行时通过eclipse Console窗口手动输入System.in数据。只需开始在控制台窗口中输入,然后按 enter 将文本发送到 Standard in。

如果它更复杂,我建议将您尝试执行的读取抽象化以获取 InputStream。在您的程序中,您可以将 System.in 作为 InputStream 发送。要调试,您可以发送任何其他 InputStream。例如,您可以将输入放在一个文件中,然后将 FileInputStream 传递给该方法以对其进行测试。

编辑:没有看到更多代码,我不确定,但你可能会使用 eof 检测。FileInputStream 有一个已定义的文件结尾,但我猜 System.in 没有这种情况。您的读者可能只是在等待阅读下一个字符并且永远不会前进。在您知道您已经阅读“足够”之后,您可能必须手动停止阅读。

于 2009-10-16T23:25:20.220 回答
0

也许这种创建命名管道的解决方案可能适用于此。

mkfifo foo
somecommand > foo

接下来在调试配置中,添加< foo参数,以便您的程序被调试为:

java -jar myjar.jar < foo

于 2009-10-17T00:12:57.353 回答
0

我参加晚会迟到了。但是您可以在项目的调试配置中查找“通用”选项卡。在那里,您应该能够看到标有“标准输入和输出”的部分。您可以通过这种方式为控制台分配输入文件并设置输出文件。

于 2019-01-19T07:43:17.487 回答