Java Threads GDB - PullRequest
       4

Java Threads GDB

1 голос
/ 22 ноября 2011

Я получаю исключение нулевого указателя, даже если я уже запустил поток. Есть ли другой способ задать команды или передать аргументы работающему потоку?

public class MainClass{
    public static void main(String [ ] args)
    {
        try{
            GDBpipeWriter g = new GDBpipeWriter();
            new Thread(g).start();
            // Set commands
            g.setcommand("run");
            g.setcommand("list");
            g.setcommand("list 10,20");
        }catch(NullPointerException e){
        }
    }
}


public class GDBpipeWriter implements Runnable{
    public volatile String command;
    PrintWriter stdin;
    public void setcommand(String com){
        this.command = com;
        stdin.println(command);
    }
    public void run(){
        Process p = null;
        try {
            p = Runtime.getRuntime().exec("gdb a.out --interpreter=console");
            new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
            new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
            stdin = new PrintWriter(p.getOutputStream());

            stdin.flush();
            stdin.println("break 4");
            stdin.flush();
            stdin.println("break 10");
            stdin.flush();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


class SyncPipe implements Runnable
{
    public SyncPipe(InputStream istrm, OutputStream ostrm) {
        istrm_ = istrm;
        ostrm_ = ostrm;
    }
    public void run() {
        try
        {
            final byte[] buffer = new byte[1024];
            for (int length = 0; (length = istrm_.read(buffer)) != -1; )
            {
                ostrm_.write(buffer, 0, length);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    private final OutputStream ostrm_;
    private final InputStream istrm_;
 }

1 Ответ

3 голосов
/ 22 ноября 2011

Может быть, "условие гонки", поэтому stdin не определяется, когда вы достигаете первого вызова setcommand (). Вы вызываете setcommand из main (), но стандартный ввод еще не установлен.

Обновление

Теперь вы спрашиваете, как это сделать. Есть много способов заставить это работать. Здесь только одно предложение:

Пусть setcommand () устанавливает член команды и ничего более. В методе run () поместите цикл while. в цикле while подождите, пока команда не будет установлена, отправьте команду в поток и сбросьте команду на ноль. Необязательный sleep () несколько мс, затем продолжите цикл. НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...