[08/11,C++/mingw] Simplify first chance exception handling

Message ID 1446492970-21432-9-git-send-email-palves@redhat.com
State New, archived
Headers

Commit Message

Pedro Alves Nov. 2, 2015, 7:36 p.m. UTC
  I can't figure out why we treat first chance exceptions any different
here.

We set last_sig to 1, and then call windows_resume passing signal==1,
so the DBG_EXCEPTION_NOT_HANDLED code path in win32_resume is taken:

~~~
  if (sig != GDB_SIGNAL_0)
    {
      if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
	{
	  OUTMSG (("Cannot continue with signal %d here.\n", sig));
	}
      else if (sig == last_sig)
	continue_status = DBG_EXCEPTION_NOT_HANDLED;
      else
	OUTMSG (("Can only continue with recieved signal %d.\n", last_sig));
    }
~~~

Fix this by removing this special casing.  gdbserver also goes
straight to continuing with DBG_EXCEPTION_NOT_HANDLED, AFAICS.

gdb/ChangeLog:
2015-11-01  Pedro Alves  <palves@redhat.com>

	* windows-nat.c (handle_exception): Return 0 for first chance
	exceptions.
	(get_windows_debug_event): Adjust.
---
 gdb/windows-nat.c | 24 ++++++------------------
 1 file changed, 6 insertions(+), 18 deletions(-)
  

Comments

Simon Marchi Nov. 2, 2015, 9:01 p.m. UTC | #1
On 15-11-02 02:36 PM, Pedro Alves wrote:
> I can't figure out why we treat first chance exceptions any different
> here.
> 
> We set last_sig to 1, and then call windows_resume passing signal==1,
> so the DBG_EXCEPTION_NOT_HANDLED code path in win32_resume is taken:
> 
> ~~~
>   if (sig != GDB_SIGNAL_0)
>     {
>       if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
> 	{
> 	  OUTMSG (("Cannot continue with signal %d here.\n", sig));
> 	}
>       else if (sig == last_sig)
> 	continue_status = DBG_EXCEPTION_NOT_HANDLED;
>       else
> 	OUTMSG (("Can only continue with recieved signal %d.\n", last_sig));
>     }
> ~~~
> 
> Fix this by removing this special casing.  gdbserver also goes
> straight to continuing with DBG_EXCEPTION_NOT_HANDLED, AFAICS.
> 
> gdb/ChangeLog:
> 2015-11-01  Pedro Alves  <palves@redhat.com>
> 
> 	* windows-nat.c (handle_exception): Return 0 for first chance
> 	exceptions.
> 	(get_windows_debug_event): Adjust.
> ---
>  gdb/windows-nat.c | 24 ++++++------------------
>  1 file changed, 6 insertions(+), 18 deletions(-)
> 
> diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
> index 2e12493..cfbd74a 100644
> --- a/gdb/windows-nat.c
> +++ b/gdb/windows-nat.c
> @@ -1124,7 +1124,7 @@ handle_exception (struct target_waitstatus *ourstatus)
>      default:
>        /* Treat unhandled first chance exceptions specially.  */
>        if (current_event.u.Exception.dwFirstChance)
> -	return -1;
> +	return 0;
>        printf_unfiltered ("gdb: unknown target exception 0x%08x at %s\n",
>  	(unsigned) current_event.u.Exception.ExceptionRecord.ExceptionCode,
>  	host_address_to_string (
> @@ -1491,19 +1491,10 @@ get_windows_debug_event (struct target_ops *ops,
>  		     "EXCEPTION_DEBUG_EVENT"));
>        if (saw_create != 1)
>  	break;
> -      switch (handle_exception (ourstatus))
> -	{
> -	case 0:
> -	  continue_status = DBG_EXCEPTION_NOT_HANDLED;
> -	  break;
> -	case 1:
> -	  thread_id = current_event.dwThreadId;
> -	  break;
> -	case -1:
> -	  last_sig = 1;
> -	  continue_status = -1;
> -	  break;
> -	}
> +      if (handle_exception (ourstatus))
> +	thread_id = current_event.dwThreadId;
> +      else
> +	continue_status = DBG_EXCEPTION_NOT_HANDLED;
>        break;
>  
>      case OUTPUT_DEBUG_STRING_EVENT:	/* Message from the kernel.  */
> @@ -1529,10 +1520,7 @@ get_windows_debug_event (struct target_ops *ops,
>  
>    if (!thread_id || saw_create != 1)
>      {
> -      if (continue_status == -1)
> -	windows_resume (ops, minus_one_ptid, 0, 1);
> -      else
> -	CHECK (windows_continue (continue_status, -1, 0));
> +      CHECK (windows_continue (continue_status, -1, 0));
>      }
>    else
>      {
> 

Does this change fix something initially related to C++?
  

Patch

diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 2e12493..cfbd74a 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -1124,7 +1124,7 @@  handle_exception (struct target_waitstatus *ourstatus)
     default:
       /* Treat unhandled first chance exceptions specially.  */
       if (current_event.u.Exception.dwFirstChance)
-	return -1;
+	return 0;
       printf_unfiltered ("gdb: unknown target exception 0x%08x at %s\n",
 	(unsigned) current_event.u.Exception.ExceptionRecord.ExceptionCode,
 	host_address_to_string (
@@ -1491,19 +1491,10 @@  get_windows_debug_event (struct target_ops *ops,
 		     "EXCEPTION_DEBUG_EVENT"));
       if (saw_create != 1)
 	break;
-      switch (handle_exception (ourstatus))
-	{
-	case 0:
-	  continue_status = DBG_EXCEPTION_NOT_HANDLED;
-	  break;
-	case 1:
-	  thread_id = current_event.dwThreadId;
-	  break;
-	case -1:
-	  last_sig = 1;
-	  continue_status = -1;
-	  break;
-	}
+      if (handle_exception (ourstatus))
+	thread_id = current_event.dwThreadId;
+      else
+	continue_status = DBG_EXCEPTION_NOT_HANDLED;
       break;
 
     case OUTPUT_DEBUG_STRING_EVENT:	/* Message from the kernel.  */
@@ -1529,10 +1520,7 @@  get_windows_debug_event (struct target_ops *ops,
 
   if (!thread_id || saw_create != 1)
     {
-      if (continue_status == -1)
-	windows_resume (ops, minus_one_ptid, 0, 1);
-      else
-	CHECK (windows_continue (continue_status, -1, 0));
+      CHECK (windows_continue (continue_status, -1, 0));
     }
   else
     {