From 78805ff8aecf0a8c828fb1e2c344fa3a56655120 Mon Sep 17 00:00:00 2001 From: Philippe Waroquiers Date: Sat, 23 May 2020 22:27:28 +0200 Subject: Show locno for 'multi location' breakpoint hit msg+conv var $_hit_bbnum $_hit_locno PR breakpoints/12464 This implements the request given in PR breakpoints/12464. Before this patch, when a breakpoint that has multiple locations is reached, GDB printed: Thread 1 "zeoes" hit Breakpoint 1, some_func () at somefunc1.c:5 This patch changes the message so that bkpt_print_id prints the precise encountered breakpoint: Thread 1 "zeoes" hit Breakpoint 1.2, some_func () at somefunc1.c:5 In mi mode, bkpt_print_id also (optionally) prints a new table field "locno": locno is printed when the breakpoint hit has more than one location. Note that according to the GDB user manual node 'GDB/MI Development and Front Ends', it is ok to add new fields without changing the MI version. Also, when a breakpoint is reached, the convenience variables $_hit_bpnum and $_hit_locno are set to the encountered breakpoint number and location number. $_hit_bpnum and $_hit_locno can a.o. be used in the command list of a breakpoint, to disable the specific encountered breakpoint, e.g. disable $_hit_bpnum.$_hit_locno In case the breakpoint has only one location, $_hit_locno is set to the value 1, so as to allow a command such as: disable $_hit_bpnum.$_hit_locno to disable the breakpoint even when the breakpoint has only one location. This also fixes a strange behaviour: when a breakpoint X has only one location, enable|disable X.1 is accepted but transforms the breakpoint in a multiple locations breakpoint having only one location. The changes in RFA v4 handle the comments of Tom Tromey: - Changed convenience var names from $bkptno/$locno to $_hit_bpnum/$_hit_locno. - updated the tests and user manual accordingly. User manual also explictly describes that $_hit_locno is set to 1 for a breakpoint with a single location. - The variable values are now set in bpstat_do_actions_1 so that they are set for silent breakpoints, and when several breakpoints are hit at the same time, that the variables are set to the printed breakpoint. The changes in RFA v3 handle the additional comments of Eli: GDB/NEW: - Use max 80-column - Use 'code location' instead of 'location'. - Fix typo $bkpno - Ensure that disable $bkptno and disable $bkptno.$locno have each their explanation inthe example - Reworded the 'breakpoint-hit' paragraph. gdb.texinfo: - Use 'code location' instead of 'location'. - Add a note to clarify the distinction between $bkptno and $bpnum. - Use @kbd instead of examples with only one command. Compared to RFA v1, the changes in v2 handle the comments given by Keith Seitz and Eli Zaretskii: - Use %s for the result of paddress - Use bkptno_numopt_re instead of 2 different -re cases - use C@t{++} - Add index entries for $bkptno and $locno - Added an example for "locno" in the mi interface - Added examples in the Break command manual. --- gdb/testsuite/gdb.base/ena-dis-br.exp | 41 ++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 18 deletions(-) (limited to 'gdb/testsuite/gdb.base/ena-dis-br.exp') diff --git a/gdb/testsuite/gdb.base/ena-dis-br.exp b/gdb/testsuite/gdb.base/ena-dis-br.exp index 24925cf..93ac124 100644 --- a/gdb/testsuite/gdb.base/ena-dis-br.exp +++ b/gdb/testsuite/gdb.base/ena-dis-br.exp @@ -67,14 +67,21 @@ gdb_test "info break $bp" \ # See the comments in condbreak.exp for "run until breakpoint at # marker1" for an explanation of the xfail below. set test "continue to break marker1" +set bpno 0 gdb_test_multiple "continue" "$test" { - -re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $" { + -re "Breakpoint (\[0-9\]*), marker1.*$gdb_prompt $" { + set bpno $expect_out(1,string) pass "$test" } - -re "Breakpoint \[0-9\]*, $hex in marker1.*$gdb_prompt $" { + -re "Breakpoint (\[0-9\]*), $hex in marker1.*$gdb_prompt $" { + set bpno $expect_out(1,string) xfail "$test" } } +# Verify the $_hit_bbnum convenience variable is equal to the hit bpno. +gdb_test "print \$_hit_bpnum" " = $bpno" "$test \$_hit_bpnum is $bpno" +# Verify the $_hit_locno is 1, as there is only one code location. +gdb_test "print \$_hit_locno" " = 1" "$test \$_hit_locno is 1" gdb_test_no_output "delete $bp" "delete break marker1" @@ -359,7 +366,8 @@ with_test_prefix "4th breakpoint" { } # Perform tests for disable/enable commands on multiple -# locations and breakpoints. +# code locations and breakpoints. If a breakpoint has only one code location, +# enable/disable num and enable/disable num.1 should be equivalent. # # WHAT - the command to test (disable/enable). # @@ -372,7 +380,7 @@ proc test_ena_dis_br { what } { global b3 global b4 global gdb_prompt - + # OPPOS - the command opposite to WHAT. # WHAT_RES - whether breakpoints are expected to end # up enabled or disabled. @@ -395,13 +403,13 @@ proc test_ena_dis_br { what } { set p2 "pass" } - # Now enable(disable) $b.1 $b2.1. + # Now enable(disable) $b1.1 $b2.1. gdb_test_no_output "$what $b1.1 $b2.1" "$what \$b1.1 \$b2.1" set test1 "${what}d \$b1.1 and \$b2.1" # Now $b1.1 and $b2.1 should be enabled(disabled). gdb_test_multiple "info break" "$test1" { - -re "(${b1}.1)(\[^\n\r\]*)( n.*)(${b2}.1)(\[^\n\r\]*)( n.*)$gdb_prompt $" { + -re "(${b1})(\[^\n\r\]*)( n.*)(${b2})(\[^\n\r\]*)( n.*)$gdb_prompt $" { $p1 "$test1" } -re ".*$gdb_prompt $" { @@ -420,19 +428,16 @@ proc test_ena_dis_br { what } { "${what}d \$b1" gdb_test_no_output "$oppos $b3" "$oppos \$b3" + # Now $b4 $b3 should be enabled(disabled) + set test1 "${what}d \$b4 and \$b3" + gdb_test "info break" "(${b3})(\[^\n\r]*)( $oppos_res.*).*(${b4})(\[^\n\r\]*)( $oppos_res.*)" "$test1" + gdb_test_no_output "$what $b4 $b3.1" "$what \$b4 \$b3.1" - set test1 "${what}d \$b4 and \$b3.1,remain ${oppos}d \$b3" + set test1 "${what}d \$b4 and \$b3.1, changing \$b3" + + # Now $b4 $b3 should be enabled(disabled) + gdb_test "info break" "(${b3})(\[^\n\r]*)( $what_res.*).*(${b4})(\[^\n\r\]*)( $what_res.*)" "$test1" - # Now $b4 $b3.1 should be enabled(disabled) and - # $b3 should remain disabled(enabled). - gdb_test_multiple "info break" "$test1" { - -re "(${b3})(\[^\n\r]*)( $oppos_res.*)(${b3}.1)(\[^\n\r\]*)( n.*)(${b4})(\[^\n\r\]*)( $what_res.*)$gdb_prompt $" { - $p1 "$test1" - } - -re "(${b3})(\[^\n\r]*)( $oppos_res.*)(${b4})(\[^\n\r\]*)( $what_res.*)$gdb_prompt $" { - $p2 "$test1" - } - } # Now enable(disable) '$b4.1 fooobaar'. This should error on # fooobaar. @@ -443,7 +448,7 @@ proc test_ena_dis_br { what } { # $b4.1 should be enabled(disabled). gdb_test_multiple "info break" "$test1" { - -re "(${b4}.1)(\[^\n\r\]*)( n.*)$gdb_prompt $" { + -re "(${b4})(\[^\n\r\]*)( n.*)$gdb_prompt $" { $p1 "$test1" } -re ".*$gdb_prompt $" { -- cgit v1.1