Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java应用程序将jdb作为进程运行时,输出不完整_Java_Jdb - Fatal编程技术网

从java应用程序将jdb作为进程运行时,输出不完整

从java应用程序将jdb作为进程运行时,输出不完整,java,jdb,Java,Jdb,我正在尝试从java程序调试一个java类。我创建了一个简单的类进行测试。这是我的类hello.java,它位于文件夹C:\Users\madhawax\Desktop\beafify\debug 我的问题是我找不到零件 VM Started: Set deferred breakpoint Hello.main ... 当我从java代码运行jdb时,但当我从命令行手动运行jdb时,我可以看到它 为什么我只能得到部分实际输出?我怎样才能解决这个问题 这是我的Hello.java课程: pub

我正在尝试从java程序调试一个java类。我创建了一个简单的类进行测试。这是我的类
hello.java
,它位于文件夹
C:\Users\madhawax\Desktop\beafify\debug

我的问题是我找不到零件

VM Started: Set deferred breakpoint Hello.main
...
当我从java代码运行
jdb
时,但当我从命令行手动运行
jdb
时,我可以看到它

为什么我只能得到部分实际输出?我怎样才能解决这个问题

这是我的
Hello.java
课程:

public class Hello {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println("loop number "+i);
        }
    }
} 
使用cmd手动调试时的控制台输出

C:\Users\madhawax\Desktop\beaufify\debugging>jdb
Initializing jdb ...
> stop in Hello.main
Deferring breakpoint Hello.main.
It will be set after the class is loaded.
> run Hello
run  Hello
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
>
VM Started: Set deferred breakpoint Hello.main

Breakpoint hit: "thread=main", Hello.main(), line=3 bci=0
3            for (int i = 0; i < 10; i++) {

main[1]
我使用这段代码来运行jdb

try {
    ProcessBuilder builder = new ProcessBuilder("C:\\Program Files\\Java\\jdk1.8.0_31\\bin\\jdb.exe");
    builder.directory(new File("C:\\Users\\madhawax\\Desktop\\beaufify\\debugging\\"));
    Process process = builder.start();
    OutputStream stdin = process.getOutputStream();
    InputStream stdout = process.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
    try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin))) {
        writer.write("stop in Hello.main\n");
        writer.flush();
        writer.write("run Hello");
        writer.flush();
    }
    String inputLine;
    Scanner scanner = new Scanner(stdout);
    while (scanner.hasNextLine()) {
        System.out.println(scanner.nextLine());
    }
 } catch (IOException ex) {
    ex.printStackTrace();
}

我建议您在不使用
的情况下运行代码,并尝试使用资源

Scanner scanner = new Scanner(stdout);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
writer.write("stop in Hello.main\n");
writer.flush();
writer.write("run Hello\n");
writer.flush();

while (scanner.hasNextLine()) {
    System.out.println(scanner.nextLine());
}
在您的代码中,
try with resources
将在执行后关闭BufferedWriter:

try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)))     {
    writer.write("stop in Hello.main\n");
    writer.flush();
    writer.write("run Hello");
    writer.flush();
} //writer is closed here
因此,它将关闭底层进程输出流,这显然会导致jdb进程的关闭

您可能希望将try with资源更改为try catch最终包装整个方法

更新:另外,最好在运行下一个命令之前读取一个命令的输出。以你的方式:

writer.write("stop in Hello.main\n");
writer.flush();
writer.write("run Hello\n");
writer.flush();
writer.write("list\n");
...
命令调用之间没有停顿。jdb当时可能无法处理
list
命令(因为它正在启动VM)。作为实验,您可以引入时间间隔:

writer.flush();
Thread.sleep(1000);
writer.write("list\n");
更好的方法是读取中间的输出

writer.flush();
readOutput(stdout);
writer.write("list\n");
您可以使用扫描仪读取输出。但是,正如@vandale在问题注释中指出的那样,扫描程序会阻塞令牌和换行符。您可能希望使用非阻塞读取来读取可用的输出。类似的方法可能会奏效:

private void readOutput(InputStream outputStream) throws IOException{
    byte[] buffer = new byte[100000];
    int bytesRead;
    while (outputStream.available() > 0) {
        bytesRead = outputStream.read(buffer);
        if (bytesRead > 0) {
            System.out.print(new String(buffer, 0, bytesRead));
        }
    }
}

此代码还将显示不以换行结束的输出(输入提示,
main[1]
等)。

这没有多大意义。为什么要通过Netbeans运行jdb?你知道它有自己的调试器吗?@EJP是的,是的,我知道,但那是我的应用程序。我不能使用netbean调试器,因为我应该以编程方式进行。我不打算构建调试器。我不确定它是否有用,但您是否尝试过
writer.write(“运行Hello\n”)行尾编码可能有问题?尝试使用Reader.read()之类的方法,该方法在检测到新行之前不会阻塞。@FastSnail“错误流”通常用于非“正常程序输出”的任何内容。它的名字不好,怪UNIX。它工作正常,但我添加了另一个命令
writer.write(“list\n”);writer.flush()然后我没有得到list命令的输出,但在cmd中我得到了
writer.flush();
readOutput(stdout);
writer.write("list\n");
private void readOutput(InputStream outputStream) throws IOException{
    byte[] buffer = new byte[100000];
    int bytesRead;
    while (outputStream.available() > 0) {
        bytesRead = outputStream.read(buffer);
        if (bytesRead > 0) {
            System.out.print(new String(buffer, 0, bytesRead));
        }
    }
}