Translate PyExc_KeyboardInterrupt to gdb "quit"

A while back I typed "info pretty-printers" with a large number of
printers installed, and I typed "q" to stop the pagination.  I noticed
that gdb printed a Python exception in this case.

It seems to me that, instead, quitting pagination (or control-c'ing a
Python command generally) should be handled the same way that gdb
normally handles a quit.

This patch implements this idea by changing gdbpy_handle_exception to
treat PyExc_KeyboardInterrupt specially.

gdb/ChangeLog
2018-12-27  Tom Tromey  <tom@tromey.com>

	* python/py-utils.c (gdbpy_handle_exception): Translate
	PyExc_KeyboardInterrupt to quit.

gdb/testsuite/ChangeLog
2018-12-27  Tom Tromey  <tom@tromey.com>

	* gdb.python/py-cmd.exp (test_python_inline_or_multiline): Add
	pagination test.
This commit is contained in:
Tom Tromey 2018-12-25 12:38:01 -07:00
parent 6ef2312a17
commit bc543c902f
4 changed files with 53 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2018-12-27 Tom Tromey <tom@tromey.com>
* python/py-utils.c (gdbpy_handle_exception): Translate
PyExc_KeyboardInterrupt to quit.
2018-12-27 Tom Tromey <tom@tromey.com>
* python/python-internal.h (gdbpy_print_stack_or_quit): Declare.

View File

@ -422,7 +422,9 @@ gdbpy_handle_exception ()
for user errors. However, a missing message for gdb.GdbError
exceptions is arguably a bug, so we flag it as such. */
if (! PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc)
if (PyErr_GivenExceptionMatches (ptype, PyExc_KeyboardInterrupt))
throw_quit ("Quit");
else if (! PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc)
|| msg == NULL || *msg == '\0')
{
PyErr_Restore (ptype, pvalue, ptraceback);

View File

@ -1,3 +1,8 @@
2018-12-27 Tom Tromey <tom@tromey.com>
* gdb.python/py-cmd.exp (test_python_inline_or_multiline): Add
pagination test.
2018-12-24 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.dwarf2/dw2-unusual-field-names.c: New file.

View File

@ -261,3 +261,43 @@ if { [readline_is_used] } {
}
}
}
# Test that interrupting pagination throws a gdb quit.
gdb_test_no_output "set height 10"
gdb_py_test_multiple "input multi-line-output command" \
"python" "" \
"class test_mline (gdb.Command):" "" \
" \"\"\"Docstring\"\"\"" "" \
" def __init__ (self):" "" \
" super (test_mline, self).__init__ (\"test_multiline\", gdb.COMMAND_USER)" "" \
" def invoke (self, arg, from_tty):" "" \
" for f in range(20):" "" \
" print (\"test_multiline output\")" "" \
"test_mline ()" "" \
"end" ""
set test "verify pagination from test_multiline"
gdb_test_multiple "test_multiline" $test {
-re "--Type <RET>" {
exp_continue
}
-re " for more, q to quit" {
exp_continue
}
-re ", c to continue without paging--$" {
pass $test
}
}
send_gdb "q\n"
set test "verify pagination from test_multiline: q"
gdb_test_multiple "test_multiline" $test {
-re "Error occurred in Python" {
fail $test
}
-re "Quit" {
pass $test
}
}