This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Python unwinder sniffer: PyExc_KeyboardInterrupt -> Quit


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9ccabccd15603dbf9fe988c86708fe644d1398a7

commit 9ccabccd15603dbf9fe988c86708fe644d1398a7
Author: Pedro Alves <palves@redhat.com>
Date:   Thu Nov 16 18:44:44 2017 +0000

    Python unwinder sniffer: PyExc_KeyboardInterrupt -> Quit
    
    If you happen to press Ctrl-C while GDB is running the Python unwinder
    machinery, the Ctrl-C is swallowed by the Python unwinder machinery.
    
    For example, with:
    
     break foo
     commands
     > c
     > end
    
    and
    
      while (1)
        foo ();
    
    and then let the inferior hit "foo" repeatedly, sometimes Ctrl-C
    results in:
    
    ~~~
      23        usleep (100);
    
      Breakpoint 2, foo () at gdb.base/bp-cmds-continue-ctrl-c.c:23
      23        usleep (100);
      ^C
      Breakpoint 2, Python Exception <class 'KeyboardInterrupt'> <class 'KeyboardInterrupt'>:
      foo () at gdb.base/bp-cmds-continue-ctrl-c.c:23
      23        usleep (100);
    
      Breakpoint 2, foo () at gdb.base/bp-cmds-continue-ctrl-c.c:23
      23        usleep (100);
    
      Breakpoint 2, foo () at gdb.base/bp-cmds-continue-ctrl-c.c:23
      23        usleep (100);
    ~~~
    
    Notice the Python exception above.  The interesting thing here is that
    GDB continues as if nothing happened, doesn't really stop and give
    back control to the user.  Instead, the Ctrl-C aborted the Python
    unwinder sniffer and GDB moved on to just use another unwinder.
    
    Fix this by translating a PyExc_KeyboardInterrupt back into a Quit
    exception once back in GDB.
    
    This was exposed by the new gdb.base/bp-cmds-continue-ctrl-c.exp
    testcase added later in the series.
    
    gdb/ChangeLog:
    2017-11-16  Pedro Alves  <palves@redhat.com>
    
    	* python/py-unwind.c (pyuw_sniffer): Translate
    	PyExc_KeyboardInterrupt to a GDB Quit exception.

Diff:
---
 gdb/ChangeLog          | 5 +++++
 gdb/python/py-unwind.c | 7 +++++++
 2 files changed, 12 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b55ffdd..ab329df 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
 2017-11-16  Pedro Alves  <palves@redhat.com>
 
+	* python/py-unwind.c (pyuw_sniffer): Translate
+	PyExc_KeyboardInterrupt to a GDB Quit exception.
+
+2017-11-16  Pedro Alves  <palves@redhat.com>
+
 	* infrun.c (resume_cleanups): Delete.
 	(resume): No longer install a resume_cleanups cleanup nor call
 	QUIT.
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
index acfce7d..b578373 100644
--- a/gdb/python/py-unwind.c
+++ b/gdb/python/py-unwind.c
@@ -539,6 +539,13 @@ pyuw_sniffer (const struct frame_unwind *self, struct frame_info *this_frame,
 				   pyo_pending_frame.get (), NULL));
   if (pyo_unwind_info == NULL)
     {
+      /* If the unwinder is cancelled due to a Ctrl-C, then propagate
+	 the Ctrl-C as a GDB exception instead of swallowing it.  */
+      if (PyErr_ExceptionMatches (PyExc_KeyboardInterrupt))
+	{
+	  PyErr_Clear ();
+	  quit ();
+	}
       gdbpy_print_stack ();
       return 0;
     }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]