Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [cdt-debug-dev] MI: obtaining GDB's stderr

Chris,

Thanks for your interest.

I put a breakpoint on the read (from GDB's stderr) and it blocks there. The writes (to System.err for test purposes) happen immediately, once the read happens. This is the Reader code

fOutputStream = System.err;
fInputStream = miSession.getGDBProcess().getErrorStream() ;
...
BufferedReader reader = new BufferedReader(new InputStreamReader(fInputStream));
String line;
while ((line = reader.readLine()) != null) {
	line += lineSeparator;
	fOutputStream.write(line.getBytes());
}

BTW: When we run GDB from the command line, we see the stderr messages immediately.

Is it possible that the Pipe (attached to GDB's stderr) needs to be told to flush on '\n'?

Yours, in increasing frustration!

--
Derek


Chris Recoskie wrote:
Sounds like your output stream is not being flushed.  Try flushing it after
each write and see if that changes your output.

It could be possible as well that GDB is not flushing the stderr stream,
but that's probably less likely.

===========================

Chris Recoskie
Team Lead, IBM CDT Team
IBM Toronto
http://www.eclipse.org/cdt



Derek Morris <dmsubs@consertum .com> To Sent by: CDT Debug developers list cdt-debug-dev-bou <cdt-debug-dev@xxxxxxxxxxx> nces@xxxxxxxxxxx cc Subject 17/11/2006 10:58 Re: [cdt-debug-dev] MI: obtaining AM GDB's stderr Please respond to CDT Debug developers list <cdt-debug-dev@ec lipse.org>



Mikhail,

Yes, you are right, it doesn't close the stream.

I have now written a reader thread that sits on GDB's stderr and pumps to
System.out. It does nothing until GDB exits and then prints all of the data

written to stderr. That is, it is blocked on the first read of GDB's
stderr.

So, the data is being written to stderr, but for some reason, I am unable
to
read it immediately.

Any further ideas?

Thanks,

--
Derek


Mikhail Khodjaiants wrote:
A short comment. Did you try to set a breakpoint in this code? If
exitValue for some reason doesn't throw an exception (a bug in the
spawner) and there is no error message the error stream will be closed,
but the session will continue.

-----Original Message-----
From: cdt-debug-dev-bounces@xxxxxxxxxxx
[mailto:cdt-debug-dev-bounces@xxxxxxxxxxx] On Behalf Of Mikhail
Khodjaiants
Sent: 17 November 2006 14:34
To: CDT Debug developers list
Subject: RE: [cdt-debug-dev] MI: obtaining GDB's stderr

Derek,

This code checks if the gdb process has terminated. "exitValue()"
returns a value if the process has terminated, otherwise throws
IllegalThreadStateException. The process can terminate at the startup
for many reason. In this case this code reads the error message, closes
the error stream and throws Miexception to inform the client.
If the process is running (normal situation) this code does nothing
(catch IllegalThreadStateException).

Mikhail

-----Original Message-----
From: cdt-debug-dev-bounces@xxxxxxxxxxx
[mailto:cdt-debug-dev-bounces@xxxxxxxxxxx] On Behalf Of Derek Morris
Sent: 16 November 2006 14:37
To: CDT Debug developers list
Subject: Re: [cdt-debug-dev] MI: obtaining GDB's stderr

Mikhail,

I think I have found why I cannot get to GDB's stderr. In
MISession#setup:

           gdbProcess.exitValue();
           InputStream err = gdbProcess.getErrorStream();
           BufferedReader reader = new BufferedReader(new
InputStreamReader(err));
           String line = null;
           try {
                       line = reader.readLine();
                       reader.close();
           } catch (Exception e) {
                       // the reader may throw a NPE.
           }

This is done before the txThread and rxThread are start()ed.

So, it opens the error stream as a BufferedReader, reads and discards
whatever it finds, and then closes it.

Q: When the BufferedReader closes, will it also close the err
InputStream? i.e.
when i try to open the ErrorStream later on, will it always be empty?

Q: Do you know why it might do this?

Thanks,

--
Derek


Mikhail Khodjaiants wrote:
Hi Derek,

In most cases the process returned by "getGDBProcess" is not a process
that runs gdb. There is a class called Spawner that starts a gdb
process
and creates the pipes for stdin, stdout and stderr. The Spawner's
native
code is located in the "library" directory of the
org.eclipse.cdt.core.<os> plugins. It may be a bug, I don't know if we
have ever used the error stream from gdb.

It would be very useful if you and other "monitor" users come up with
the requirements on how to improve the support for "monitor" in
general.
My personal experience with it is very limited.

Regards,
Mikhail

-----Original Message-----
From: cdt-debug-dev-bounces@xxxxxxxxxxx
[mailto:cdt-debug-dev-bounces@xxxxxxxxxxx] On Behalf Of Derek Morris
Sent: 13 November 2006 16:59
To: CDT Debug developers list
Subject: [cdt-debug-dev] MI: obtaining GDB's stderr

Hi,

How can I get access to GDB's stderr? I am trying to obtain additional
(error) information that is returned from a "monitor" command.

I am using the following code but reader.ready() always returns false.

MIProcess gdbProcess = miSession.getGDBProcess(); InputStream err =
gdbProcess.getErrorStream(); BufferedReader reader = new
BufferedReader(new InputStreamReader(
                      err));
String line = null;
try {
          while (reader.ready()) {
                      line = reader.readLine();
                      errors.add(line) ;
          }
          reader.close();
} catch (Exception e) {
          e.printStackTrace() ;// the reader may throw a NPE.
}

I know that data is being written to stderr - I just can't get it!

TIA
--
Derek
_______________________________________________
cdt-debug-dev mailing list
cdt-debug-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/cdt-debug-dev

_______________________________________________
cdt-debug-dev mailing list
cdt-debug-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/cdt-debug-dev

--
IMPORTANT NOTICE: The contents of this email and any attachments are
confidential and may also be privileged. If you are not the intended
recipient, please notify the sender immediately and do not disclose the
contents to any other person, use it for any purpose, or store or copy
the information in any medium.  Thank you.


_______________________________________________
cdt-debug-dev mailing list
cdt-debug-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/cdt-debug-dev
_______________________________________________
cdt-debug-dev mailing list
cdt-debug-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/cdt-debug-dev

_______________________________________________
cdt-debug-dev mailing list
cdt-debug-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/cdt-debug-dev


_______________________________________________
cdt-debug-dev mailing list
cdt-debug-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/cdt-debug-dev



Back to the top