小编典典

Java + Eclipse:如何调试正在接收通过管道/重定向的stdin的Java程序?

java

我正在使用Eclipse开发Java程序,并且想在没有参数的情况下为我的程序添加一个选项以解析stdin。(否则它将解析一个文件)

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

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

编辑 :看到的是,我最初编写程序是为了接受文件名参数。然后我认为也可以使用stdin也是有用的,所以我 确实
从程序中抽象了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);
    }
}

阅读 218

收藏
2020-11-13

共1个答案

小编典典

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

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

suspend=y 会告诉JVM在连接调试器之前不要实际运行程序。

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

2020-11-13