Fix PR 17206
authorYao Qi <yao@codesourcery.com>
Mon, 28 Jul 2014 05:44:57 +0000 (13:44 +0800)
committerYao Qi <yao@codesourcery.com>
Tue, 29 Jul 2014 03:59:32 +0000 (11:59 +0800)
As reported in PR 17206, an internal error is triggered when command
until is executed.  In infcmd.c:until_next_command, step_range_end is
set to 'pc',

  if (!func)
    {
      struct bound_minimal_symbol msymbol = lookup_minimal_symbol_by_pc (pc);

      if (msymbol.minsym == NULL)
error (_("Execution is not within a known function."));

      tp->control.step_range_start = BMSYMBOL_VALUE_ADDRESS (msymbol);
      tp->control.step_range_end = pc;
    }

and later in infrun.c:resume, the assert below is triggered in PR
17206.

  if (tp->control.may_range_step)
    {
      /* If we're resuming a thread with the PC out of the step
 range, then we're doing some nested/finer run control
 operation, like stepping the thread out of the dynamic
 linker or the displaced stepping scratch pad.  We
 shouldn't have allowed a range step then.  */
      gdb_assert (pc_in_thread_step_range (pc, tp));
    }

In until_next_command, we set step range to [XXX, pc), so pc isn't
within the range.  pc_in_thread_step_range returns false and the
assert is triggered.  AFAICS, the range we want in until_next_command
is [XXX, pc] instead of [XXX, pc), because we want to program step
until greater than pc.  This patch is to set step_range_end to
'pc + 1'.  Running until-nodebug.exp with unpatched GDB will get the
following fail,

FAIL: gdb.base/until-nodebug.exp: until 2 (GDB internal error)

and the fail goes away when the fix is applied.

gdb:

2014-07-29  Yao Qi  <yao@codesourcery.com>

PR gdb/17206
* infcmd.c (until_next_command): Set step_range_end to PC + 1.

gdb/testsuite:

2014-07-29  Yao Qi  <yao@codesourcery.com>

PR gdb/17206
* gdb.base/until-nodebug.exp: New.

gdb/ChangeLog
gdb/infcmd.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/until-nodebug.exp [new file with mode: 0644]

index 0e47fbcb39a03be41f48b47d26d7f02a39849433..ae8a1013666e2da758b1a3ec10397f37f52cb911 100644 (file)
@@ -1,3 +1,8 @@
+2014-07-29  Yao Qi  <yao@codesourcery.com>
+
+       PR gdb/17206
+       * infcmd.c (until_next_command): Set step_range_end to PC + 1.
+
 2014-07-28  Doug Evans  <xdje42@gmail.com>
 
        PR guile/17203
index 5eb092b804f00aab13199fce680b1e26e1f7e177..d84c591865ecf6aa2bf687ade79c629898a4ecb4 100644 (file)
@@ -1359,7 +1359,9 @@ until_next_command (int from_tty)
        error (_("Execution is not within a known function."));
 
       tp->control.step_range_start = BMSYMBOL_VALUE_ADDRESS (msymbol);
-      tp->control.step_range_end = pc;
+      /* The upper-bound of step_range is exclusive.  In order to make PC
+        within the range, set the step_range_end with PC + 1.  */
+      tp->control.step_range_end = pc + 1;
     }
   else
     {
index e65e76a044f8a5a757861259740360d122846080..a90ee8b4b725a49345150a8e716a3ead2b2a924f 100644 (file)
@@ -1,3 +1,8 @@
+2014-07-29  Yao Qi  <yao@codesourcery.com>
+
+       PR gdb/17206
+       * gdb.base/until-nodebug.exp: New.
+
 2014-07-28  Doug Evans  <xdje42@gmail.com>
 
        PR guile/17203
diff --git a/gdb/testsuite/gdb.base/until-nodebug.exp b/gdb/testsuite/gdb.base/until-nodebug.exp
new file mode 100644 (file)
index 0000000..a7e75e2
--- /dev/null
@@ -0,0 +1,37 @@
+# Copyright 2014 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 <http://www.gnu.org/licenses/>.  */
+
+# Test that the address range for stepping is correctly set in command
+# until when there is no debug information.
+
+standard_testfile advance.c
+
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile nodebug]} {
+    return -1
+}
+
+if ![runto_main] {
+    fail "Can't run to main"
+    return 0
+}
+
+# Without debug information, the program stops at the next
+# instruction, which is still in main.
+gdb_test "until" "in main .*" "until 1"
+
+# If the stepping range is correctly set, the program stops at the next
+# instruction.  Otherwise, an internal error will be triggered.  See
+# PR gdb/17206.
+gdb_test "until" "in main .*" "until 2"