From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3249 invoked by alias); 13 Dec 2007 14:44:24 -0000 Received: (qmail 3233 invoked by uid 22791); 13 Dec 2007 14:44:21 -0000 X-Spam-Check-By: sourceware.org Received: from main.gmane.org (HELO ciao.gmane.org) (80.91.229.2) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 13 Dec 2007 14:44:12 +0000 Received: from list by ciao.gmane.org with local (Exim 4.43) id 1J2pHg-0003Pu-AG for gdb-patches@sources.redhat.com; Thu, 13 Dec 2007 14:43:32 +0000 Received: from 77.246.241.246 ([77.246.241.246]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 13 Dec 2007 14:43:32 +0000 Received: from ghost by 77.246.241.246 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 13 Dec 2007 14:43:32 +0000 To: gdb-patches@sources.redhat.com From: Vladimir Prus Subject: Re: Pending breakpoints in MI Date: Thu, 13 Dec 2007 16:03:00 -0000 Message-ID: References: <200711081412.14452.ghost@cs.msu.su> <20071213135259.GA10040@adacore.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="nextPart1505609.M7qMaC2TPu" Content-Transfer-Encoding: 7Bit User-Agent: KNode/0.10.4 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: 2007-12/txt/msg00172.txt.bz2 --nextPart1505609.M7qMaC2TPu Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8Bit Content-length: 3089 Joel Brobecker wrote: > Volodya, > > You forgot to provide a ChangeLog... Oops, sorry. Attached now -- there are three ChangeLog files affected, and I provide bits for each. >> gdb_breakpoint (char *address, char *condition, >> int hardwareflag, int tempflag, >> int thread, int ignore_count, >> + int pending, >> char **error_message) > > I can't believe I'm saying this, since I absolutely hate tabs, but > these are the coding rules: You need to use a tab instead of 8 spaces > in the line above. Compare for instance how the "char **error_message" > line is indented. It appears I've failed to re-configure Emacs properly after rearranging my local environment. I've fixed all instances now (and one function which got space indenting in the previous patch). >> --- gdb/testsuite/gdb.mi/mi-pending.exp >> (/patches/pending_mi_2_code_duplication) (revision 45) >> +++ gdb/testsuite/gdb.mi/mi-pending.exp >> (/patches/pending_mi_3_breakpoints) (revision 45) @@ -0,0 +1,75 @@ >> +# Copyright 2003, 2004, 2005, 2007 Free Software Foundation, Inc. > > Shouldn't the copyright year be only 2007? Yes, right. >> --- gdb/mi/mi-cmd-break.c (/patches/pending_mi_2_code_duplication) >> (revision 45) >> +++ gdb/mi/mi-cmd-break.c (/patches/pending_mi_3_breakpoints) (revision >> 45) @@ -63,7 +63,10 @@ enum bp_type >> breakpoint. -break-insert -t -h --> insert a temporary >> hw bp. >> -break-insert -r --> insert a bp at functions matching >> - */ >> + >> + >> + The -f flag makes GDB create a pending breakpoint if no >> + locations for breakpoint are found now. */ > > Actually, I think that the entire comment needs to be rewritten > in a way that the syntax is not described there at all. Just say > that this function implements the -break-insert command which, as > its name suggests, inserts a breakpoint. The syntax needs to be > documented in the GDB manual. See > http://www.sourceware.org/gdb/current/onlinedocs/gdb_25.html#SEC259 > for what is currently documented. Let's use this opportunity to > make sure that every option (and only the supported options) are > documented. I've done so. Eli, does the manual changes in the attached patch look good to you? Thanks a lot for the review! Revised patch attached, is it OK? - Volodya gdb/ Add support for pending breakpoints in MI. * gdb.h (gdb_breakpoint): Add parameter pending. * breakpoint.c (break_command_1): Fix formatting. (gdb_breakpoint): Add parameter pending. Fix formatting. * mi/mi-cmd-break.c (mi_break_insert): Change comment to refer to manual. Add support for the -f flag, for pending breakpoint. gdb/doc * gdb.texinfo (GDB/MI Breakpoint Commands): Document the -f option for -break-insert, remove -r option, and clarify specification of location. gdb/testsuite * gdb.mi/mi-pending.exp: New. * gdb.mi/mi-pending.c: New. * gdb.mi/mi-pendshr.c: New. --nextPart1505609.M7qMaC2TPu Content-Type: text/x-diff; name="pending_mi_3_breakpoints.diff" Content-Transfer-Encoding: 8Bit Content-Disposition: attachment; filename="pending_mi_3_breakpoints.diff" Content-length: 9934 --- gdb/doc/gdb.texinfo (/patches/pending_mi_2_code_duplication) (revision 49) +++ gdb/doc/gdb.texinfo (/patches/pending_mi_3_breakpoints) (revision 49) @@ -18055,13 +18055,13 @@ N.A. @subsubheading Synopsis @smallexample - -break-insert [ -t ] [ -h ] [ -r ] + -break-insert [ -t ] [ -h ] [ -f ] [ -c @var{condition} ] [ -i @var{ignore-count} ] - [ -p @var{thread} ] [ @var{line} | @var{addr} ] + [ -p @var{thread} ] [ @var{location} ] @end smallexample @noindent -If specified, @var{line}, can be one of: +If specified, @var{location}, can be one of: @itemize @bullet @item function @@ -18084,10 +18084,12 @@ Insert a hardware breakpoint. Make the breakpoint conditional on @var{condition}. @item -i @var{ignore-count} Initialize the @var{ignore-count}. -@item -r -Insert a regular breakpoint in all the functions whose names match the -given regular expression. Other flags are not applicable to regular -expressions. +@item -f +If @var{location} cannot be parsed (for example if it +refers to unknown files or functions), create a pending +breakpoint. Without this flag, @value{GDBN} will report +an error, and won't create a breakpoint, if @var{location} +cannot be parsed. @end table @subsubheading Result --- gdb/breakpoint.c (/patches/pending_mi_2_code_duplication) (revision 49) +++ gdb/breakpoint.c (/patches/pending_mi_3_breakpoints) (revision 49) @@ -5638,9 +5638,9 @@ break_command_1 (char *arg, int flag, in int tempflag = flag & BP_TEMPFLAG; return break_command_really (arg, - NULL, 0, 1 /* parse arg */, - tempflag, hardwareflag, - pending_break_support, from_tty); + NULL, 0, 1 /* parse arg */, + tempflag, hardwareflag, + pending_break_support, from_tty); } @@ -5648,13 +5648,15 @@ enum gdb_rc gdb_breakpoint (char *address, char *condition, int hardwareflag, int tempflag, int thread, int ignore_count, + int pending, char **error_message) { - return break_command_really (address, condition, thread, - 0 /* condition and thread are valid. */, - tempflag, hardwareflag, - AUTO_BOOLEAN_FALSE /* no pending. */, - 0); + return break_command_really (address, condition, thread, + 0 /* condition and thread are valid. */, + tempflag, hardwareflag, + pending + ? AUTO_BOOLEAN_TRUE : AUTO_BOOLEAN_FALSE, + 0); } --- gdb/gdb.h (/patches/pending_mi_2_code_duplication) (revision 49) +++ gdb/gdb.h (/patches/pending_mi_3_breakpoints) (revision 49) @@ -51,6 +51,7 @@ enum gdb_rc gdb_breakpoint_query (struct enum gdb_rc gdb_breakpoint (char *address, char *condition, int hardwareflag, int tempflag, int thread, int ignore_count, + int pending, char **error_message); /* Switch thread and print notification. */ --- gdb/testsuite/gdb.mi/mi-pending.exp (/patches/pending_mi_2_code_duplication) (revision 49) +++ gdb/testsuite/gdb.mi/mi-pending.exp (/patches/pending_mi_3_breakpoints) (revision 49) @@ -0,0 +1,75 @@ +# Copyright 2007 Free Software Foundation, Inc. + +# 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. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib mi-support.exp +set MIFLAGS "-i=mi" + +if $tracelevel then { + strace $tracelevel +} + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +if {[skip_shlib_tests]} { + return 0 +} + +set testfile "mi-pending" +set libfile "mi-pendshr" +set srcfile $testfile.c +set libsrc $srcdir/$subdir/$libfile.c +set binfile $objdir/$subdir/$testfile +set lib_sl $objdir/$subdir/$libfile.sl + +set lib_opts debug +set exec_opts [list debug shlib=$lib_sl] + +if [get_compiler_info ${binfile}] { + return -1 +} + +if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != "" + || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != ""} { + untested "Could not compile either $libsrc or $srcdir/$subdir/$srcfile." + return -1 +} + +# Start with a fresh gdb. + +gdb_exit +mi_gdb_start +mi_gdb_reinitialize_dir $srcdir/$subdir +mi_gdb_load ${binfile} +gdb_load_shlibs $lib_sl + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} + +# Set pending breakpoint via MI +mi_gdb_test "-break-insert -f pendfunc1" \ + ".*\\^done,bkpt=\{number=\"1\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\\(p\\)\",addr=\"\",pending=\"pendfunc1\",times=\"0\"\}"\ + "MI pending breakpoint on pendfunc1" + +mi_run_cmd + +# Make sure we hit breakpoint. +mi_gdb_test "" \ + ".*\\*stopped,reason=\"breakpoint-hit\",bkptno=\"1\".*func=\"pendfunc1\".*" \ + "Run till MI pending breakpoint on pendfunc1" \ No newline at end of file --- gdb/testsuite/gdb.mi/mi-pending.c (/patches/pending_mi_2_code_duplication) (revision 49) +++ gdb/testsuite/gdb.mi/mi-pending.c (/patches/pending_mi_3_breakpoints) (revision 49) @@ -0,0 +1,34 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2007 Free Software Foundation, Inc. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@prep.ai.mit.edu */ + +#include + +int k = 0; + +extern void pendfunc (int x); + +int main() +{ + pendfunc (3); /* break main here */ + pendfunc (4); + k = 1; + pendfunc (3); + return 0; +} --- gdb/testsuite/gdb.mi/mi-pendshr.c (/patches/pending_mi_2_code_duplication) (revision 49) +++ gdb/testsuite/gdb.mi/mi-pendshr.c (/patches/pending_mi_3_breakpoints) (revision 49) @@ -0,0 +1,32 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2007 Free Software Foundation, Inc. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@prep.ai.mit.edu */ + +#include + +void pendfunc1 (int x) +{ + int y = x + 4; + printf ("in pendfunc1, x is %d\n", x); +} + +void pendfunc (int x) +{ + pendfunc1 (x); +} --- gdb/mi/mi-cmd-break.c (/patches/pending_mi_2_code_duplication) (revision 49) +++ gdb/mi/mi-cmd-break.c (/patches/pending_mi_3_breakpoints) (revision 49) @@ -56,14 +56,8 @@ enum bp_type REGEXP_BP }; -/* Insert a breakpoint. The type of breakpoint is specified by the - first argument: -break-insert --> insert a regular - breakpoint. -break-insert -t --> insert a temporary - breakpoint. -break-insert -h --> insert an hardware - breakpoint. -break-insert -t -h --> insert a temporary - hw bp. - -break-insert -r --> insert a bp at functions matching - */ +/* Implements the -break-insert command. + See the MI manual for the list of possible options. */ enum mi_cmd_result mi_cmd_break_insert (char *command, char **argv, int argc) @@ -74,12 +68,13 @@ mi_cmd_break_insert (char *command, char int thread = -1; int ignore_count = 0; char *condition = NULL; + int pending = 0; enum gdb_rc rc; struct gdb_events *old_hooks; enum opt { HARDWARE_OPT, TEMP_OPT /*, REGEXP_OPT */ , CONDITION_OPT, - IGNORE_COUNT_OPT, THREAD_OPT + IGNORE_COUNT_OPT, THREAD_OPT, PENDING_OPT }; static struct mi_opt opts[] = { @@ -88,6 +83,7 @@ mi_cmd_break_insert (char *command, char {"c", CONDITION_OPT, 1}, {"i", IGNORE_COUNT_OPT, 1}, {"p", THREAD_OPT, 1}, + {"f", PENDING_OPT, 0}, { 0, 0, 0 } }; @@ -122,6 +118,9 @@ mi_cmd_break_insert (char *command, char case THREAD_OPT: thread = atol (optarg); break; + case PENDING_OPT: + pending = 1; + break; } } @@ -139,12 +138,14 @@ mi_cmd_break_insert (char *command, char rc = gdb_breakpoint (address, condition, 0 /*hardwareflag */ , temp_p, thread, ignore_count, + pending, &mi_error_message); break; case HW_BP: rc = gdb_breakpoint (address, condition, 1 /*hardwareflag */ , temp_p, thread, ignore_count, + pending, &mi_error_message); break; #if 0 --nextPart1505609.M7qMaC2TPu--