diff options
Diffstat (limited to 'gdb/testsuite/gdb.python')
-rw-r--r-- | gdb/testsuite/gdb.python/py-events.exp | 53 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-events.py | 25 |
2 files changed, 76 insertions, 2 deletions
diff --git a/gdb/testsuite/gdb.python/py-events.exp b/gdb/testsuite/gdb.python/py-events.exp index 7891524..529eeeb 100644 --- a/gdb/testsuite/gdb.python/py-events.exp +++ b/gdb/testsuite/gdb.python/py-events.exp @@ -282,21 +282,70 @@ with_test_prefix "inferior continue exit" { } # Check that when GDB exits, we see gdb.ExitedEvent objects with no -# 'exit_code' attribute. -with_test_prefix "gdb exiting" { +# 'exit_code' attribute, and that a gdb.GdbExitingEvent is emitted. +with_test_prefix "gdb exiting: normal" { + gdb_test "test-exiting-event normal" "GDB exiting event registered\\." + + set saw_exiting_event 0 set saw_inferior_exit 0 gdb_test_multiple "quit" "" { -re "Quit anyway\\? \\(y or n\\) $" { send_gdb "y\n" exp_continue } + -re "event type: gdb-exiting\r\nexit code: $decimal" { + incr saw_exiting_event + exp_continue + } -re "event type: exit\r\nexit code: not-present\r\nexit inf: $decimal\r\nexit pid: $decimal\r\ndir ok: False\r\n" { incr saw_inferior_exit exp_continue } eof { + gdb_assert { $saw_exiting_event == 1 } gdb_assert { $saw_inferior_exit == 2 } pass $gdb_test_name } } } + +# Check that if the GdbExitingEvent raises an exception then this +# doesn't impact GDB's exit process. +with_test_prefix "gdb exiting: error" { + clean_restart ${testfile} + + if ![runto_main] then { + fail "cannot run to main." + return 0 + } + + gdb_test_no_output "source ${pyfile}" "load python file" + gdb_test "test-exiting-event error" "GDB exiting event registered\\." + gdb_test "test-events" "Event testers registered\\." + + set saw_exiting_error 0 + set saw_inferior_exit 0 + gdb_test_multiple "quit" "" { + -re "Quit anyway\\? \\(y or n\\) $" { + send_gdb "y\n" + exp_continue + } + -re "event type: gdb-exiting\r\nexit code: $decimal" { + fail "$gdb_test_name XXXX" + exp_continue + } + -re "Python Exception <class 'gdb.GdbError'>: error from gdb_exiting_handler\r\n" { + incr saw_exiting_error + exp_continue + } + -re "event type: exit\r\nexit code: not-present\r\nexit inf: $decimal\r\nexit pid: $decimal\r\ndir ok: False\r\n" { + incr saw_inferior_exit + exp_continue + } + eof { + gdb_assert { $saw_inferior_exit == 1 } + gdb_assert { $saw_exiting_error == 1 } + pass $gdb_test_name + } + } +} diff --git a/gdb/testsuite/gdb.python/py-events.py b/gdb/testsuite/gdb.python/py-events.py index b21f562..57b0324 100644 --- a/gdb/testsuite/gdb.python/py-events.py +++ b/gdb/testsuite/gdb.python/py-events.py @@ -132,3 +132,28 @@ class test_newobj_events(gdb.Command): test_newobj_events() + +def gdb_exiting_handler(event, throw_error): + assert isinstance(event, gdb.GdbExitingEvent) + if throw_error: + raise gdb.GdbError("error from gdb_exiting_handler") + else: + print("event type: gdb-exiting") + print("exit code: %d" % (event.exit_code)) + +class test_exiting_event(gdb.Command): + """GDB Exiting event.""" + + def __init__(self): + gdb.Command.__init__(self, "test-exiting-event", gdb.COMMAND_STACK) + + def invoke(self, arg, from_tty): + if arg == "normal": + gdb.events.gdb_exiting.connect(lambda e: gdb_exiting_handler(e,False)) + elif arg == "error": + gdb.events.gdb_exiting.connect(lambda e: gdb_exiting_handler(e,True)) + else: + raise gdb.GdbError("invalid or missing argument") + print("GDB exiting event registered.") + +test_exiting_event() |