stdin, stdout, stderr when GUI app is launched from command line

Jeremy Drake cygwin@jdrake.com
Thu May 4 20:27:07 GMT 2023


I remember that a python launcher (which is included in distlib, which is
included in pip) experienced a similar situation.  There was a detailed
discussion of debugging what was happening on one of those projects, maybe
that can give you an idea where to start searching.

If you trust my memory, what was happening is that, for a GUI subsystem
app, the OS code during process startup would iterate through the standard
handles in order (in, out, err), check if the handle was attached to a
console, and if so close the handle and NULL it out.  The issue came due
to the fact that when Cygwin launched a process, stdout and stderr pointed
to the SAME handle.  When it evaluated stdout, it saw it was attached to a
console so closed the handle and NULLed the stdout handle.  Then when it
checked stderr, it was no longer a handle that was attached to a console,
it was an invalid (closed) handle, so it didn't close OR NULL out stderr.
This resulted in an invalid-but-non-null handle being present for stderr.
What was even worse is that at some later point, that handle was actually
recycled for some entirely different kind of object.

I believe what you'd see if you called GetStdHandle for each of
STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE, is that the first
two would be NULL and the third would be some handle, possibly invalid and
possibly a handle to some random object.

On Thu, 4 May 2023, Kacvinsky, Tom wrote:

> I have a Windows GUI app that I have set to run with Windows Application Verifier.
> In particular, I have App verifier set to trigger on invalid handle exceptions (code is
> 0xC0000008).  When the application is run from the Cygwin console, it faults with
> an invalid handle three times.  I can continue past them in windbg (or gdb for that
> matter) and the application launches.  I think it is curious the invalid handle exception
> occurs three times - is it stdin, stdout and stderr that App Verifier thinks are invalid
> handles?  My hunch is yes, they are.
>
> I did notice that if I run the GUI use run.exe, as in "run guiapp.exe", the application
> launches with no invalid handle exceptions.
>
> I am using this version of Cygwin 64
>
> vapkay@US05117NB ~ $ cygcheck -V
> cygcheck (cygwin) 3.1.7
>
> But it also happens with 3.4.6
>
> Is this to be expected with a GUI app when run under a Cygwin console?  I've never
> seen it until I ran with App Verifier.  The GUI application is a Qt app.  I check the Qt
> version we're using for use of and I don't see anything in the WinMain what would
> have to do with reading/writing to the standard IO file descriptors.
>
> Any ideas?
>
> Thanks,
>
> Tom

-- 
If you live to the age of a hundred you have it made because very few
people die past the age of a hundred.
		-- George Burns


More information about the Cygwin-developers mailing list