* [patch] step over permanent breakpoint
@ 2008-08-06 14:12 Aleksandar Ristovski
2008-08-18 11:08 ` Joel Brobecker
0 siblings, 1 reply; 7+ messages in thread
From: Aleksandar Ristovski @ 2008-08-06 14:12 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 355 bytes --]
Hello,
I encountered a problem when setting a breakpoint over a permanent breakpoint. GDB did not handle this situation correctly.
The attached test demonstrates the problem, and the patch fixes it for i386 architecture.
For other architectures, skip_permanent_breakpoint needs to be implemented.
Thanks,
Aleksandar Ristovski
QNX Software Systems
[-- Attachment #2: i386_permanent_breakpoints-20080805.diff.ChangeLog --]
[-- Type: text/plain, Size: 466 bytes --]
2008-08-05 Aleksandar Ristovski <aristovski@qnx.com>
* breakpoint.c (breakpoint_init_inferior): Mark as not inserted only
non-permanent breakpoints.
(create_breakpoint): Check if the location points to a permanent
breakpoint.
(update_breakpoint_locations): Make sure new locations of permanent
breakpoints are properly initialized.
* i386-tdep.c (i386_skip_permanent_breakpoint): New function.
(i386_gdbarch_init): Set gdbarch_skip_permanent_breakpoint.
[-- Attachment #3: i386_permanent_breakpoints-20080805.diff --]
[-- Type: text/plain, Size: 3016 bytes --]
Index: gdb/breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.338
diff -u -p -r1.338 breakpoint.c
--- gdb/breakpoint.c 28 Jul 2008 17:53:52 -0000 1.338
+++ gdb/breakpoint.c 5 Aug 2008 20:32:55 -0000
@@ -1720,7 +1720,10 @@ breakpoint_init_inferior (enum inf_conte
struct bp_location *bpt;
ALL_BP_LOCATIONS (bpt)
- bpt->inserted = 0;
+ {
+ if (bpt->owner->enable_state != bp_permanent)
+ bpt->inserted = 0;
+ }
ALL_BREAKPOINTS_SAFE (b, temp)
{
@@ -3058,7 +3061,8 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
/* We will stop here */
if (b->disposition == disp_disable)
{
- b->enable_state = bp_disabled;
+ if (b->enable_state != bp_permanent)
+ b->enable_state = bp_disabled;
update_global_location_list (0);
}
if (b->silent)
@@ -5100,6 +5104,22 @@ create_breakpoint (struct symtabs_and_li
loc = add_location_to_breakpoint (b, type, &sal);
}
+ /* Check if the location points to permanent breakpoint. */
+ if (loc != NULL)
+ {
+ int len;
+ CORE_ADDR addr = loc->address;
+ const gdb_byte *brk = gdbarch_breakpoint_from_pc (current_gdbarch,
+ &addr, &len);
+ gdb_byte target_mem[32];
+ if (!target_read_memory (loc->address, target_mem, len))
+ {
+ /* We have the target memory here. */
+ if (memcmp (target_mem, brk, len) == 0)
+ make_breakpoint_permanent (b);
+ }
+ }
+
if (b->cond_string)
{
char *arg = b->cond_string;
@@ -7437,6 +7457,10 @@ update_breakpoint_locations (struct brea
b->line_number = sals.sals[i].line;
}
+ /* Update locationos of permanent breakpoints. */
+ if (b->enable_state == bp_permanent)
+ make_breakpoint_permanent (b);
+
/* If possible, carry over 'disable' status from existing breakpoints. */
{
struct bp_location *e = existing_locations;
Index: gdb/i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.261
diff -u -p -r1.261 i386-tdep.c
--- gdb/i386-tdep.c 3 Jul 2008 00:19:58 -0000 1.261
+++ gdb/i386-tdep.c 5 Aug 2008 20:32:55 -0000
@@ -2550,6 +2550,17 @@ i386_fetch_pointer_argument (struct fram
return read_memory_unsigned_integer (sp + (4 * (argi + 1)), 4);
}
+/* On i386, breakpoint is exactly 1 byte long, so we just
+ adjust the PC in the regcache. */
+static void
+i386_skip_permanent_breakpoint (struct regcache *regcache)
+{
+ CORE_ADDR current_pc = regcache_read_pc (regcache);
+ current_pc += 1;
+ regcache_write_pc (regcache, current_pc);
+}
+
+
\f
static struct gdbarch *
i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
@@ -2738,6 +2749,9 @@ i386_gdbarch_init (struct gdbarch_info i
if (tdep->mm0_regnum == 0)
tdep->mm0_regnum = gdbarch_num_regs (gdbarch);
+ set_gdbarch_skip_permanent_breakpoint (gdbarch,
+ i386_skip_permanent_breakpoint);
+
return gdbarch;
}
[-- Attachment #4: i386-bp_permanent.exp.ChangeLog --]
[-- Type: text/plain, Size: 93 bytes --]
2008-08-05 Aleksandar Ristovski <aristovski@qnx.com>
* i386-bp_permanent.exp: New test.
[-- Attachment #5: i386-bp_permanent.exp --]
[-- Type: text/plain, Size: 3183 bytes --]
# Copyright (C) 2003, 2004, 2006, 2007, 2008 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/>.
# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org
# This file is part of the gdb testsuite.
if $tracelevel {
strace $tracelevel
}
# Test i386 prologue analyzer.
set prms_id 0
set bug_id 0
if ![istarget "i?86-*-*"] then {
verbose "Skipping i386 prologue tests."
return
}
set testfile "i386-prologue"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
# some targets have leading underscores on assembly symbols.
# TODO: detect this automatically
set additional_flags ""
if [istarget "i?86-*-cygwin*"] then {
set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\""
}
# Don't use "debug", so that we don't have line information for the assembly
# fragments.
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list $additional_flags]] != "" } {
untested i386-prologue.exp
return -1
}
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
#
# Run to `main' where we begin our tests.
#
if ![runto_main] then {
gdb_suppress_tests
}
# Testcase for standard prologue.
send_gdb "disassemble standard\n";
gdb_expect 60 {
-re ".*($hex) <standard\\+0>.*($hex) <standard\\+4>.*($hex) <standard\\+5>.*($hex) <standard\\+6>.*" {
set standard_start $expect_out(1,string);
set address $expect_out(2,string);
set address1 $expect_out(3,string);
set address2 $expect_out(4,string);
}
default {
send_user "Oops, can't find address\n"
gdb_supress_tests
}
}
gdb_breakpoint "*$standard_start"
gdb_breakpoint "*$address"
gdb_test "continue" "Breakpoint .*, $standard_start in standard.*" \
"Stop at the standard start breakpoint (fetching esp)."
# We want to fetch esp at the start of 'standard' function to make sure
# skip_permanent_breakpoint implementation really skips only the perm.
# breakpoint. If, for whatever reason, 'leave' instruction doesn't get
# executed, esp will not have this value.
send_gdb "print \$esp\n"
gdb_expect 60 {
-re ".1.*($hex).*" {
set start_esp $expect_out(1,string);
}
default {
gdb_fail "Fetching esp failed."
}
}
gdb_test "continue" "Breakpoint .*, $address in standard.*" \
"Stop at permanent breakpoint."
gdb_test "stepi" "$address1|$address2 in standard.*" \
"Single stepping past permanent breakpoint."
gdb_test "print \$esp" ".*$start_esp.*" \
"ESP value does not match - step_permanent_breakpoint wrong."
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [patch] step over permanent breakpoint
2008-08-06 14:12 [patch] step over permanent breakpoint Aleksandar Ristovski
@ 2008-08-18 11:08 ` Joel Brobecker
2008-08-19 15:39 ` Aleksandar Ristovski
0 siblings, 1 reply; 7+ messages in thread
From: Joel Brobecker @ 2008-08-18 11:08 UTC (permalink / raw)
To: Aleksandar Ristovski; +Cc: gdb-patches
> 2008-08-05 Aleksandar Ristovski <aristovski@qnx.com>
>
> * breakpoint.c (breakpoint_init_inferior): Mark as not inserted only
> non-permanent breakpoints.
> (create_breakpoint): Check if the location points to a permanent
> breakpoint.
> (update_breakpoint_locations): Make sure new locations of permanent
> breakpoints are properly initialized.
> * i386-tdep.c (i386_skip_permanent_breakpoint): New function.
> (i386_gdbarch_init): Set gdbarch_skip_permanent_breakpoint.
Overall, this looks reasonable. I have a few comments, though. See below.
BTW: I just approved a patch for HP/UX that also deals with permanent
breakpoints. But fortunately, they don't seem to collide at all. See:
http://www.sourceware.org/ml/gdb-patches/2008-08/msg00466.html.
> ALL_BP_LOCATIONS (bpt)
> - bpt->inserted = 0;
> + {
> + if (bpt->owner->enable_state != bp_permanent)
> + bpt->inserted = 0;
> + }
I think the usual style is to avoid the curly braces in this case:
ALL_BP_LOCATIONS (bpt)
if (bpt->owner->enable_state != bp_permanent)
bpt->inserted = 0;
> + /* Check if the location points to permanent breakpoint. */
> + if (loc != NULL)
Can loc actually be NULL? It looks like it is always initialized
in the code above...
> + {
> + int len;
> + CORE_ADDR addr = loc->address;
> + const gdb_byte *brk = gdbarch_breakpoint_from_pc (current_gdbarch,
> + &addr, &len);
> + gdb_byte target_mem[32];
> + if (!target_read_memory (loc->address, target_mem, len))
I would prefer if you compared against zero rather than checking
the result of !target_read_memory - intuitively, it looks as if
the read was not succesful (I did notice that others did the same
before).
> + {
> + /* We have the target memory here. */
I think the comment will be useless once you change the way you check
the result of target_read_memory above.
> +/* On i386, breakpoint is exactly 1 byte long, so we just
> + adjust the PC in the regcache. */
I think this comment should be moved inside the function body.
If you add a comment at the beginning of a function, it's best to
describe WHAT the function does without going into the implementation
details. For instance:
/* Assuming that the PC points to a breakpoint instruction, update it
to point to the instruction following it. */
For functions implementing gdbarch methods whose name also match
the name of that method, comments do not always bring much value,
since they just repeat the comment associated to that method.
Bottom-line: Just move your comment inside the function :).
> 2008-08-05 Aleksandar Ristovski <aristovski@qnx.com>
>
> * i386-bp_permanent.exp: New test.
You're missing part of the path to the testcase. Since the ChangeLog
is inside gdb/testsuite whereas your testcase lives in
gdb/testsuite/gdb.arch, the above should be:
* gdb.arch/i386-bp_permanent.exp: New test.
> # Copyright (C) 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
Should only be (c) 2008.
> # Please email any bugs, comments, and/or additions to this file to:
> # bug-gdb@gnu.org
Please remove this part from the header. IIRC, we removed all
references to this email address.
> # Test i386 prologue analyzer.
Copy/paste error? We're not testing the prologue analyzer as far as
I can tell, but rather the ability to step past a permanent
breakpoint...
> if ![istarget "i?86-*-*"] then {
> verbose "Skipping i386 prologue tests."
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Needs to be fixed as well.
> if ![runto_main] then {
> gdb_suppress_tests
We're trying to get rid of this. Do a "return -1" instead.
> # Testcase for standard prologue.
Copy/paste error again...
> send_gdb "disassemble standard\n";
> gdb_expect 60 {
> -re ".*($hex) <standard\\+0>.*($hex) <standard\\+4>.*($hex) <standard\\+5>.*($hex) <standard\\+6>.*" {
> set standard_start $expect_out(1,string);
> set address $expect_out(2,string);
> set address1 $expect_out(3,string);
> set address2 $expect_out(4,string);
> }
> default {
> send_user "Oops, can't find address\n"
> gdb_supress_tests
> }
> }
Is it possible to use gdb_test_multiple, here? This routine is our
standard testing routine when gdb_test is not sufficient, and handles
all common error situations.
> # We want to fetch esp at the start of 'standard' function to make sure
> # skip_permanent_breakpoint implementation really skips only the perm.
> # breakpoint. If, for whatever reason, 'leave' instruction doesn't get
> # executed, esp will not have this value.
> send_gdb "print \$esp\n"
> gdb_expect 60 {
> -re ".1.*($hex).*" {
> set start_esp $expect_out(1,string);
> }
> default {
> gdb_fail "Fetching esp failed."
> }
> }
Same here (use gdb_test_multiple).
--
Joel
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [patch] step over permanent breakpoint
2008-08-18 11:08 ` Joel Brobecker
@ 2008-08-19 15:39 ` Aleksandar Ristovski
2008-08-25 16:36 ` Joel Brobecker
0 siblings, 1 reply; 7+ messages in thread
From: Aleksandar Ristovski @ 2008-08-19 15:39 UTC (permalink / raw)
To: Joel Brobecker; +Cc: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 552 bytes --]
Joel Brobecker wrote:
>
> Overall, this looks reasonable. I have a few comments, though. See below.
> BTW: I just approved a patch for HP/UX that also deals with permanent
> breakpoints. But fortunately, they don't seem to collide at all. See:
> http://www.sourceware.org/ml/gdb-patches/2008-08/msg00466.html.
>
I addressed your suggestions; additionally, I moved new code from
create_breakpoint into a new function (bp_loc_permanent). I think that
makes code clear without additional comments.
Thanks,
Aleksandar Ristovski
QNX Software Systems
[-- Attachment #2: i386_permanent_breakpoints-20080819.diff.ChangeLog --]
[-- Type: text/plain, Size: 500 bytes --]
2008-08-19 Aleksandar Ristovski <aristovski@qnx.com>
* breakpoint.c (bp_loc_permanent): New function.
(breakpoint_init_inferior): Mark as not inserted only
non-permanent breakpoints.
(create_breakpoint): Check if the location points to a permanent
breakpoint.
(update_breakpoint_locations): Make sure new locations of permanent
breakpoints are properly initialized.
* i386-tdep.c (i386_skip_permanent_breakpoint): New function.
(i386_gdbarch_init): Set gdbarch_skip_permanent_breakpoint.
[-- Attachment #3: i386_permanent_breakpoints-20080819.diff --]
[-- Type: text/plain, Size: 3573 bytes --]
Index: gdb/breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.343
diff -u -p -r1.343 breakpoint.c
--- gdb/breakpoint.c 17 Aug 2008 16:58:17 -0000 1.343
+++ gdb/breakpoint.c 19 Aug 2008 15:21:47 -0000
@@ -195,6 +195,8 @@ static int is_hardware_watchpoint (struc
static void insert_breakpoint_locations (void);
+static int bp_loc_permanent (struct bp_location *loc);
+
static const char *
bpdisp_text (enum bpdisp disp)
{
@@ -1743,7 +1745,8 @@ breakpoint_init_inferior (enum inf_conte
struct bp_location *bpt;
ALL_BP_LOCATIONS (bpt)
- bpt->inserted = 0;
+ if (bpt->owner->enable_state != bp_permanent)
+ bpt->inserted = 0;
ALL_BREAKPOINTS_SAFE (b, temp)
{
@@ -3081,7 +3084,8 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
/* We will stop here */
if (b->disposition == disp_disable)
{
- b->enable_state = bp_disabled;
+ if (b->enable_state != bp_permanent)
+ b->enable_state = bp_disabled;
update_global_location_list (0);
}
if (b->silent)
@@ -5120,6 +5124,9 @@ create_breakpoint (struct symtabs_and_li
loc = add_location_to_breakpoint (b, type, &sal);
}
+ if (bp_loc_permanent (loc))
+ make_breakpoint_permanent (b);
+
if (b->cond_string)
{
char *arg = b->cond_string;
@@ -7374,6 +7381,10 @@ update_breakpoint_locations (struct brea
b->line_number = sals.sals[i].line;
}
+ /* Update locationos of permanent breakpoints. */
+ if (b->enable_state == bp_permanent)
+ make_breakpoint_permanent (b);
+
/* If possible, carry over 'disable' status from existing breakpoints. */
{
struct bp_location *e = existing_locations;
@@ -8137,6 +8148,30 @@ single_step_breakpoint_inserted_here_p (
return 0;
}
+/* Determine if the location is pointing to a permanent breakpoint. */
+
+static int
+bp_loc_permanent (struct bp_location *loc)
+{
+ const int READ_SUCCESS = 0;
+ int len;
+ CORE_ADDR addr;
+ const gdb_byte *brk;
+ gdb_byte target_mem[32];
+
+ gdb_assert (loc != NULL);
+
+ addr = loc->address;
+ brk = gdbarch_breakpoint_from_pc (current_gdbarch, &addr, &len);
+
+ if (target_read_memory (loc->address, target_mem, len) == READ_SUCCESS
+ && memcmp (target_mem, brk, len) == 0)
+ return 1;
+
+ return 0;
+}
+
+
\f
/* This help string is used for the break, hbreak, tbreak and thbreak commands.
It is defined as a macro to prevent duplication.
Index: gdb/i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.262
diff -u -p -r1.262 i386-tdep.c
--- gdb/i386-tdep.c 9 Aug 2008 16:27:39 -0000 1.262
+++ gdb/i386-tdep.c 19 Aug 2008 15:21:47 -0000
@@ -2624,6 +2624,17 @@ i386_fetch_pointer_argument (struct fram
return read_memory_unsigned_integer (sp + (4 * (argi + 1)), 4);
}
+static void
+i386_skip_permanent_breakpoint (struct regcache *regcache)
+{
+ CORE_ADDR current_pc = regcache_read_pc (regcache);
+ /* On i386, breakpoint is exactly 1 byte long, so we just
+ adjust the PC in the regcache. */
+ current_pc += 1;
+ regcache_write_pc (regcache, current_pc);
+}
+
+
\f
static struct gdbarch *
i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
@@ -2812,6 +2823,9 @@ i386_gdbarch_init (struct gdbarch_info i
if (tdep->mm0_regnum == 0)
tdep->mm0_regnum = gdbarch_num_regs (gdbarch);
+ set_gdbarch_skip_permanent_breakpoint (gdbarch,
+ i386_skip_permanent_breakpoint);
+
return gdbarch;
}
[-- Attachment #4: i386-bp_permanent.exp.20080819.ChangeLog --]
[-- Type: text/plain, Size: 101 bytes --]
2008-08-19 Aleksandar Ristovski <aristovski@qnx.com>
* gdb.arch/i386-bp_permanent.exp: New test.
[-- Attachment #5: i386-bp_permanent.exp --]
[-- Type: text/plain, Size: 3126 bytes --]
# Copyright (C) 2008 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/>.
# This file is part of the gdb testsuite.
if $tracelevel {
strace $tracelevel
}
# Test stepping over permanent breakpoints on i386.
if ![istarget "i?86-*-*"] then {
verbose "Skipping skip over permanent breakpoint on i386 tests."
return
}
set testfile "i386-prologue"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
# some targets have leading underscores on assembly symbols.
# TODO: detect this automatically
set additional_flags ""
if [istarget "i?86-*-cygwin*"] then {
set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\""
}
# Don't use "debug", so that we don't have line information for the assembly
# fragments.
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list $additional_flags]] != "" } {
untested i386-prologue.exp
return -1
}
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
#
# Run to `main' where we begin our tests.
#
if ![runto_main] then {
return -1
}
set pattern_matched 0
set function standard
set retcode [gdb_test_multiple "disassemble $function" "Disassemble function '$function'" {
-re ".*($hex) <$function\\+0>.*($hex) <$function\\+4>.*($hex) <$function\\+5>.*($hex) <$function\\+6>.*" {
set function_start $expect_out(1,string);
set address $expect_out(2,string);
set address1 $expect_out(3,string);
set address2 $expect_out(4,string);
}
}]
if {$retcode != $pattern_matched} {
fail "Disassemble failed, skipping entire test."
return -1
}
gdb_breakpoint "*$function_start"
gdb_breakpoint "*$address"
gdb_test "continue" "Breakpoint .*, $function_start in $function.*" \
"Stop at the '$function' start breakpoint (fetching esp)."
# We want to fetch esp at the start of '$function' function to make sure
# skip_permanent_breakpoint implementation really skips only the perm.
# breakpoint. If, for whatever reason, 'leave' instruction doesn't get
# executed, esp will not have this value.
set start_esp 0
gdb_test_multiple "print \$esp\n" "Fetch esp value." {
-re ".1.*($hex).*" {
set start_esp $expect_out(1,string);
}
}
gdb_test "continue" "Breakpoint .*, $address in $function.*" \
"Stop at permanent breakpoint."
gdb_test "stepi" "$address1|$address2 in $function.*" \
"Single stepping past permanent breakpoint."
gdb_test "print \$esp" ".*$start_esp.*" \
"ESP value does not match - step_permanent_breakpoint wrong."
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [patch] step over permanent breakpoint
2008-08-19 15:39 ` Aleksandar Ristovski
@ 2008-08-25 16:36 ` Joel Brobecker
2008-09-02 15:37 ` Aleksandar Ristovski
0 siblings, 1 reply; 7+ messages in thread
From: Joel Brobecker @ 2008-08-25 16:36 UTC (permalink / raw)
To: Aleksandar Ristovski; +Cc: gdb-patches
> 2008-08-19 Aleksandar Ristovski <aristovski@qnx.com>
>
> * breakpoint.c (bp_loc_permanent): New function.
> (breakpoint_init_inferior): Mark as not inserted only
> non-permanent breakpoints.
> (create_breakpoint): Check if the location points to a permanent
> breakpoint.
> (update_breakpoint_locations): Make sure new locations of permanent
> breakpoints are properly initialized.
> * i386-tdep.c (i386_skip_permanent_breakpoint): New function.
> (i386_gdbarch_init): Set gdbarch_skip_permanent_breakpoint.
We're getting there. Still a few more comments...
> +static int bp_loc_permanent (struct bp_location *loc);
Moving the code to a function is a great idea. I suggest to move
that function just before the function where you use it. That way,
you don't have to add this advance declaration here.
Also I suggest we change the name a bit. For instance:
- bp_loc_is_permanent, or
- permanent_bp_loc
> + /* Update locationos of permanent breakpoints. */
^^^^^^^^^^ locations
> +/* Determine if the location is pointing to a permanent breakpoint. */
The description doesn't explain what the function does if the location
is pointing to a permanent breakpoint. I suggest the following:
/* Return non-zero if LOC is pointing to a permanent breakpoint. */
> +static int
> +bp_loc_permanent (struct bp_location *loc)
> +{
> + const int READ_SUCCESS = 0;
^^^^^^^^^^^^^^^^^^^^^^
Generally speaking, we usually do not use all caps on variables
or constants. In this particular case, if we had felt that a named
constant was bringing something, we should declare it besides
the function where it is used - here, I found this confusing.
Let's just get rid of this constant and compare the result of
target_read_memory against litteral 0.
> + int len;
> + CORE_ADDR addr;
> + const gdb_byte *brk;
> + gdb_byte target_mem[32];
The GNU Coding Standards explicitly warns against the use of arbitrary
sizes. I would be very surprised that any breakpoint instruction be
larger than 32 bytes, but I still hate the idea of this ungarded limit.
Can you allocate the buffer with alloca instead?
> +static void
> +i386_skip_permanent_breakpoint (struct regcache *regcache)
> +{
> + CORE_ADDR current_pc = regcache_read_pc (regcache);
> + /* On i386, breakpoint is exactly 1 byte long, so we just
> + adjust the PC in the regcache. */
Style: We usually add an empty line after the declarations, before
the first statement.
> set pattern_matched 0
> set function standard
>
> set retcode [gdb_test_multiple "disassemble $function" "Disassemble function '$function'" {
> -re ".*($hex) <$function\\+0>.*($hex) <$function\\+4>.*($hex) <$function\\+5>.*($hex) <$function\\+6>.*" {
> set function_start $expect_out(1,string);
> set address $expect_out(2,string);
> set address1 $expect_out(3,string);
> set address2 $expect_out(4,string);
> }
> }]
>
> if {$retcode != $pattern_matched} {
Again, I find the "$pattern_matched" confusing. I'd prefer it if you compared
directly against litteral 0.
> # We want to fetch esp at the start of '$function' function to make sure
> # skip_permanent_breakpoint implementation really skips only the perm.
> # breakpoint. If, for whatever reason, 'leave' instruction doesn't get
^ the 'leave'
> # executed, esp will not have this value.
> set start_esp 0
> gdb_test_multiple "print \$esp\n" "Fetch esp value." {
> -re ".1.*($hex).*" {
I am wondering whether you really need to have the "\n" at the end of
the command, and I'm worried that this might cause an unnecessary repeat
of your command during the test.
Also, I don't completely understand the ".1" part of your regexp. And
the gdb_test_multiple documentation also says that you should include
the final newline and prompt. So I suggest:
-re ".*($hex).*$gdb_prompt $"
--
Joel
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [patch] step over permanent breakpoint
2008-08-25 16:36 ` Joel Brobecker
@ 2008-09-02 15:37 ` Aleksandar Ristovski
2008-09-02 20:54 ` Joel Brobecker
0 siblings, 1 reply; 7+ messages in thread
From: Aleksandar Ristovski @ 2008-09-02 15:37 UTC (permalink / raw)
To: Joel Brobecker; +Cc: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1081 bytes --]
Joel Brobecker wrote:
>
>
> Moving the code to a function is a great idea. I suggest to move
> that function just before the function where you use it. That way,
> you don't have to add this advance declaration here.
Done.
>
> Also I suggest we change the name a bit. For instance:
> - bp_loc_is_permanent, or
^^^^^^^^^^^^^^^^^^^ accepted
> - permanent_bp_loc
>
>
> The description doesn't explain what the function does if the location
> is pointing to a permanent breakpoint. I suggest the following:
>
Done.
> /* Return non-zero if LOC is pointing to a permanent breakpoint. */
>
> Again, I find the "$pattern_matched" confusing. I'd prefer it if you compared
> directly against litteral 0.
Done.
> Also, I don't completely understand the ".1" part of your regexp. And
> the gdb_test_multiple documentation also says that you should include
> the final newline and prompt. So I suggest:
>
> -re ".*($hex).*$gdb_prompt $".
It was a shortcut for "\\\$1".
Changed.
>
>
Attached revised patches.
Thanks,
Aleksandar Ristovski
QNX Software Systems
[-- Attachment #2: i386_permanent_breakpoints-20080902.diff.ChangeLog --]
[-- Type: text/plain, Size: 640 bytes --]
2008-09-02 Aleksandar Ristovski <aristovski@qnx.com>
* breakpoint.c (breakpoint_init_inferior): Mark as not inserted only
non-permanent breakpoints.
(bpstat_stop_status): Change enable_state to bp_disabled only for
non-permanent breakpoints.
(bp_loc_is_permanent): New function.
(create_breakpoint): Check if the location points to a permanent
breakpoint and if it does, make breakpoint permanent.
(update_breakpoint_locations): Make sure new locations of permanent
breakpoints are properly initialized.
* i386-tdep.c (i386_skip_permanent_breakpoint): New function.
(i386_gdbarch_init): Set gdbarch_skip_permanent_breakpoint.
[-- Attachment #3: i386_permanent_breakpoints-20080902.diff --]
[-- Type: text/plain, Size: 3610 bytes --]
Index: gdb/breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.345
diff -u -p -r1.345 breakpoint.c
--- gdb/breakpoint.c 26 Aug 2008 17:36:44 -0000 1.345
+++ gdb/breakpoint.c 2 Sep 2008 15:17:15 -0000
@@ -1750,7 +1750,8 @@ breakpoint_init_inferior (enum inf_conte
struct bp_location *bpt;
ALL_BP_LOCATIONS (bpt)
- bpt->inserted = 0;
+ if (bpt->owner->enable_state != bp_permanent)
+ bpt->inserted = 0;
ALL_BREAKPOINTS_SAFE (b, temp)
{
@@ -3088,7 +3089,8 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
/* We will stop here */
if (b->disposition == disp_disable)
{
- b->enable_state = bp_disabled;
+ if (b->enable_state != bp_permanent)
+ b->enable_state = bp_disabled;
update_global_location_list (0);
}
if (b->silent)
@@ -5081,6 +5083,34 @@ add_location_to_breakpoint (struct break
set_breakpoint_location_function (loc);
return loc;
}
+\f
+
+/* Return 1 if LOC is pointing to a permanent breakpoint,
+ return 0 otherwise. */
+
+static int
+bp_loc_is_permanent (struct bp_location *loc)
+{
+ int len;
+ CORE_ADDR addr;
+ const gdb_byte *brk;
+ gdb_byte *target_mem;
+
+ gdb_assert (loc != NULL);
+
+ addr = loc->address;
+ brk = gdbarch_breakpoint_from_pc (current_gdbarch, &addr, &len);
+
+ target_mem = alloca (len);
+
+ if (target_read_memory (loc->address, target_mem, len) == 0
+ && memcmp (target_mem, brk, len) == 0)
+ return 1;
+
+ return 0;
+}
+
+
/* Create a breakpoint with SAL as location. Use ADDR_STRING
as textual description of the location, and COND_STRING
@@ -5135,6 +5165,9 @@ create_breakpoint (struct symtabs_and_li
loc = add_location_to_breakpoint (b, type, &sal);
}
+ if (bp_loc_is_permanent (loc))
+ make_breakpoint_permanent (b);
+
if (b->cond_string)
{
char *arg = b->cond_string;
@@ -7389,6 +7422,10 @@ update_breakpoint_locations (struct brea
b->line_number = sals.sals[i].line;
}
+ /* Update locationos of permanent breakpoints. */
+ if (b->enable_state == bp_permanent)
+ make_breakpoint_permanent (b);
+
/* If possible, carry over 'disable' status from existing breakpoints. */
{
struct bp_location *e = existing_locations;
@@ -8152,6 +8189,7 @@ single_step_breakpoint_inserted_here_p (
return 0;
}
+
\f
/* This help string is used for the break, hbreak, tbreak and thbreak commands.
It is defined as a macro to prevent duplication.
Index: gdb/i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.264
diff -u -p -r1.264 i386-tdep.c
--- gdb/i386-tdep.c 26 Aug 2008 17:40:24 -0000 1.264
+++ gdb/i386-tdep.c 2 Sep 2008 15:17:16 -0000
@@ -2624,6 +2624,18 @@ i386_fetch_pointer_argument (struct fram
return read_memory_unsigned_integer (sp + (4 * (argi + 1)), 4);
}
+static void
+i386_skip_permanent_breakpoint (struct regcache *regcache)
+{
+ CORE_ADDR current_pc = regcache_read_pc (regcache);
+
+ /* On i386, breakpoint is exactly 1 byte long, so we just
+ adjust the PC in the regcache. */
+ current_pc += 1;
+ regcache_write_pc (regcache, current_pc);
+}
+
+
\f
static struct gdbarch *
i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
@@ -2812,6 +2824,9 @@ i386_gdbarch_init (struct gdbarch_info i
if (tdep->mm0_regnum == 0)
tdep->mm0_regnum = gdbarch_num_regs (gdbarch);
+ set_gdbarch_skip_permanent_breakpoint (gdbarch,
+ i386_skip_permanent_breakpoint);
+
return gdbarch;
}
[-- Attachment #4: i386-bp_permanent.exp.20080902.ChangeLog --]
[-- Type: text/plain, Size: 101 bytes --]
2008-09-02 Aleksandar Ristovski <aristovski@qnx.com>
* gdb.arch/i386-bp_permanent.exp: New test.
[-- Attachment #5: i386-bp_permanent.exp.20080902 --]
[-- Type: text/plain, Size: 3116 bytes --]
# Copyright (C) 2008 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/>.
# This file is part of the gdb testsuite.
if $tracelevel {
strace $tracelevel
}
# Test stepping over permanent breakpoints on i386.
if ![istarget "i?86-*-*"] then {
verbose "Skipping skip over permanent breakpoint on i386 tests."
return
}
set testfile "i386-prologue"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
# some targets have leading underscores on assembly symbols.
# TODO: detect this automatically
set additional_flags ""
if [istarget "i?86-*-cygwin*"] then {
set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\""
}
# Don't use "debug", so that we don't have line information for the assembly
# fragments.
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list $additional_flags]] != "" } {
untested i386-prologue.exp
return -1
}
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
#
# Run to `main' where we begin our tests.
#
if ![runto_main] then {
return -1
}
set function standard
set retcode [gdb_test_multiple "disassemble $function" "Disassemble function '$function'" {
-re ".*($hex) <$function\\+0>.*($hex) <$function\\+4>.*($hex) <$function\\+5>.*($hex) <$function\\+6>.*$gdb_prompt $" {
set function_start $expect_out(1,string);
set address $expect_out(2,string);
set address1 $expect_out(3,string);
set address2 $expect_out(4,string);
}
}]
if {$retcode != 0} {
fail "Disassemble failed, skipping entire test."
return -1
}
gdb_breakpoint "*$function_start"
gdb_breakpoint "*$address"
gdb_test "continue" "Breakpoint .*, $function_start in $function.*" \
"Stop at the '$function' start breakpoint (fetching esp)."
# We want to fetch esp at the start of '$function' function to make sure
# skip_permanent_breakpoint implementation really skips only the perm.
# breakpoint. If, for whatever reason, 'leave' instruction doesn't get
# executed, esp will not have this value.
set start_esp 0
gdb_test_multiple "print \$esp" "Fetch esp value." {
-re "\\\$1.*($hex).*$gdb_prompt $" {
set start_esp $expect_out(1,string);
}
}
gdb_test "continue" "Breakpoint .*, $address in $function.*" \
"Stop at permanent breakpoint."
gdb_test "stepi" "$address1|$address2 in $function.*" \
"Single stepping past permanent breakpoint."
gdb_test "print \$esp" ".*$start_esp.*" \
"ESP value does not match - step_permanent_breakpoint wrong."
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [patch] step over permanent breakpoint
2008-09-02 15:37 ` Aleksandar Ristovski
@ 2008-09-02 20:54 ` Joel Brobecker
2008-09-03 13:46 ` Aleksandar Ristovski
0 siblings, 1 reply; 7+ messages in thread
From: Joel Brobecker @ 2008-09-02 20:54 UTC (permalink / raw)
To: Aleksandar Ristovski; +Cc: gdb-patches
> >Also, I don't completely understand the ".1" part of your regexp. And
> >the gdb_test_multiple documentation also says that you should include
> >the final newline and prompt. So I suggest:
> >
> > -re ".*($hex).*$gdb_prompt $".
> It was a shortcut for "\\\$1".
> Changed.
Haaaaaa, you meant to match the "$<number>" part of the output, right?
> 2008-09-02 Aleksandar Ristovski <aristovski@qnx.com>
>
> * breakpoint.c (breakpoint_init_inferior): Mark as not inserted only
> non-permanent breakpoints.
> (bpstat_stop_status): Change enable_state to bp_disabled only for
> non-permanent breakpoints.
> (bp_loc_is_permanent): New function.
> (create_breakpoint): Check if the location points to a permanent
> breakpoint and if it does, make breakpoint permanent.
> (update_breakpoint_locations): Make sure new locations of permanent
> breakpoints are properly initialized.
> * i386-tdep.c (i386_skip_permanent_breakpoint): New function.
> (i386_gdbarch_init): Set gdbarch_skip_permanent_breakpoint.
This is OK, just remember to make a couple of tiny little adjustments:
> + /* Update locationos of permanent breakpoints. */
^^^^^^^^^^ spelling
> @@ -8152,6 +8189,7 @@ single_step_breakpoint_inserted_here_p (
> return 0;
> }
>
> +
> \f
> /* This help string is used for the break, hbreak, tbreak and thbreak commands.
> It is defined as a macro to prevent duplication.
This hunk (adding an extra new line before the ^L is unnecessary).
> 2008-09-02 Aleksandar Ristovski <aristovski@qnx.com>
>
> * gdb.arch/i386-bp_permanent.exp: New test.
This is also OK.
--
Joel
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [patch] step over permanent breakpoint
2008-09-02 20:54 ` Joel Brobecker
@ 2008-09-03 13:46 ` Aleksandar Ristovski
0 siblings, 0 replies; 7+ messages in thread
From: Aleksandar Ristovski @ 2008-09-03 13:46 UTC (permalink / raw)
To: Joel Brobecker; +Cc: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 283 bytes --]
Joel Brobecker wrote:
> Haaaaaa, you meant to match the "$<number>" part of the output, right?
Yes.
> This is OK, just remember to make a couple of tiny little adjustments:
>
Adjustments made.
Committed.
Final patches attached.
Thanks for reviewing the patch!
Aleksandar
[-- Attachment #2: i386_permanent_breakpoints-20080903.diff.ChangeLog --]
[-- Type: text/plain, Size: 640 bytes --]
2008-09-03 Aleksandar Ristovski <aristovski@qnx.com>
* breakpoint.c (breakpoint_init_inferior): Mark as not inserted only
non-permanent breakpoints.
(bpstat_stop_status): Change enable_state to bp_disabled only for
non-permanent breakpoints.
(bp_loc_is_permanent): New function.
(create_breakpoint): Check if the location points to a permanent
breakpoint and if it does, make breakpoint permanent.
(update_breakpoint_locations): Make sure new locations of permanent
breakpoints are properly initialized.
* i386-tdep.c (i386_skip_permanent_breakpoint): New function.
(i386_gdbarch_init): Set gdbarch_skip_permanent_breakpoint.
[-- Attachment #3: i386_permanent_breakpoints-20080903.diff --]
[-- Type: text/plain, Size: 3389 bytes --]
Index: gdb/breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.345
diff -u -p -r1.345 breakpoint.c
--- gdb/breakpoint.c 26 Aug 2008 17:36:44 -0000 1.345
+++ gdb/breakpoint.c 3 Sep 2008 13:29:01 -0000
@@ -1750,7 +1750,8 @@ breakpoint_init_inferior (enum inf_conte
struct bp_location *bpt;
ALL_BP_LOCATIONS (bpt)
- bpt->inserted = 0;
+ if (bpt->owner->enable_state != bp_permanent)
+ bpt->inserted = 0;
ALL_BREAKPOINTS_SAFE (b, temp)
{
@@ -3088,7 +3089,8 @@ bpstat_stop_status (CORE_ADDR bp_addr, p
/* We will stop here */
if (b->disposition == disp_disable)
{
- b->enable_state = bp_disabled;
+ if (b->enable_state != bp_permanent)
+ b->enable_state = bp_disabled;
update_global_location_list (0);
}
if (b->silent)
@@ -5081,6 +5083,34 @@ add_location_to_breakpoint (struct break
set_breakpoint_location_function (loc);
return loc;
}
+\f
+
+/* Return 1 if LOC is pointing to a permanent breakpoint,
+ return 0 otherwise. */
+
+static int
+bp_loc_is_permanent (struct bp_location *loc)
+{
+ int len;
+ CORE_ADDR addr;
+ const gdb_byte *brk;
+ gdb_byte *target_mem;
+
+ gdb_assert (loc != NULL);
+
+ addr = loc->address;
+ brk = gdbarch_breakpoint_from_pc (current_gdbarch, &addr, &len);
+
+ target_mem = alloca (len);
+
+ if (target_read_memory (loc->address, target_mem, len) == 0
+ && memcmp (target_mem, brk, len) == 0)
+ return 1;
+
+ return 0;
+}
+
+
/* Create a breakpoint with SAL as location. Use ADDR_STRING
as textual description of the location, and COND_STRING
@@ -5135,6 +5165,9 @@ create_breakpoint (struct symtabs_and_li
loc = add_location_to_breakpoint (b, type, &sal);
}
+ if (bp_loc_is_permanent (loc))
+ make_breakpoint_permanent (b);
+
if (b->cond_string)
{
char *arg = b->cond_string;
@@ -7389,6 +7422,10 @@ update_breakpoint_locations (struct brea
b->line_number = sals.sals[i].line;
}
+ /* Update locations of permanent breakpoints. */
+ if (b->enable_state == bp_permanent)
+ make_breakpoint_permanent (b);
+
/* If possible, carry over 'disable' status from existing breakpoints. */
{
struct bp_location *e = existing_locations;
Index: gdb/i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.264
diff -u -p -r1.264 i386-tdep.c
--- gdb/i386-tdep.c 26 Aug 2008 17:40:24 -0000 1.264
+++ gdb/i386-tdep.c 3 Sep 2008 13:29:01 -0000
@@ -2624,6 +2624,18 @@ i386_fetch_pointer_argument (struct fram
return read_memory_unsigned_integer (sp + (4 * (argi + 1)), 4);
}
+static void
+i386_skip_permanent_breakpoint (struct regcache *regcache)
+{
+ CORE_ADDR current_pc = regcache_read_pc (regcache);
+
+ /* On i386, breakpoint is exactly 1 byte long, so we just
+ adjust the PC in the regcache. */
+ current_pc += 1;
+ regcache_write_pc (regcache, current_pc);
+}
+
+
\f
static struct gdbarch *
i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
@@ -2812,6 +2824,9 @@ i386_gdbarch_init (struct gdbarch_info i
if (tdep->mm0_regnum == 0)
tdep->mm0_regnum = gdbarch_num_regs (gdbarch);
+ set_gdbarch_skip_permanent_breakpoint (gdbarch,
+ i386_skip_permanent_breakpoint);
+
return gdbarch;
}
[-- Attachment #4: i386-bp_permanent.exp.20080903.ChangeLog --]
[-- Type: text/plain, Size: 101 bytes --]
2008-09-03 Aleksandar Ristovski <aristovski@qnx.com>
* gdb.arch/i386-bp_permanent.exp: New test.
[-- Attachment #5: i386-bp_permanent.exp.20080903 --]
[-- Type: text/plain, Size: 3116 bytes --]
# Copyright (C) 2008 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/>.
# This file is part of the gdb testsuite.
if $tracelevel {
strace $tracelevel
}
# Test stepping over permanent breakpoints on i386.
if ![istarget "i?86-*-*"] then {
verbose "Skipping skip over permanent breakpoint on i386 tests."
return
}
set testfile "i386-prologue"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
# some targets have leading underscores on assembly symbols.
# TODO: detect this automatically
set additional_flags ""
if [istarget "i?86-*-cygwin*"] then {
set additional_flags "additional_flags=-DSYMBOL_PREFIX=\"_\""
}
# Don't use "debug", so that we don't have line information for the assembly
# fragments.
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list $additional_flags]] != "" } {
untested i386-prologue.exp
return -1
}
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
#
# Run to `main' where we begin our tests.
#
if ![runto_main] then {
return -1
}
set function standard
set retcode [gdb_test_multiple "disassemble $function" "Disassemble function '$function'" {
-re ".*($hex) <$function\\+0>.*($hex) <$function\\+4>.*($hex) <$function\\+5>.*($hex) <$function\\+6>.*$gdb_prompt $" {
set function_start $expect_out(1,string);
set address $expect_out(2,string);
set address1 $expect_out(3,string);
set address2 $expect_out(4,string);
}
}]
if {$retcode != 0} {
fail "Disassemble failed, skipping entire test."
return -1
}
gdb_breakpoint "*$function_start"
gdb_breakpoint "*$address"
gdb_test "continue" "Breakpoint .*, $function_start in $function.*" \
"Stop at the '$function' start breakpoint (fetching esp)."
# We want to fetch esp at the start of '$function' function to make sure
# skip_permanent_breakpoint implementation really skips only the perm.
# breakpoint. If, for whatever reason, 'leave' instruction doesn't get
# executed, esp will not have this value.
set start_esp 0
gdb_test_multiple "print \$esp" "Fetch esp value." {
-re "\\\$1.*($hex).*$gdb_prompt $" {
set start_esp $expect_out(1,string);
}
}
gdb_test "continue" "Breakpoint .*, $address in $function.*" \
"Stop at permanent breakpoint."
gdb_test "stepi" "$address1|$address2 in $function.*" \
"Single stepping past permanent breakpoint."
gdb_test "print \$esp" ".*$start_esp.*" \
"ESP value does not match - step_permanent_breakpoint wrong."
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-09-03 13:46 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-08-06 14:12 [patch] step over permanent breakpoint Aleksandar Ristovski
2008-08-18 11:08 ` Joel Brobecker
2008-08-19 15:39 ` Aleksandar Ristovski
2008-08-25 16:36 ` Joel Brobecker
2008-09-02 15:37 ` Aleksandar Ristovski
2008-09-02 20:54 ` Joel Brobecker
2008-09-03 13:46 ` Aleksandar Ristovski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox