当前位置: 首页 > 面试题库 >

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

公羊俭
2023-03-14
问题内容

我正在使用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);
    }
}

问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 我试图重定向java中子进程的stdin和stdout,最终我将把输出转到JTextArea或其他东西。 这是我当前的代码, 输出如下所示: 我期望看到输出“ Hello World”字符串。也许是因为父进程的存活时间不够长? 我还希望能够发送和接收多个命令。 问题答案: 在尝试侦听输入流之前,您已经尝试写入输出流,因此您什么也没看到是有道理的。为使此成功,您将需要对两个流使用单独的线

  • 我们必须编写一个 C 程序,该程序本质上将使用管道将一个命令/程序的 stdin 重定向到另一个命令/程序 stdout。如果命令行上的程序被传递了 . ls -l \; more,它应该将 的 stdout 重定向到 ,其中 是分隔符。这个程序应该适用于我们路径中的任何命令/程序,所以:. cat filename.c \; more,应该与键入:相同。 我的问题是,我的程序似乎不能正常执行,或

  • 问题 你希望你的脚本接受任何用户认为最简单的输入方式。包括将命令行的输出通过管道传递给该脚本、 重定向文件到该脚本,或在命令行中传递一个文件名或文件名列表给该脚本。 解决方案 Python内置的 fileinput 模块让这个变得简单。如果你有一个下面这样的脚本: #!/usr/bin/env python3 import fileinput with fileinput.input() as

  • 问题内容: 我从一个需要标准输入重定向的Python项目开始,使用类似于以下的代码: 问题是,代码运行后,将显示以下内容: 输入内容:您输入的内容:Hello 有没有办法修改我的代码,以便显示以下内容? 输入内容:您好 您输入了:您好 我一直在搜寻高低,但尚未找到答案。如果有人有主意,我将不胜感激。谢谢! 问题答案: 我不确定为什么需要这样做,但是您可以始终这样做: 再说一次,根据需要交换自己的实

  • 问题内容: 我正在尝试从Java程序运行外部程序,但遇到了麻烦。基本上我想做的是这样的: 但是,我发现这是行不通的-Java清单需要使用带有输入和输出流以及其他我没有经验的东西。 我看了互联网上的许多示例(其中许多来自SO),并且似乎没有一种简单的标准方法来完成此操作,对于不完全了解正在发生的事情的人来说,可能非常令人沮丧。 我也很难在其他人的代码示例上构建自己的代码,因为通常看来,大多数其他人1

  • 我有一个程序,通过Pipe. SourceChannel将stdout、stderr和stdin传输到/从Bytes Buffers。 程序使用选择器注册每个通道。 循环中的程序定期遍历 selectedKeys 集中的每个键,这些键对应于 stdout、stderr 和 stdin。对于每个密钥,它确定密钥是否有效、可读或可写,如果是,则与 ByteBuffer 执行相应的 IO 操作 我的问题