Enable exceptions raising on assert on Win32

This patch changes the Win32 version to call RaiseException instead of abort
(which eventually calls TerminateProcess). This allows crash dumps to be sent
correctly instead of the process disappearing.

Signed-off-by: Paul Betts <[email protected]>

---
 src/err.cpp | 10 ++++++++++
 src/err.hpp | 20 ++++++++++++--------
 2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/src/err.cpp b/src/err.cpp
index f374de9..6bc7699 100644
--- a/src/err.cpp
+++ b/src/err.cpp
@@ -236,4 +236,14 @@ void zmq::wsa_error_to_errno ()
 }
 }

+void _abort(const char* errmsg)
+{
+ void* extra_info[1];
+ extra_info[0] = errmsg;
+
+ RaiseException(0x40000015 /* STATUS_FATAL_APP_EXIT */,
+ EXCEPTION_NONCONTINUABLE,
+ 1, extra_info);
+}
+
 #endif
diff --git a/src/err.hpp b/src/err.hpp
index 9558a10..f4abdd7 100644
--- a/src/err.hpp
+++ b/src/err.hpp
@@ -54,6 +54,8 @@ namespace zmq
 void wsa_error_to_errno (); 
 }

+void _abort(const char* errmsg);
+
 // Provides convenient way to check WSA-style errors on Windows.
 #define wsa_assert(x) \
 do {\
@@ -62,7 +64,7 @@ namespace zmq
 if (errstr != NULL) {\
 fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \
 __FILE__, __LINE__);\
- abort ();\
+ _abort (errstr);\
 }\
 }\
 } while (false)
@@ -74,7 +76,7 @@ namespace zmq
 if (errstr != NULL) {\
 fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \
 __FILE__, __LINE__);\
- abort ();\
+ _abort (errstr);\
 }\
 } while (false)

@@ -86,10 +88,12 @@ namespace zmq
 zmq::win_error (errstr, 256);\
 fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \
 __FILE__, __LINE__);\
- abort ();\
+ _abort (errstr);\
 }\
 } while (false)

+#else
+#define _abort(x) abort()
 #endif

 // This macro works in exactly the same way as the normal assert. It is used
@@ -100,7 +104,7 @@ namespace zmq
 if (unlikely (!(x))) {\
 fprintf (stderr, "Assertion failed: %s (%s:%d)\n", #x, \
 __FILE__, __LINE__);\
- abort ();\
+ _abort (#x);\
 }\
 } while (false) 

@@ -110,7 +114,7 @@ namespace zmq
 if (unlikely (!(x))) {\
 perror (NULL);\
 fprintf (stderr, "%s (%s:%d)\n", #x, __FILE__, __LINE__);\
- abort ();\
+ _abort (#x);\
 }\
 } while (false)

@@ -119,7 +123,7 @@ namespace zmq
 do {\
 if (unlikely (x)) {\
 fprintf (stderr, "%s (%s:%d)\n", strerror (x), __FILE__, __LINE__);\
- abort ();\
+ _abort (#x);\
 }\
 } while (false)

@@ -129,7 +133,7 @@ namespace zmq
 if (unlikely (x)) {\
 const char *errstr = gai_strerror (x);\
 fprintf (stderr, "%s (%s:%d)\n", errstr, __FILE__, __LINE__);\
- abort ();\
+ _abort (errstr);\
 }\
 } while (false)

@@ -139,7 +143,7 @@ namespace zmq
 if (unlikely (!x)) {\
 fprintf (stderr, "FATAL ERROR: OUT OF MEMORY (%s:%d)\n",\
 __FILE__, __LINE__);\
- abort ();\
+ _abort ("OUT OF MEMORY");\
 }\
 } while (false)

-- 
1.7.6

-- 
Paul Betts <[email protected]>


On Monday, October 17, 2011 at 1:08 PM, Pieter Hintjens wrote:

