aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.python
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/testsuite/gdb.python')
-rw-r--r--gdb/testsuite/gdb.python/py-events.exp53
-rw-r--r--gdb/testsuite/gdb.python/py-events.py25
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()