From 0618ecf6eb99dce0278102a88f622f28e3ecd837 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Wed, 5 May 2021 16:52:29 +0100 Subject: gdb/guile: don't try to print location for watchpoints Currently, using the guile API, if a user tries to print a breakpoint object that represents a watchpoint, then GDB will crash. For example: (gdb) guile (use-modules (gdb)) (gdb) guile (define wp1 (make-breakpoint "some_variable" #:type BP_WATCHPOINT #:wp-class WP_WRITE)) (gdb) guile (register-breakpoint! wp1) (gdb) guile (display wp1) (newline) Aborted (core dumped) This turns out to be because GDB calls event_location_to_string on the breakpoints location, and watchpoint breakpoints don't have a location. This commit resolves the crash by just skipping the printing of the location if the breakpoint doesn't have one. Potentially, we could improve on this by printing details about what the watchpoint is watching, however, I'm considering this a possible future enhancement, this commit focuses just on having GDB not crash. gdb/ChangeLog: * guile/scm-breakpoint.c (bpscm_print_breakpoint_smob): Only print breakpoint locations when the breakpoint actually has a location. gdb/testsuite/ChangeLog: * gdb.guile/scm-breakpoint.exp (test_watchpoints): Print the watchpoint object before and after registering it with GDB. --- gdb/ChangeLog | 5 +++++ gdb/guile/scm-breakpoint.c | 11 ++++++----- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.guile/scm-breakpoint.exp | 5 +++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 14b1a3d..187249d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2021-05-06 Andrew Burgess + + * guile/scm-breakpoint.c (bpscm_print_breakpoint_smob): Only print + breakpoint locations when the breakpoint actually has a location. + 2021-05-06 Tankut Baris Aktemur * mi/mi-cmd-break.c (mi_cmd_break_condition): New function. diff --git a/gdb/guile/scm-breakpoint.c b/gdb/guile/scm-breakpoint.c index 25b438b..826dfa9 100644 --- a/gdb/guile/scm-breakpoint.c +++ b/gdb/guile/scm-breakpoint.c @@ -174,8 +174,6 @@ bpscm_print_breakpoint_smob (SCM self, SCM port, scm_print_state *pstate) /* Careful, the breakpoint may be invalid. */ if (b != NULL) { - const char *str; - gdbscm_printf (port, " %s %s %s", bpscm_type_to_string (b->type), bpscm_enable_state_to_string (b->enable_state), @@ -184,9 +182,12 @@ bpscm_print_breakpoint_smob (SCM self, SCM port, scm_print_state *pstate) gdbscm_printf (port, " hit:%d", b->hit_count); gdbscm_printf (port, " ignore:%d", b->ignore_count); - str = event_location_to_string (b->location.get ()); - if (str != NULL) - gdbscm_printf (port, " @%s", str); + if (b->location != nullptr) + { + const char *str = event_location_to_string (b->location.get ()); + if (str != nullptr) + gdbscm_printf (port, " @%s", str); + } } scm_puts (">", port); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a967147..a6050d6 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2021-05-06 Andrew Burgess + * gdb.guile/scm-breakpoint.exp (test_watchpoints): Print the + watchpoint object before and after registering it with GDB. + +2021-05-06 Andrew Burgess + * gdb.guile/scm-breakpoint.exp (test_bkpt_basic): Convert to 'proc_with_prefix', remove use of 'with_test_prefix', and reindent. diff --git a/gdb/testsuite/gdb.guile/scm-breakpoint.exp b/gdb/testsuite/gdb.guile/scm-breakpoint.exp index 9d27173..5605894 100644 --- a/gdb/testsuite/gdb.guile/scm-breakpoint.exp +++ b/gdb/testsuite/gdb.guile/scm-breakpoint.exp @@ -248,8 +248,13 @@ proc_with_prefix test_watchpoints { } { gdb_scm_test_silent_cmd "guile (define wp1 (make-breakpoint \"result\" #:type BP_WATCHPOINT #:wp-class WP_WRITE))" \ "create watchpoint" + gdb_test "guile (display wp1) (newline)" "#" \ + "print watchpoint before registering" gdb_scm_test_silent_cmd "guile (register-breakpoint! wp1)" \ "register wp1" + gdb_test "guile (display wp1) (newline)" \ + "#" \ + "print watchpoint after registering" gdb_test "continue" \ ".*\[Ww\]atchpoint.*result.*Old value = 0.*New value = 25.*main.*" \ "test watchpoint write" -- cgit v1.1