From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15050 invoked by alias); 18 Sep 2012 00:40:35 -0000 Received: (qmail 15040 invoked by uid 22791); 18 Sep 2012 00:40:33 -0000 X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL,BAYES_00,RCVD_IN_HOSTKARMA_NO,RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 18 Sep 2012 00:40:17 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 51C171C6DBF; Mon, 17 Sep 2012 20:40:16 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id I7aBZV4IFAxe; Mon, 17 Sep 2012 20:40:16 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 121911C6C83; Mon, 17 Sep 2012 20:40:16 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id CA357C85BA; Mon, 17 Sep 2012 17:40:13 -0700 (PDT) From: Joel Brobecker To: gdb-patches@sourceware.org Cc: Joel Brobecker Subject: [RFA] wrong language used when re-setting breakpoint Date: Tue, 18 Sep 2012 00:40:00 -0000 Message-Id: <1347928803-15526-1-git-send-email-brobecker@adacore.com> 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: 2012-09/txt/msg00335.txt.bz2 The debugger sometimes fails to re-set a breakpoint as follow, causing it to become disabled: (gdb) b nested_sub Breakpoint 1 at 0x401cec: file foo.adb, line 7. (gdb) b do_nothing Breakpoint 2 at 0x401cdc: file pck.adb, line 4. (gdb) run Starting program: /[...]/foo Error in re-setting breakpoint 1: Function "nested_sub" not defined. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Breakpoint 2, pck.do_nothing () at pck.adb:4 4 null; This only happens on machines where the debug-file-directory is a valid directory name. The reason behind the error is that the linespec code that re-sets the breakpoints uses the current_language global when iterating over a symtab's symbols. However, the that global gets switched from Ada to C during the startup phase, probably as a side-effect of stopping in some system code for which debugging info is available. The fix is to make sure that we use the correct language. gdb/ChangeLog: * linespec.c (iterate_over_all_matching_symtabs): Use the correct language when iterating over symbols. gdb/testsuite/ChangeLog: * gdb.ada/bp_reset: New testcase. Tested on x86_64-linux, no regression. OK to commit? Thank you, -- Joel --- gdb/linespec.c | 7 +++--- gdb/testsuite/gdb.ada/bp_reset.exp | 37 ++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.ada/bp_reset/foo.adb | 27 +++++++++++++++++++++++ gdb/testsuite/gdb.ada/bp_reset/io.adb | 21 ++++++++++++++++++ gdb/testsuite/gdb.ada/bp_reset/io.ads | 18 ++++++++++++++++ gdb/testsuite/gdb.ada/bp_reset/pck.adb | 21 ++++++++++++++++++ gdb/testsuite/gdb.ada/bp_reset/pck.ads | 18 ++++++++++++++++ 7 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 gdb/testsuite/gdb.ada/bp_reset.exp create mode 100644 gdb/testsuite/gdb.ada/bp_reset/foo.adb create mode 100644 gdb/testsuite/gdb.ada/bp_reset/io.adb create mode 100644 gdb/testsuite/gdb.ada/bp_reset/io.ads create mode 100644 gdb/testsuite/gdb.ada/bp_reset/pck.adb create mode 100644 gdb/testsuite/gdb.ada/bp_reset/pck.ads diff --git a/gdb/linespec.c b/gdb/linespec.c index 86239c9..f7ff54e 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1010,7 +1010,8 @@ iterate_over_all_matching_symtabs (struct linespec_state *state, struct block *block; block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), STATIC_BLOCK); - LA_ITERATE_OVER_SYMBOLS (block, name, domain, callback, data); + state->language->la_iterate_over_symbols (block, name, domain, + callback, data); if (include_inline) { @@ -1021,8 +1022,8 @@ iterate_over_all_matching_symtabs (struct linespec_state *state, i < BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (symtab)); i++) { block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), i); - LA_ITERATE_OVER_SYMBOLS (block, name, domain, - iterate_inline_only, &cad); + state->language->la_iterate_over_symbols + (block, name, domain, iterate_inline_only, &cad); } } } diff --git a/gdb/testsuite/gdb.ada/bp_reset.exp b/gdb/testsuite/gdb.ada/bp_reset.exp new file mode 100644 index 0000000..aff3341 --- /dev/null +++ b/gdb/testsuite/gdb.ada/bp_reset.exp @@ -0,0 +1,37 @@ +# Copyright 2012 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 "ada.exp" + +standard_ada_testfile foo + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } { + return -1 +} + +clean_restart ${testfile} + +gdb_test "break nested_sub" \ + "Breakpoint $decimal at $hex: file .*foo.adb, line $decimal\\." + +gdb_test "break do_nothing" \ + "Breakpoint $decimal at $hex: file .*pck.adb, line $decimal\\." + +# Run the program. Make sure the program runs until it hits +# the first breakpoint inside nested_sub. + +gdb_run_cmd +gdb_test "" "Breakpoint $decimal, foo\\.nested_sub \\(\\).*" + diff --git a/gdb/testsuite/gdb.ada/bp_reset/foo.adb b/gdb/testsuite/gdb.ada/bp_reset/foo.adb new file mode 100644 index 0000000..27298f4 --- /dev/null +++ b/gdb/testsuite/gdb.ada/bp_reset/foo.adb @@ -0,0 +1,27 @@ +-- Copyright 2012 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 . + +with Pck; use Pck; +with IO; use IO; + +procedure Foo is + procedure Nested_Sub is + begin + Put_Line ("Some string"); + end Nested_Sub; +begin + Nested_Sub; + Do_Nothing; +end Foo; diff --git a/gdb/testsuite/gdb.ada/bp_reset/io.adb b/gdb/testsuite/gdb.ada/bp_reset/io.adb new file mode 100644 index 0000000..ea7306e --- /dev/null +++ b/gdb/testsuite/gdb.ada/bp_reset/io.adb @@ -0,0 +1,21 @@ +-- Copyright 2012 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 . + +package body IO is + procedure Put_Line (S : String) is + begin + null; + end Put_Line; +end IO; diff --git a/gdb/testsuite/gdb.ada/bp_reset/io.ads b/gdb/testsuite/gdb.ada/bp_reset/io.ads new file mode 100644 index 0000000..65772db --- /dev/null +++ b/gdb/testsuite/gdb.ada/bp_reset/io.ads @@ -0,0 +1,18 @@ +-- Copyright 2012 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 . + +package IO is + procedure Put_Line (S : String); +end IO; diff --git a/gdb/testsuite/gdb.ada/bp_reset/pck.adb b/gdb/testsuite/gdb.ada/bp_reset/pck.adb new file mode 100644 index 0000000..ea1d233 --- /dev/null +++ b/gdb/testsuite/gdb.ada/bp_reset/pck.adb @@ -0,0 +1,21 @@ +-- Copyright 2012 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 . + +package body Pck is + procedure Do_Nothing is + begin + null; + end Do_Nothing; +end Pck; diff --git a/gdb/testsuite/gdb.ada/bp_reset/pck.ads b/gdb/testsuite/gdb.ada/bp_reset/pck.ads new file mode 100644 index 0000000..c8f9ec9 --- /dev/null +++ b/gdb/testsuite/gdb.ada/bp_reset/pck.ads @@ -0,0 +1,18 @@ +-- Copyright 2012 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 . + +package Pck is + procedure Do_Nothing; +end Pck; -- 1.7.9.5