From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32239 invoked by alias); 11 Nov 2011 17:08:01 -0000 Received: (qmail 32221 invoked by uid 22791); 11 Nov 2011 17:07:56 -0000 X-SWARE-Spam-Status: No, hits=-3.9 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_LOW,RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail-qw0-f41.google.com (HELO mail-qw0-f41.google.com) (209.85.216.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 11 Nov 2011 17:07:40 +0000 Received: by qadc11 with SMTP id c11so4772361qad.0 for ; Fri, 11 Nov 2011 09:07:39 -0800 (PST) Received: by 10.224.182.196 with SMTP id cd4mr9554591qab.3.1321029827361; Fri, 11 Nov 2011 08:43:47 -0800 (PST) MIME-Version: 1.0 Received: by 10.224.182.196 with SMTP id cd4mr9554576qab.3.1321029827135; Fri, 11 Nov 2011 08:43:47 -0800 (PST) Received: by 10.224.6.76 with HTTP; Fri, 11 Nov 2011 08:43:47 -0800 (PST) In-Reply-To: References: Date: Fri, 11 Nov 2011 17:08:00 -0000 Message-ID: Subject: Re: [PATCH] testsuite: Add (extensive) hardware breakpoint testing From: Doug Evans To: "Maciej W. Rozycki" Cc: gdb-patches@sourceware.org, Joel Brobecker Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-System-Of-Record: true X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-11/txt/msg00323.txt.bz2 Hi. My two bit review. On Fri, Nov 11, 2011 at 4:12 AM, Maciej W. Rozycki wrote: >[...] > =A0The consistency of failures between i686-linux-gnu and i686-mingw makes > me fairly sure that's a bug in x86 support in GDB of some sort rather than > a problem with my setup -- is that a known bug? OOC, have you tried amd64-linux? {i386,amd64}-linux are important enough targets that I think this should be fixed for 7.4. Joel? > =A0Questions or comments? =A0Otherwise OK to apply? One high level comment: There's a lot of basic linespec testing that would be nice to make table dr= iven. E.g., {hbreak,thbreak} x {function, file:lineno, ...}, followed by delete_breakpoints. [I might not do this when testing running to the breakpoints, dunno if that is easily made data-driven, though that would be nice too.] If we're going to do (semi-)exhaustive linespec testing, I'd rather have a table than a lot of repetitive code. The same applies to break,tbreak. They too could be table driven. OTOH, maybe it's better to do simple linespec testing separately. There I would move {break,tbreak,hbreak,thbreak} x {function, file:lineno, ...} into its own file, have a table to drive it, and do a lot of testing with less code. It'd be more easily extensible too. I wouldn't make this a requirement, just mentioning it. > > 2011-11-11 =A0Maciej W. Rozycki =A0 > =A0 =A0 =A0 =A0 =A0 =A0Maciej W. Rozycki =A0 > =A0 =A0 =A0 =A0 =A0 =A0Daniel Jacobowitz =A0 > > =A0 =A0 =A0 =A0* gdb.base/hbreak2.exp: New test for "hbreak" and "thbreak= ". > > =A0Maciej > > gdb-test-hbreak.diff > Index: gdb-fsf-trunk-quilt/gdb/testsuite/gdb.base/hbreak2.exp > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- /dev/null =A0 1970-01-01 00:00:00.000000000 +0000 > +++ gdb-fsf-trunk-quilt/gdb/testsuite/gdb.base/hbreak2.exp =A0 =A0 =A0201= 1-11-10 13:23:14.525919195 +0000 > @@ -0,0 +1,629 @@ > +# =A0 Copyright 1988, 1990, 1991, 1992, 1994, 1995, 1996, 1997, 1998, 19= 99, > +# =A0 2000, 2002, 2003, 2007, 2008, 2009, 2010, 2011 > +# =A0 Free Software Foundation, Inc. This is a new file. I'm not sure what the rule is, but I think this should just say 2011. > + > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =A0See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. =A0If not, see . > + > +# Based on break.exp by Rob Savoye. (rob@cygnus.com) > +# Only one hardware breakpoint is set at a time as targets may limit > +# the number available. > + > + > +if { [prepare_for_testing hbreak2.exp "break" {break.c break1.c} {debug = nowarnings}] } { > + =A0 =A0return -1 > +} > +set srcfile break.c > +set srcfile1 break1.c > + > +if ![runto_main] then { fail "break tests suppressed" } > +delete_breakpoints > + > +# > +# Test whether the target supports hardware breakpoints at all. > +# > +gdb_test_multiple "hbreak main" "hardware breakpoint support" { > + =A0 =A0-re "No hardware breakpoint support in the target.*$gdb_prompt $= " { > + =A0 =A0 =A0 unsupported "hardware breakpoints" > + =A0 =A0 =A0 return > + =A0 =A0} > + =A0 =A0-re "Hardware breakpoints used exceeds limit.*$gdb_prompt $" { > + =A0 =A0 =A0 unsupported "hardware breakpoints" > + =A0 =A0 =A0 return > + =A0 =A0} > + =A0 =A0-re "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*$= gdb_prompt $" { > + =A0 =A0 =A0 pass "hardware breakpoint support" > + =A0 =A0} > +} > +gdb_run_cmd > +gdb_test_multiple "" "hardware breakpoint insertion" { > + =A0 =A0-re "Warning:\[\r\n\]+Cannot insert hardware breakpoint \[0-9\]+= \.\[\r\n\]+Could not insert hardware breakpoints:\[\r\n\]+You may have requ= ested too many hardware breakpoints/watchpoints\.\[\r\n\]+.*$gdb_prompt $" { > + =A0 =A0 =A0 unsupported "hardware breakpoint insertion" > + =A0 =A0 =A0 return > + =A0 =A0} > + =A0 =A0-re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:.*\= [\r\n\]+.*\[\t \]+if .argc.* \{.*$gdb_prompt $" { > + =A0 =A0 =A0 pass "hardware breakpoint insertion" > + =A0 =A0} > +} > +delete_breakpoints > + > +# > +# Test simple hardware breakpoint setting commands. > +# > + > +# > +# Test break at function. > +# > +gdb_test "hbreak main" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \ > + =A0 =A0"hardware breakpoint function" > +delete_breakpoints > + > +# > +# Test break at quoted function. > +# > +gdb_test "hbreak \"marker2\"" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile1, line.*" \ > + =A0 =A0"hardware breakpoint quoted function" > +delete_breakpoints > + > +# > +# Test break at function in file. > +# > +gdb_test "hbreak $srcfile:factorial" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \ > + =A0 =A0"hardware breakpoint function in file" > +delete_breakpoints > + > +set bp_location1 [gdb_get_line_number "set breakpoint 1 here"] > + > +# > +# Test break at line number. > +# > +# Note that the default source file is the last one whose source text > +# was printed. =A0For native debugging, before we've executed the > +# program, this is the file containing main, but for remote debugging, > +# it's wherever the processor was stopped when we connected to the > +# board. =A0So, to be sure, we do a list command. > +# > +gdb_test "list main" \ > + =A0 =A0".*main \\(argc, argv, envp\\).*" \ > + =A0 =A0"use `list' to establish default source file" > +gdb_test "hbreak $bp_location1" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation1\\." \ > + =A0 =A0"hardware breakpoint line number" > +delete_breakpoints > + > +set bp_location2 [gdb_get_line_number "set breakpoint 2 here"] > + > +# > +# Test break at line number in file. > +# > +gdb_test "hbreak $srcfile:$bp_location2" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation2\\." \ > + =A0 =A0"hardware breakpoint line number in file" > +delete_breakpoints > + > +set bp_location3 [gdb_get_line_number "set breakpoint 3 here"] > +set bp_location4 [gdb_get_line_number "set breakpoint 4 here"] > + > +# > +# Test putting a break at the start of a multi-line if conditional. > +# Verify the breakpoint was put at the start of the conditional. > +# > +gdb_test "hbreak multi_line_if_conditional" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation3\\." \ > + =A0 =A0"hardware breakpoint at start of multi line if conditional" > +delete_breakpoints > + > +gdb_test "hbreak multi_line_while_conditional" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation4\\." \ > + =A0 =A0"hardware breakpoint at start of multi line while conditional" > + > +set bp_location5 [gdb_get_line_number "set breakpoint 5 here"] > +set bp_location6 [gdb_get_line_number "set breakpoint 6 here"] > + > +# > +# Check to see what breakpoints are set. > +# > +if [target_info exists gdb_stub] { > + =A0 =A0set main_line $bp_location5 > +} else { > + =A0 =A0set main_line $bp_location6 > +} > + > +if {$hp_aCC_compiler} { > + =A0 =A0set proto "\\(int\\)" > +} else { > + =A0 =A0set proto "" > +} > + > +set bp_location7 [gdb_get_line_number "set breakpoint 7 here"] > +set bp_location8 [gdb_get_line_number "set breakpoint 8 here" $srcfile1] > +set bp_location9 [gdb_get_line_number "set breakpoint 9 here" $srcfile1] > + > +gdb_test "info break" \ > + =A0 =A0"Num =A0 =A0 Type\[ \]+Disp Enb Address\[ \]+What.* > +\[0-9\]+\[\t \]+hw breakpoint =A0keep y.* in multi_line_while_conditiona= l at .*$srcfile:$bp_location4" \ > + =A0 =A0"hardware breakpoint info" > +delete_breakpoints > + > +# FIXME: The rest of this test doesn't work with anything that can't > +# handle arguments. > +# Huh? =A0There doesn't *appear* to be anything that passes arguments > +# below. I think I'd just remove the FIXME and Huh? comments. And then ideally remove the mips-idt-* test. > +if [istarget "mips-idt-*"] then { > + =A0 =A0return > +} > + > +# > +# Run until the breakpoint at main is hit. =A0For non-stubs-using target= s. > +# > +gdb_test "hbreak main" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \ > + =A0 =A0"hardware breakpoint function (2)" > +gdb_run_cmd > +gdb_test "" \ > + =A0 =A0"Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_loc= ation6.*$bp_location6\[\t \]+if .argc.* \{.*" \ > + =A0 =A0"run until function breakpoint" > +delete_breakpoints > + > +# > +# Run until the breakpoint at a line number. > +# > +gdb_test "hbreak $bp_location1" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation1\\." \ > + =A0 =A0"hardware breakpoint line number (2)" > +gdb_test "continue" \ > + =A0 =A0"Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=3D.*, argv=3D.= *, envp=3D.*\\) at .*$srcfile:$bp_location1.*$bp_location1\[\t \]+printf.*f= actorial.*" \ > + =A0 =A0"run until breakpoint set at a line number" > +delete_breakpoints > + > +# > +# Run until the breakpoint set in a function in a file. > +# > +gdb_test "hbreak $srcfile:factorial" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \ > + =A0 =A0"hardware breakpoint function in file (2)" > +for {set i 6} {$i >=3D 1} {incr i -1} { > + =A0 =A0gdb_test "continue" \ > + =A0 =A0 =A0 "Continuing\\..*Breakpoint \[0-9\]+, factorial \\(value=3D$= i\\) at .*$srcfile:$bp_location7.*$bp_location7\[\t \]+.*if .value > 1. \{.= *" \ > + =A0 =A0 =A0 "run until file:function($i) breakpoint" > +} > +delete_breakpoints > + > +# > +# Run until the breakpoint set at a quoted function. > +# > +gdb_test "hbreak \"marker2\"" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile1, line.*" \ > + =A0 =A0"hardware breakpoint quoted function (2)" > +gdb_test "continue" \ > + =A0 =A0"Continuing\\..*Breakpoint \[0-9\]+, (0x\[0-9a-f\]+ in )?marker2= \\(a=3D43\\) at .*$srcfile1:($bp_location8|$bp_location9).*" \ > + =A0 =A0"run until quoted breakpoint" > +delete_breakpoints > +# > +# Run until the file:function breakpoint at a line number in a file. > +# > +gdb_test "hbreak $srcfile:$bp_location2" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation2\\." \ > + =A0 =A0"hardware breakpoint line number in file (2)" > +gdb_test "continue" \ > + =A0 =A0"Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=3D.*, argv=3D.= *, envp=3D.*\\) at .*$srcfile:$bp_location2.*$bp_location2\[\t \]+argc =3D = \\(argc =3D=3D 12345\\);.*" \ > + =A0 =A0"run until file:linenum breakpoint" > +delete_breakpoints > + > +# Test break at offset +1. > +set bp_location10 [gdb_get_line_number "set breakpoint 10 here"] > + > +gdb_test "hbreak +1" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation10\\." \ > + =A0 =A0"hardware breakpoint offset +1" > + > +# Check to see if breakpoint is hit when stepped onto. > + > +gdb_test "step" \ > + =A0 =A0".*Breakpoint \[0-9\]+, main \\(argc=3D.*, argv=3D.*, envp=3D.*\= \) at .*$srcfile:$bp_location10.*$bp_location10\[\t \]+return argc;.*breakp= oint 10 here.*" \ > + =A0 =A0"step onto hardware breakpoint" > +delete_breakpoints > + > +# Check to see if breakpoint can be set on ending brace of function. > +set bp_location10a [gdb_get_line_number "set breakpoint 10a here"] > + > +gdb_test "hbreak $bp_location10a" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation10a\\." \ > + =A0 =A0"setting hardware breakpoint at }" > + > +gdb_test "continue" \ > + =A0 =A0".*Breakpoint \[0-9\]+, main \\(argc=3D.*, argv=3D.*, envp=3D.*\= \) at .*$srcfile:$bp_location10a.*$bp_location10a\[\t \]+}.*breakpoint 10a = here.*" \ > + =A0 =A0"continue to hardware breakpoint at }" > + > +# > +# Delete all breakpoints so we can start over, course this can be a test= too. > +# > +delete_breakpoints > + > +# > +# Test temporary breakpoint at function. > +# > + > +gdb_test "thbreak main" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \ > + =A0 =A0"temporary hardware breakpoint function" > +delete_breakpoints > + > +# > +# Test break at function in file. > +# > + > +gdb_test "thbreak $srcfile:factorial" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line.*" \ > + =A0 =A0"temporary hardware breakpoint function in file" > +delete_breakpoints > + > +# > +# Test break at line number. > +# > +gdb_test "thbreak $bp_location1" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation1.*" \ > + =A0 =A0"temporary hardware breakpoint line number #1" > +delete_breakpoints > + > +gdb_test "thbreak $bp_location6" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation6.*" \ > + =A0 =A0"temporary hardware breakpoint line number #2" > +delete_breakpoints > + > +# > +# Test break at line number in file. > +# > +gdb_test "thbreak $srcfile:$bp_location2" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation2.*" \ > + =A0 =A0"temporary hardware breakpoint line number in file #1" > +delete_breakpoints > + > +set bp_location11 [gdb_get_line_number "set breakpoint 11 here"] > +gdb_test "thbreak $srcfile:$bp_location11" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile, line $bp_lo= cation11.*" \ > + =A0 =A0"temporary hardware breakpoint line number in file #2" > + > +# > +# Check to see what breakpoints are set (temporary this time). > +# > +gdb_test "info break" \ > + =A0 =A0"Num =A0 =A0 Type.*Disp Enb Address.*What.*\[\r\n\] > +\[0-9\]+\[\t \]+hw breakpoint =A0del.*y.*in main at .*$srcfile:$bp_locat= ion11.*" \ > + =A0 =A0"temporary hardware breakpoint info" > + > + > +#*********** > + > +if ![runto_main] then { fail "break tests suppressed" } > + > +# Verify that GDB responds gracefully when asked to set a breakpoint > +# on a nonexistent source line. > +# > +gdb_test "hbreak 999" \ > + =A0 =A0"No line 999 in file .*" \ > + =A0 =A0"hardware break on non-existent source line" > + > +# Run to the desired default location. =A0If not positioned here, the > +# tests below don't work. > +# > +gdb_test "until $bp_location1" "main .* at .*:$bp_location1.*" \ > + =A0 =A0"until bp_location1" > + > + > +# Verify that GDB allows one to just say "hbreak", which is treated > +# as the "default" breakpoint. > +# > +gdb_test "hbreak" "Hardware assisted breakpoint \[0-9\]*.*" \ > + =A0 =A0"hardware break on default location" > + > +# Verify that a "silent" breakpoint can be set, and that GDB is indeed > +# "silent" about its triggering. > +# > +if ![runto_main] then { fail "break tests suppressed" } > + > +gdb_test_multiple "hbreak $bp_location1" \ > + =A0 =A0"set to-be-silent hardware break bp_location1" { > + =A0 =A0 =A0 -re "Hardware assisted breakpoint (\[0-9\]*) at .*, line $b= p_location1.*$gdb_prompt $" { > + =A0 =A0 =A0 =A0 =A0 pass "set to-be-silent hardware break bp_location1" > + =A0 =A0 =A0 } > + =A0 =A0} > + > +send_gdb "commands $expect_out(1,string)\n" > +send_gdb "silent\n" > +send_gdb "end\n" > +gdb_test "" "set silent hardware break bp_location1" > + > +gdb_test "info break $expect_out(1,string)" \ > + =A0 =A0"\[0-9\]*\[ \t\]*hw breakpoint.*:$bp_location1\r\n\[ \t\]*silent= .*" \ > + =A0 =A0"info silent hardware break bp_location1" > + > +gdb_test "continue" "Continuing." \ > + =A0 =A0"hit silent hardware break bp_location1" > + > +gdb_test "bt" "#0 =A0main .* at .*:$bp_location1.*" \ > + =A0 =A0"stopped for silent hardware break bp_location1" > + > +# Verify that GDB can at least parse a breakpoint with the > +# "thread" keyword. =A0(We won't attempt to test here that a > +# thread-specific breakpoint really triggers appropriately. > +# The gdb.threads subdirectory contains tests for that.) > +# > +set bp_location12 [gdb_get_line_number "set breakpoint 12 here"] > +gdb_test "hbreak $bp_location12 thread 999" "Unknown thread 999.*" \ > + =A0 =A0"thread-specific hardware breakpoint on non-existent thread disa= llowed" > + > +gdb_test "hbreak $bp_location12 thread foo" \ > + =A0 =A0"Junk after thread keyword.*" \ > + =A0 =A0"thread-specific hardware breakpoint on bogus thread ID disallow= ed" > + > +# Verify that GDB responds gracefully to a breakpoint command with > +# trailing garbage. > +# > +gdb_test "hbreak $bp_location12 foo" \ > + =A0 =A0"Junk at end of arguments.*" \ > + =A0 =A0"hardware breakpoint with trailing garbage disallowed" > + > +# Verify that GDB responds gracefully to a "clear" command that has > +# no matching breakpoint. =A0(First, get us off the current source line, > +# which we know has a breakpoint.) > +# > +gdb_test "next" "marker1.*" "step over hardware breakpoint" > + > +gdb_test "clear 81" "No breakpoint at 81.*" \ > + =A0 =A0"clear line has no breakpoint disallowed" > + > +gdb_test "clear" "No breakpoint at this line.*" \ > + =A0 =A0"clear current line has no breakpoint disallowed" > +delete_breakpoints > + > +# Verify that a breakpoint can be set via a convenience variable. > +# > +gdb_test_no_output "set \$foo=3D$bp_location11" \ > + =A0 =A0"set convenience variable \$foo to bp_location11" > + > +gdb_test "hbreak \$foo" \ > + =A0 =A0"Hardware assisted breakpoint (\[0-9\]*) at .*, line $bp_locatio= n11.*" \ > + =A0 =A0"set hardware breakpoint via convenience variable" > +delete_breakpoints > + > +# Verify that GDB responds gracefully to an attempt to set a > +# breakpoint via a convenience variable whose type is not integer. > +# > +gdb_test_no_output "set \$foo=3D81.5" \ > + =A0 =A0"set convenience variable \$foo to 81.5" > + > +gdb_test "hbreak \$foo" \ > + =A0 =A0"Convenience variables used in line specs must have integer valu= es.*" \ > + =A0 =A0"set hardware breakpoint via non-integer convenience variable di= sallowed" > + > +# Verify that we can set and trigger a breakpoint in a user-called funct= ion. > +# > +gdb_test "hbreak marker2" \ > + =A0 =A0"Hardware assisted breakpoint (\[0-9\]*) at .*, line ($bp_locati= on8|$bp_location9).*" \ > + =A0 =A0"set hardware breakpoint on to-be-called function" > + > +gdb_test "print marker2(99)" \ > + =A0 =A0"The program being debugged stopped while in a function called f= rom GDB.\r\nEvaluation of the expression containing the function\r\n.marker= 2$proto. will be abandoned.\r\nWhen the function is done executing, GDB wil= l silently stop.*" \ > + =A0 =A0"hit hardware breakpoint on called function" > + > +# As long as we're stopped (breakpointed) in a called function, > +# verify that we can successfully backtrace & such from here. > +# > +# In this and the following test, the _sr4export check apparently is nee= ded > +# for hppa*-*-hpux. > +# > +gdb_test_multiple "bt" "backtrace while in called function" { > + =A0 =A0-re "#0\[ \t\]*($hex in )?marker2.*:($bp_location8|$bp_location9= )\r\n#1.*_sr4export.*$gdb_prompt $" { > + =A0 =A0 =A0 pass "backtrace while in called function" > + =A0 =A0} > + =A0 =A0-re "#0\[ \t\]*($hex in )?marker2.*:($bp_location8|$bp_location9= )\r\n#1.*function called from gdb.*$gdb_prompt $" { > + =A0 =A0 =A0 pass "backtrace while in called function" > + =A0 =A0} > +} > + > +# Return from the called function. =A0For remote targets, it's important= to do > +# this before runto_main, which otherwise may silently stop on the dummy > +# breakpoint inserted by GDB at the program's entry point. > +# > +gdb_test_multiple "finish" "finish from called function" { > + =A0 =A0-re "Run till exit from .*marker2.* at .*($bp_location8|$bp_loca= tion9)\r\n.* in _sr4export.*$gdb_prompt $" { > + =A0 =A0 =A0 pass "finish from called function" > + =A0 =A0} > + =A0 =A0-re "Run till exit from .*marker2.* at .*($bp_location8|$bp_loca= tion9)\r\n.*function called from gdb.*$gdb_prompt $" { > + =A0 =A0 =A0 pass "finish from called function" > + =A0 =A0} > + =A0 =A0-re "Run till exit from .*marker2.* at .*($bp_location8|$bp_loca= tion9)\r\n.*Value returned.*$gdb_prompt $" { > + =A0 =A0 =A0 pass "finish from called function" > + =A0 =A0} > +} > + > +#******** > + > + > +# > +# Test "next" over recursive function call. > +# > + > +proc test_next_with_recursion {} { > + =A0 =A0global gdb_prompt > + =A0 =A0global decimal > + =A0 =A0global binfile > + > + =A0 =A0delete_breakpoints > + > + =A0 =A0# Can't set a hardware breakpoint without a live target, so do i= t now > + =A0 =A0# before it's killed below. > + =A0 =A0gdb_test "hbreak factorial" \ > + =A0 =A0 =A0 "Hardware assisted breakpoint $decimal at .*" \ > + =A0 =A0 =A0 "hardware break at factorial" > + > + =A0 =A0gdb_test "kill" "" "kill program" \ > + =A0 =A0 =A0 "Kill the program being debugged.*y or n. $" "y" > + > + =A0 =A0# Run until we call factorial with 6 > + > + =A0 =A0gdb_run_cmd > + =A0 =A0if [gdb_test "" \ > + =A0 =A0 =A0 "Break.* factorial .value=3D6. .*" \ > + =A0 =A0 =A0 "run to factorial(6)"] then { gdb_suppress_tests } > + > + =A0 =A0# Continue until we call factorial recursively with 5. > + > + =A0 =A0if [gdb_test "continue" \ > + =A0 =A0 =A0 "Continuing.*Break.* factorial .value=3D5. .*" \ > + =A0 =A0 =A0 "continue to factorial(5)"] then { gdb_suppress_tests } > + > + =A0 =A0# Do a backtrace just to confirm how many levels deep we are. > + > + =A0 =A0if [gdb_test "backtrace" \ > + =A0 =A0 =A0 "#0\[ \t\]+ factorial .value=3D5..*" \ > + =A0 =A0 =A0 "backtrace from factorial(5)"] then { gdb_suppress_tests } > + > + =A0 =A0# Now a "next" should position us at the recursive call, which > + =A0 =A0# we will be performing with 4. > + > + =A0 =A0if [gdb_test "next" \ > + =A0 =A0 =A0 ".* factorial .value - 1.;.*" \ > + =A0 =A0 =A0 "next to recursive call"] then { gdb_suppress_tests } > + > + =A0 =A0# Disable the breakpoint at the entry to factorial by deleting t= hem all. > + =A0 =A0# The "next" should run until we return to the next line from th= is > + =A0 =A0# recursive call to factorial with 4. > + =A0 =A0# Buggy versions of gdb will stop instead at the innermost frame= on > + =A0 =A0# the line where we are trying to "next" to. > + > + =A0 =A0delete_breakpoints > + > + =A0 =A0if [istarget "mips*tx39-*"] { > + =A0 =A0 =A0 set timeout 60 I would do: set oldtimeout $timeout if [istarget ...] { set timeout 60 } and then restore timeout at the end of the function. > + =A0 =A0} > + =A0 =A0# We used to set timeout here for all other targets as well. =A0= This > + =A0 =A0# is almost certainly wrong. =A0The proper timeout depends on the > + =A0 =A0# target system in use, and how we communicate with it, so there > + =A0 =A0# is no single value appropriate for all targets. =A0The timeout > + =A0 =A0# should be established by the Dejagnu config file(s) for the > + =A0 =A0# board, and respected by the test suite. > + =A0 =A0# > + =A0 =A0# For example, if I'm running GDB over an SSH tunnel talking to a > + =A0 =A0# portmaster in California talking to an ancient 68k board runni= ng > + =A0 =A0# a crummy ROM monitor (a situation I can only wish were > + =A0 =A0# hypothetical), then I need a large timeout. =A0But that's not = the > + =A0 =A0# kind of knowledge that belongs in this file. > + > + =A0 =A0gdb_test next "\[0-9\]*\[\t \]+return \\(value\\);.*" \ > + =A0 =A0 =A0 "next over recursive call" > + > + =A0 =A0# OK, we should be back in the same stack frame we started from. > + =A0 =A0# Do a backtrace just to confirm. > + > + =A0 =A0set result [gdb_test "backtrace" \ > + =A0 =A0 =A0 "#0\[ \t\]+ factorial .value=3D120.*\r\n#1\[ \t\]+ \[0-9a-f= x\]+ in factorial .value=3D6..*" \ > + =A0 =A0 =A0 "backtrace from factorial(5.1)"] > + =A0 =A0if { $result !=3D 0 } { gdb_suppress_tests } > + > + =A0 =A0if [target_info exists gdb,noresults] { gdb_suppress_tests } > + =A0 =A0gdb_continue_to_end "recursive next test" > + =A0 =A0gdb_stop_suppressing_tests; > +} > + > +test_next_with_recursion > + > + > +#******** > + > +# Build a new file with optimization enabled so that we can try breakpoi= nts > +# on targets with optimized prologues. > + > +if { [prepare_for_testing hbreak2.exp "breako2" {break.c break1.c} {debu= g nowarnings optimize=3D-O2}] } { > + =A0 =A0return -1 > +} > + > +if ![runto_main] then { fail "break tests suppressed" } > +delete_breakpoints > + > +# > +# Test break at function. > +# > +gdb_test "hbreak main" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*, line.*" \ > + =A0 =A0"hardware breakpoint function, optimized file" > + > +# > +# Run until the breakpoint at main is hit. =A0For non-stubs-using target= s. > +# > +gdb_run_cmd > +gdb_test_multiple "" "run until hardware function breakpoint, optimized = file" { > + =A0 =A0-re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp= _location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" { > + =A0 =A0 =A0 pass "run until hardware function breakpoint, optimized fil= e" > + =A0 =A0} > + =A0 =A0-re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt = $" { > + =A0 =A0 =A0 pass "run until hardware function breakpoint, optimized fil= e (code motion)" > + =A0 =A0} > +} > +delete_breakpoints > + > +# > +# Test break at function. > +# > +gdb_test "hbreak marker4" \ > + =A0 =A0"Hardware assisted breakpoint.*at.* file .*$srcfile1, line.*" \ > + =A0 =A0"hardware breakpoint small function, optimized file" > + > +# > +# Run until the breakpoint at a small function. > +# > + > +# > +# Add a second pass pattern. =A0The behavior differs here between stabs > +# and dwarf for one-line functions. =A0Stabs preserves two line symbols > +# (one before the prologue and one after) with the same line number, > +# but dwarf regards these as duplicates and discards one of them. > +# Therefore the address after the prologue (where the breakpoint is) > +# has no exactly matching line symbol, and GDB reports the breakpoint > +# as if it were in the middle of a line rather than at the beginning. > + > +set bp_location13 [gdb_get_line_number "set breakpoint 13 here" $srcfile= 1] > +set bp_location14 [gdb_get_line_number "set breakpoint 14 here" $srcfile= 1] > + > +gdb_test_multiple "continue" \ > + =A0 =A0"run until hardware breakpoint set at small function, optimized = file" { > + =A0 =A0 =A0 -re "Breakpoint $decimal, marker4 \\(d=3D(d@entry=3D)?17760= 1976\\) at .*$srcfile1:$bp_location13\[\r\n\]+$bp_location13\[\t \]+void ma= rker4.*" { > + =A0 =A0 =A0 =A0 =A0 pass "run until hardware breakpoint set at small fu= nction, optimized file" > + =A0 =A0 =A0 } > + =A0 =A0 =A0 -re "Breakpoint $decimal, $hex in marker4 \\(d=3D(d@entry= =3D)?177601976\\) at .*$srcfile1:$bp_location13\[\r\n\]+$bp_location13\[\t = \]+void marker4.*" { > + =A0 =A0 =A0 =A0 =A0 pass "run until hardware breakpoint set at small fu= nction, optimized file" > + =A0 =A0 =A0 } > + =A0 =A0 =A0 -re "Breakpoint $decimal, marker4 \\(d=3D(d@entry=3D)?17760= 1976\\) at .*$srcfile1:$bp_location14\[\r\n\]+$bp_location14\[\t \]+void ma= rker4.*" { > + =A0 =A0 =A0 =A0 =A0 # marker4() is defined at line 46 when compiled wit= h -DPROTOTYPES > + =A0 =A0 =A0 =A0 =A0 pass "run until hardware breakpoint set at small fu= nction, optimized file (line bp_location14)" > + =A0 =A0 =A0 } > + =A0 =A0 =A0 -re "Breakpoint $decimal, factorial \\(.*\\) .*\{\r\n$gdb_p= rompt" { > + =A0 =A0 =A0 =A0 =A0 # GCC 4.3 emits bad line number information - see g= cc/36748. > + =A0 =A0 =A0 =A0 =A0 if { [test_compiler_info "gcc-4-3-*"] } { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 setup_xfail *-*-* > + =A0 =A0 =A0 =A0 =A0 } > + =A0 =A0 =A0 =A0 =A0 fail "run until hardware breakpoint set at small fu= nction, optimized file" > + =A0 =A0 =A0 } > +} > + > + > +# Reset the default arguments for VxWorks > +if [istarget "*-*-vxworks*"] { > + =A0 =A0set timeout 10 > + =A0 =A0verbose "Timeout is now $timeout seconds" 2 Timeout restoration is no longer needed at the end of a file. I would delete these lines. > + =A0 =A0gdb_test_no_output "set args main" > +} >