From 28774a6015261a100c426d206154a98c0ca215ce Mon Sep 17 00:00:00 2001 From: Nikhil Benesch Date: Sat, 10 Oct 2020 16:26:54 +0000 Subject: libgo: print reason code if throwing unwind exception fails Calls to _Unwind_RaiseException and friends *can* return due to bugs in libgo or memory corruption. When this occurs, print a message to stderr with the reason code before aborting to aid debugging. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/261257 --- libgo/runtime/go-unwind.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'libgo') diff --git a/libgo/runtime/go-unwind.c b/libgo/runtime/go-unwind.c index ad3142c..16e0525 100644 --- a/libgo/runtime/go-unwind.c +++ b/libgo/runtime/go-unwind.c @@ -59,20 +59,22 @@ void rethrowException () { struct _Unwind_Exception *hdr; + _Unwind_Reason_Code reason; hdr = (struct _Unwind_Exception *) runtime_g()->exception; #ifdef __USING_SJLJ_EXCEPTIONS__ - _Unwind_SjLj_Resume_or_Rethrow (hdr); + reason = _Unwind_SjLj_Resume_or_Rethrow (hdr); #else #if defined(_LIBUNWIND_STD_ABI) - _Unwind_RaiseException (hdr); + reason = _Unwind_RaiseException (hdr); #else - _Unwind_Resume_or_Rethrow (hdr); + reason = _Unwind_Resume_or_Rethrow (hdr); #endif #endif /* Rethrowing the exception should not return. */ + runtime_printf ("failed to rethrow unwind exception (reason=%d)\n", reason); abort(); } @@ -105,6 +107,7 @@ throwException () { struct _Unwind_Exception *hdr; uintptr align; + _Unwind_Reason_Code reason; hdr = (struct _Unwind_Exception *)runtime_g ()->exception; @@ -119,12 +122,13 @@ throwException () hdr->exception_cleanup = NULL; #ifdef __USING_SJLJ_EXCEPTIONS__ - _Unwind_SjLj_RaiseException (hdr); + reason = _Unwind_SjLj_RaiseException (hdr); #else - _Unwind_RaiseException (hdr); + reason = _Unwind_RaiseException (hdr); #endif /* Raising an exception should not return. */ + runtime_printf ("failed to throw unwind exception (reason=%d)\n", reason); abort (); } -- cgit v1.1