Re: [HACKERS] Win32 WEXITSTATUS too - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: [HACKERS] Win32 WEXITSTATUS too
Date
Msg-id 200701221833.l0MIXEw01774@momjian.us
Whole thread Raw
In response to Re: [HACKERS] Win32 WEXITSTATUS too simplistic  (Bruce Momjian <bruce@momjian.us>)
Responses Re: [HACKERS] Win32 WEXITSTATUS too  (Alvaro Herrera <alvherre@commandprompt.com>)
List pgsql-patches
I have applied a modified version of this patch.  We now print the
exception value in hex, and give a URL where the exception can be looked
up.

---------------------------------------------------------------------------

Bruce Momjian wrote:
>
> I did some research on this, and found a nice Win32 list of STATUS_
> error values.  Looking at the list, I think the non-exit() return values
> are much larger than just the second high bit.
>
> I am proposing the attached patch, which basically has all system()
> return values < 0x100 as exit() calls, and everything above that as a
> signal exits.  I also think it is too risky to backpatch to 8.2.X.
>
> Also, should we print Win32 WTERMSIG() values as hex because they are so
> large?  I have added that to the patch.
>
> ---------------------------------------------------------------------------
>
> ITAGAKI Takahiro wrote:
> >
> > Tom Lane <tgl@sss.pgh.pa.us> wrote:
> >
> > >     server process exited with exit code -1073741819
> > > from what I suspect is really the equivalent of a SIGSEGV trap,
> > > ie, attempted access to already-deallocated memory.  My calculator
> > > says the above is equivalent to hex C0000005, and I say that this
> > > makes it pretty clear that *some* parts of Windows put flag bits into
> > > the process exit code.  Anyone want to run down what we should really
> > > be using instead of the above macros?
> >
> > C0000005 equals to EXCEPTION_ACCESS_VIOLATION. The value returned by
> > GetExceptionCode() seems to be the exit code in unhandeled exception cases.
> >
> > AFAICS, all EXCEPTION_xxx (or STATUS_xxx) values are defined as 0xCxxxxxxx.
> > I think we can use the second high bit to distinguish exit by exception
> > from normal exits.
> >
> > #define WEXITSTATUS(w)  ((int) ((w) & 0x40000000))
> > #define WIFEXITED(w)    ((w) & 0x40000000) == 0)
> > #define WIFSIGNALED(w)  ((w) & 0x40000000) != 0)
> > #define WTERMSIG(w)     (w) // or ((w) & 0x3FFFFFFF)
> >
> > However, it comes from reverse engineering of the headers of Windows.
> > I cannot find any official documentation.
> >
> > Regards,
> > ---
> > ITAGAKI Takahiro
> > NTT Open Source Software Center
> >
> >
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 3: Have you checked our extensive FAQ?
> >
> >                http://www.postgresql.org/docs/faq
>
> --
>   Bruce Momjian   bruce@momjian.us
>   EnterpriseDB    http://www.enterprisedb.com
>
>   + If your life is a hard drive, Christ can be your backup. +


>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: don't forget to increase your free space map settings

--
  Bruce Momjian   bruce@momjian.us
  EnterpriseDB    http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.508
diff -c -c -r1.508 postmaster.c
*** src/backend/postmaster/postmaster.c    16 Jan 2007 13:28:56 -0000    1.508
--- src/backend/postmaster/postmaster.c    22 Jan 2007 18:29:01 -0000
***************
*** 2421,2426 ****
--- 2421,2427 ----
                  (errmsg("%s (PID %d) exited with exit code %d",
                          procname, pid, WEXITSTATUS(exitstatus))));
      else if (WIFSIGNALED(exitstatus))
+ #ifndef WIN32
          ereport(lev,

          /*------
***************
*** 2428,2433 ****
--- 2429,2443 ----
            "server process" */
                  (errmsg("%s (PID %d) was terminated by signal %d",
                          procname, pid, WTERMSIG(exitstatus))));
