From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1551) id DD148383088E; Fri, 20 May 2022 19:44:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DD148383088E Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Pedro Alves To: gdb-cvs@sourceware.org Subject: [binutils-gdb] Test "set multiple-symbols on" creating multiple breakpoints X-Act-Checkin: binutils-gdb X-Git-Author: Pedro Alves X-Git-Refname: refs/heads/master X-Git-Oldrev: 7ab979957c6dd6fddd86b396e9e885ec09002e8e X-Git-Newrev: 46f0aab14350e9e380c6bbe7bf0539932241fb5b Message-Id: <20220520194414.DD148383088E@sourceware.org> Date: Fri, 20 May 2022 19:44:14 +0000 (GMT) X-BeenThere: gdb-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 May 2022 19:44:15 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D46f0aab14350= e9e380c6bbe7bf0539932241fb5b commit 46f0aab14350e9e380c6bbe7bf0539932241fb5b Author: Pedro Alves Date: Mon May 16 12:48:51 2022 +0100 Test "set multiple-symbols on" creating multiple breakpoints =20 To look for code paths that lead to create_breakpoints_sal creating multiple breakpoints, I ran the whole testsuite with this hack: =20 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -8377,8 +8377,7 @@ create_breakpoints_sal (struct gdbarch *gdbarch, int from_tty, int enabled, int internal, unsigned flags) { - if (canonical->pre_expanded) - gdb_assert (canonical->lsals.size () =3D=3D 1); + gdb_assert (canonical->lsals.size () =3D=3D 1); =20 surprisingly, the assert never failed... =20 The way to get to create_breakpoints_sal with multiple lsals is to use "set multiple-symbols ask" and then select multiple options from the menu, like so: =20 (gdb) set multiple-symbols ask (gdb) b overload1arg [0] cancel [1] all [2] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.cc= :foo::overload1arg() [3] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.cc= :foo::overload1arg(char) [4] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.cc= :foo::overload1arg(double) [5] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.cc= :foo::overload1arg(float) [6] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.cc= :foo::overload1arg(int) [7] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.cc= :foo::overload1arg(long) [8] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.cc= :foo::overload1arg(short) [9] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.cc= :foo::overload1arg(signed char) [10] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.c= c:foo::overload1arg(unsigned char) [11] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.c= c:foo::overload1arg(unsigned int) [12] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.c= c:foo::overload1arg(unsigned long) [13] /home/pedro/gdb/binutils-gdb/src/gdb/testsuite/gdb.cp/ovldbreak.c= c:foo::overload1arg(unsigned short) > 2-3 Breakpoint 2 at 0x1532: file /home/pedro/gdb/binutils-gdb/src/gdb/test= suite/gdb.cp/ovldbreak.cc, line 107. Breakpoint 3 at 0x154b: file /home/pedro/gdb/binutils-gdb/src/gdb/test= suite/gdb.cp/ovldbreak.cc, line 110. warning: Multiple breakpoints were set. Use the "delete" command to delete unwanted breakpoints. =20 ... which would trigger the assert. =20 This commit makes gdb.cp/ovldbreak.exp test this scenario. It does that by making set_bp_overloaded take a list of expected created breakpoints rather than just one breakpoint. It converts the procedure to use gdb_test_multiple instead of send_gdb/gdb_expect along the way. =20 Change-Id: Id87d1e08feb6670440d926f5344e5081f5e37c8e Diff: --- gdb/testsuite/gdb.cp/ovldbreak.exp | 100 +++++++++++++++++++++++++++------= ---- 1 file changed, 75 insertions(+), 25 deletions(-) diff --git a/gdb/testsuite/gdb.cp/ovldbreak.exp b/gdb/testsuite/gdb.cp/ovld= break.exp index 681edf204d3..06adf82ecbb 100644 --- a/gdb/testsuite/gdb.cp/ovldbreak.exp +++ b/gdb/testsuite/gdb.cp/ovldbreak.exp @@ -67,43 +67,75 @@ proc take_gdb_out_of_choice_menu {} { =20 =20 =20 -# This procedure sets an overloaded breakpoint. -# When I ask for such a breakpoint, gdb gives me a menu of 'cancel' 'all' -# and a bunch of choices. I then choose from that menu by number. +# This procedure sets an overloaded breakpoint. When users ask for +# such a breakpoint, gdb gives a menu of 'cancel' 'all' and one choice +# per overload. Users can then choose from that menu by number. +# +# NAME is the spec to use to create the breakpoint. EXPECTEDMENU is +# the expected menu. MYCHOICE is the choice selected. Can be more +# than one overload, e.g. "2-3". BPNUMBER is the expected next +# breakpoint created. LINENUMBERS is a list of line numbers, one +# element per expected breakpoint created. =20 -proc set_bp_overloaded {name expectedmenu mychoice bpnumber linenumber} { - global gdb_prompt hex srcfile +proc set_bp_overloaded {name expectedmenu mychoice bpnumber linenumbers} { + global gdb_prompt hex decimal srcfile =20 # Get into the overload menu. - send_gdb "break $name\n" - gdb_expect { - -re "$expectedmenu" { - pass "bp menu for $name choice $mychoice" - - # Choose my choice. - send_gdb "$mychoice\n" - gdb_expect { - -re "Breakpoint $bpnumber at $hex: file.*$srcfile, line $l= inenumber.\r\n$gdb_prompt $" { - pass "set bp $bpnumber on $name $mychoice line $linenu= mber" - } - -re ".*$gdb_prompt $" { - fail "set bp $bpnumber on $name $mychoice line $linenu= mber (bad bp)" + gdb_test_multiple "break $name" "bp menu for $name choice $mychoice" { + -re "$expectedmenu" { + pass $gdb_test_name + + set any "\[^\r\n\]*" + + # True if we've seen a bad breakpoint. + set bad_bp 0 + + # How many breakpoints we expect to see. + set expected_bps [llength $linenumbers] + + # The count of seen breakpoints. + set seen_bps 0 + + # Choose my choice. + gdb_test_multiple "$mychoice" "set bp $bpnumber on $name $mychoice li= ne $linenumbers" { + -re "Breakpoint ($decimal) at $hex: file$any$srcfile, line ($decimal).\r= \n" { + + set got_num $expect_out(1,string) + set got_line $expect_out(2,string) + + if {$seen_bps >=3D $expected_bps} { + set bad_bp 1 + } else { + set linenumber [lindex $linenumbers $seen_bps] + + if {$got_num !=3D $bpnumber || $got_line !=3D $linenumber} { + set bad_bp 1 + } + + incr bpnumber + incr seen_bps + } + exp_continue + } + -re "$gdb_prompt $" { + gdb_assert {!$bad_bp && $seen_bps =3D=3D $expected_bps} \ + $gdb_test_name } timeout { - fail "set bp $bpnumber on $name $mychoice line $linenu= mber (timeout)" + fail "$gdb_test_name (timeout)" take_gdb_out_of_choice_menu } } } -re ".*\r\n> " { - fail "bp menu for $name choice $mychoice (bad menu)" + fail "$gdb_test_name (bad menu)" take_gdb_out_of_choice_menu } -re ".*$gdb_prompt $" { - fail "bp menu for $name choice $mychoice (no menu)" + fail "$gdb_test_name (no menu)" } timeout { - fail "bp menu for $name choice $mychoice (timeout)" + fail "$gdb_test_name (timeout)" take_gdb_out_of_choice_menu } } @@ -198,8 +230,10 @@ append menu_overload1arg {[\r\n]*> $} # of the multiple-choice menu when breaking on an overloaded method. gdb_test_no_output "set multiple-symbols ask" =20 -# Set breakpoints on foo::overload1arg, one by one. +# The last breakpoint created. set bpnum 1 + +# Set breakpoints on foo::overload1arg, one by one. set method "foo::overload1arg" for {set idx 0} {$idx < [llength $overloads]} {incr idx} { set type [lindex $overloads $idx] @@ -257,6 +291,21 @@ gdb_expect { =20 gdb_test "info break" $bptable "breakpoint info (after cancel)" =20 +# Test that if the user selects multiple entries from the option list, +# GDB creates one breakpoint per entry. +with_test_prefix "multiple breakpoints" { + set method "foo::overload1arg" + + set expected_lines {} + for {set i 0} {$i < 2} {incr i} { + set type [lindex $overloads $i] + lappend expected_lines $line($type_map("$type")) + } + set_bp_overloaded $method $menu_overload1arg \ + "2-3" [incr bpnum] $expected_lines + incr bpnum +} + # Delete these breakpoints. =20 send_gdb "delete breakpoints\n" @@ -284,6 +333,7 @@ gdb_test "info breakpoints" "No breakpoints or watchpoi= nts." "breakpoint info (a # Test choice "all". # This is copy-and-paste from set_bp_overloaded. =20 +incr bpnum send_gdb "break foo::overload1arg\n"=20 gdb_expect { -re "$menu_overload1arg" { @@ -291,7 +341,7 @@ gdb_expect { # Choose all. send_gdb "1\n" gdb_expect { - -re "Breakpoint $decimal at $hex: foo::overload1arg. .12 locations.\r= \n.*$gdb_prompt $" { + -re "Breakpoint $bpnum at $hex: foo::overload1arg. .12 locations.\r\n= .*$gdb_prompt $" { pass "set bp on overload1arg all" } -re ".*$gdb_prompt $" { @@ -380,7 +430,7 @@ array set might_fail { } =20 foreach type $all_types { - continue_to_bp_overloaded 14 $might_fail($type) $line($type) \ + continue_to_bp_overloaded $bpnum $might_fail($type) $line($type) \ $type $arguments($type) }