This is the mail archive of the mailing list for the GDB project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] Fix breakpoint at *_start


(gdb) b *_start
Breakpoint 1 at 0x4002c0
(gdb) r
Starting program:
Program exited normally.
(gdb) _

Goal of the patch is to prevent setting proceed's ONEPROC.

In some way it makes sense what GDB has been doing so far - program was being
executed by /bin/sh and now it just stopped at address _start.  GDB logic says
it should ignore breakpoints right at the PC address during "continue".

No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.

Bugreport has been kept updated by the courtesy of John Reiser since 2005.


2010-04-04  Jan Kratochvil  <>

	* infcmd.c (run_command_1): Call proceed with regcache_read_pc address.
	* config/djgpp/fnchange.lst: Add translation for break-static-entry.exp.

2010-04-04  Jan Kratochvil  <>

	* gdb.base/break-static-entry.exp: New.

--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -580,8 +580,9 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main)
      has done its thing; now we are setting up the running program.  */
   post_create_inferior (&current_target, 0);
-  /* Start the target running.  */
-  proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
+  /* Start the target running.  Do not use -1 continuation as it would skip
+     breakpoint right at the entry point.  */
+  proceed (regcache_read_pc (get_current_regcache ()), TARGET_SIGNAL_0, 0);
   /* Since there was no error, there's no need to finish the thread
      states here.  */
--- a/gdb/config/djgpp/fnchange.lst
+++ b/gdb/config/djgpp/fnchange.lst
@@ -371,6 +371,7 @@
 @V@/gdb/testsuite/gdb.arch/powerpc-prologue.exp @V@/gdb/testsuite/gdb.arch/ppc-prologue.exp
 @V@/gdb/testsuite/gdb.base/bitfields2.c @V@/gdb/testsuite/gdb.base/bitfiel2.c
 @V@/gdb/testsuite/gdb.base/bitfields2.exp @V@/gdb/testsuite/gdb.base/bitfiel2.exp
+@V@/gdb/testsuite/gdb.base/break-static-entry.exp @V@/gdb/testsuite/gdb.base/brksentr.exp
 @V@/gdb/testsuite/gdb.base/coremaker2.c @V@/gdb/testsuite/gdb.base/core2maker.c
 @V@/gdb/testsuite/gdb.base/hashline1.exp @V@/gdb/testsuite/gdb.base/hash1line.exp
 @V@/gdb/testsuite/gdb.base/hashline2.exp @V@/gdb/testsuite/gdb.base/hash2line.exp
--- /dev/null
+++ b/gdb/testsuite/gdb.base/break-static-entry.exp
@@ -0,0 +1,43 @@
+# Copyright (C) 2010 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
+# 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 <>.
+# Test inferior can stop at its very first instruction, usually "_start".
+# Dynamic executables have first instruction in
+set testfile break-static-entry
+if { [prepare_for_testing ${testfile}.exp ${testfile} start.c {additional_flags=-static}] } {
+    return -1
+set test "info files"
+set entry ""
+gdb_test_multiple $test $test {
+    -re "\r\n\[\t \]*Entry point:\[\t \]*(0x\[0-9a-f\]+)\r\n.*$gdb_prompt $" {
+	set entry $expect_out(1,string)
+	pass $test
+    }
+if {$entry == ""} {
+    untested ${testfile}.exp
+    return
+if ![runto "*$entry"] {
+    return
+gdb_test {p/x $pc} " = $entry"
+gdb_breakpoint "main"
+gdb_continue_to_breakpoint "main" "main.*"

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]