+ #else
+         ereport(lev,
+
+         /*------
+           translator: %s is a noun phrase describing a child process, such as
+           "server process" */
+                 (errmsg("%s (PID %d) was terminated by exception %X\nSee
http://source.winehq.org/source/include/ntstatus.hfor a description\nof the hex value.", 
+                         procname, pid, WTERMSIG(exitstatus))));
+ #endif
      else
          ereport(lev,

Index: src/include/port/win32.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/port/win32.h,v
retrieving revision 1.65
diff -c -c -r1.65 win32.h
*** src/include/port/win32.h    11 Jan 2007 02:42:31 -0000    1.65
--- src/include/port/win32.h    22 Jan 2007 18:29:02 -0000
***************
*** 115,130 ****

  /*
   *    Signal stuff
!  *    WIN32 doesn't have wait(), so the return value for children
!  *    is simply the return value specified by the child, without
!  *    any additional information on whether the child terminated
!  *    on its own or via a signal.  These macros are also used
!  *    to interpret the return value of system().
!  */
! #define WEXITSTATUS(w)    (w)
! #define WIFEXITED(w)    (true)
! #define WIFSIGNALED(w)    (false)
! #define WTERMSIG(w)        (0)

  #define sigmask(sig) ( 1 << ((sig)-1) )

--- 115,152 ----

  /*
   *    Signal stuff
!  *
!  *    For WIN32, there is no wait() call so there are no wait() macros
!  *    to interpret the return value of system().  Instead, system()
!  *    return values < 0x100 are used for exit() termination, and higher
!  *    values are used to indicated non-exit() termination, which is
!  *    similar to a unix-style signal exit (think SIGSEGV ==
!  *    STATUS_ACCESS_VIOLATION).  Return values are broken up into groups:
!  *
!  *    http://msdn2.microsoft.com/en-gb/library/aa489609.aspx
!  *
!  *        NT_SUCCESS            0 - 0x3FFFFFFF
!  *        NT_INFORMATION        0x40000000 - 0x7FFFFFFF
!  *        NT_WARNING            0x80000000 - 0xBFFFFFFF
!  *        NT_ERROR            0xC0000000 - 0xFFFFFFFF
!  *
!  *    Effectively, we don't care on the severity of the return value from
!  *    system(), we just need to know if it was because of exit() or generated
!  *    by the system, and it seems values >= 0x100 are system-generated.
!  *    See this URL for a list of WIN32 STATUS_* values:
!  *
!  *        Wine (URL used in our error messages) -
!  *            http://source.winehq.org/source/include/ntstatus.h
!  *        Descriptions - http://www.comp.nus.edu.sg/~wuyongzh/my_doc/ntstatus.txt
!  *        MS SDK - http://www.nologs.com/ntstatus.html
!  *
!  *    Some day we might want to print descriptions for the most common
!  *    exceptions, rather than printing a URL.
!  */
! #define WIFEXITED(w)    (((w) & 0xffffff00) == 0)
! #define WIFSIGNALED(w)  (!WIFEXITED(w))
! #define WEXITSTATUS(w)  (w)
! #define WTERMSIG(w)     (w)

  #define sigmask(sig) ( 1 << ((sig)-1) )

Index: src/port/exec.c
===================================================================
RCS file: /cvsroot/pgsql/src/port/exec.c,v
retrieving revision 1.44
diff -c -c -r1.44 exec.c
*** src/port/exec.c    5 Jan 2007 22:20:02 -0000    1.44
--- src/port/exec.c    22 Jan 2007 18:29:03 -0000
***************
*** 582,589 ****
--- 582,594 ----
          log_error(_("child process exited with exit code %d"),
                    WEXITSTATUS(exitstatus));
      else if (WIFSIGNALED(exitstatus))
+ #ifndef WIN32
          log_error(_("child process was terminated by signal %d"),
                    WTERMSIG(exitstatus));
+ #else
+         log_error(_("child process was terminated by exception %X\nSee
http://source.winehq.org/source/include/ntstatus.hfor a description\nof the hex value."), 
+                   WTERMSIG(exitstatus));
+ #endif
      else
          log_error(_("child process exited with unrecognized status %d"),
                    exitstatus);

pgsql-patches by date:

Previous
From: "Simon Riggs"
Date:
Subject: Re: [PATCHES] pg_standby
Next
From: Alvaro Herrera
Date:
Subject: Re: [HACKERS] Win32 WEXITSTATUS too