> Hi Paul,
> 
> This is great. To apply this to libzmq we need a signed-off patch, see
> http://www.zeromq.org/docs:contributing
> 
> You can also make pull requests to the zeromq2-1 and zeromq3-0
> repositories, then I'll push these changes into the next 2-1 and 3-0
> versions.
> 
> -Pieter
> 
> On Mon, Oct 17, 2011 at 10:45 AM, Paul Betts <[email protected] 
> (mailto:[email protected])> wrote:
> > This patch changes the Win32 version to call RaiseException instead of abort
> > (which eventually calls TerminateProcess). This allows crash dumps to be 
> > sent
> > correctly and code to be debugged more easily. Since the
> > EXCEPTION_NONCONTINUABLE flag is passed into RaiseException, the process is
> > still guaranteed to terminate.
> > 
> > ---
> >  src/err.cpp | 10 ++++++++++
> >  src/err.hpp | 20 ++++++++++++--------
> >  2 files changed, 22 insertions(+), 8 deletions(-)
> > diff --git a/src/err.cpp b/src/err.cpp
> > index f374de9..6bc7699 100644
> > --- a/src/err.cpp
> > +++ b/src/err.cpp
> > @@ -236,4 +236,14 @@ void zmq::wsa_error_to_errno ()
> >  }
> >  }
> > 
> > +void _abort(const char* errmsg)
> > +{
> > + void* extra_info[1];
> > + extra_info[0] = errmsg;
> > +
> > + RaiseException(0x40000015 /* STATUS_FATAL_APP_EXIT */,
> > + EXCEPTION_NONCONTINUABLE,
> > + 1, extra_info);
> > +}
> > +
> >  #endif
> > diff --git a/src/err.hpp b/src/err.hpp
> > index 9558a10..f4abdd7 100644
> > --- a/src/err.hpp
> > +++ b/src/err.hpp
> > @@ -54,6 +54,8 @@ namespace zmq
> >  void wsa_error_to_errno ();
> >  }
> > 
> > +void _abort(const char* errmsg);
> > +
> >  // Provides convenient way to check WSA-style errors on Windows.
> >  #define wsa_assert(x) \
> >  do {\
> > @@ -62,7 +64,7 @@ namespace zmq
> >  if (errstr != NULL) {\
> >  fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \
> >  __FILE__, __LINE__);\
> > - abort ();\
> > + _abort (errstr);\
> >  }\
> >  }\
> >  } while (false)
> > @@ -74,7 +76,7 @@ namespace zmq
> >  if (errstr != NULL) {\
> >  fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \
> >  __FILE__, __LINE__);\
> > - abort ();\
> > + _abort (errstr);\
> >  }\
> >  } while (false)
> > 
> > @@ -86,10 +88,12 @@ namespace zmq
> >  zmq::win_error (errstr, 256);\
> >  fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \
> >  __FILE__, __LINE__);\
> > - abort ();\
> > + _abort (errstr);\
> >  }\
> >  } while (false)
> > 
> > +#else
> > +#define _abort(x) abort()
> >  #endif
> > 
> >  // This macro works in exactly the same way as the normal assert. It is 
> > used
> > @@ -100,7 +104,7 @@ namespace zmq
> >  if (unlikely (!(x))) {\
> >  fprintf (stderr, "Assertion failed: %s (%s:%d)\n", #x, \
> >  __FILE__, __LINE__);\
> > - abort ();\
> > + _abort (#x);\
> >  }\
> >  } while (false)
> > 
> > @@ -110,7 +114,7 @@ namespace zmq
> >  if (unlikely (!(x))) {\
> >  perror (NULL);\
> >  fprintf (stderr, "%s (%s:%d)\n", #x, __FILE__, __LINE__);\
> > - abort ();\
> > + _abort (#x);\
> >  }\
> >  } while (false)
> > 
> > @@ -119,7 +123,7 @@ namespace zmq
> >  do {\
> >  if (unlikely (x)) {\
> >  fprintf (stderr, "%s (%s:%d)\n", strerror (x), __FILE__, __LINE__);\
> > - abort ();\
> > + _abort (#x);\
> >  }\
> >  } while (false)
> > 
> > @@ -129,7 +133,7 @@ namespace zmq
> >  if (unlikely (x)) {\
> >  const char *errstr = gai_strerror (x);\
> >  fprintf (stderr, "%s (%s:%d)\n", errstr, __FILE__, __LINE__);\
> > - abort ();\
> > + _abort (errstr);\
> >  }\
> >  } while (false)
> > 
> > @@ -139,7 +143,7 @@ namespace zmq
> >  if (unlikely (!x)) {\
> >  fprintf (stderr, "FATAL ERROR: OUT OF MEMORY (%s:%d)\n",\
> >  __FILE__, __LINE__);\
> > - abort ();\
> > + _abort ("OUT OF MEMORY");\
> >  }\
> >  } while (false)
> > 
> > --
> > 1.7.6
> > 
> > --
> > Paul Betts <[email protected] (mailto:[email protected])>
> > 
> > _______________________________________________
> > zeromq-dev mailing list
> > [email protected] (mailto:[email protected])
> > http://lists.zeromq.org/mailman/listinfo/zeromq-dev
> _______________________________________________
> zeromq-dev mailing list
> [email protected] (mailto:[email protected])
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Attachment: 0001-Enable-exceptions-raising-on-assert-on-Win32.patch
Description: Binary data

_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to