This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
RFC: preserve line number when skipping prologue
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 26 Mar 2009 14:53:24 -0600
- Subject: RFC: preserve line number when skipping prologue
- Reply-to: Tom Tromey <tromey at redhat dot com>
Jeff Johnston noticed a regression in the CDT test suite when using a
recent gdb. The bug is that if you put a breakpoint on a
non-executable line before a function's start, gdb displays the
breakpoint as being on the function's first line.
E.g. consider this program:
#include <stdio.h>
/* Line 3 */
int main()
{
printf ("hi\n");
/* Line 9 */
return 0;
}
If I set a breakpoint on line 3, gdb reports line 7.
(gdb) b 3
Breakpoint 1 at 0x80483c5: file m.c, line 7.
But if I set one on line 9, another non-executable line, gdb reports
line 9:
(gdb) b 9
Breakpoint 2 at 0x80483d1: file m.c, line 9.
I tracked this down to the prologue-skipping code.
This patch fixes the problem by preserving the line number when
skipping the prologue. I am not sure this is really a valid thing to
do -- I'd appreciate comments on that. However, I do think that the
principle of reporting the location that the user requested is a valid
one.
Built and regtested on x86-64 (compile farm).
Tom
2009-03-26 Tom Tromey <tromey@redhat.com>
* breakpoint.c (resolve_sal_pc): Preserve original line number
when skipping prologue.
2009-03-26 Tom Tromey <tromey@redhat.com>
Update for change to prologue skipping:
* gdb.mi/mi2-simplerun.exp: Update.
* gdb.mi/mi2-break.exp: Update.
* gdb.mi/mi-simplerun.exp: Update.
* gdb.mi/mi-break.exp: Update.
* gdb.base/ending-run.exp: Update.
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 7e50342..750d632 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -5754,7 +5754,12 @@ resolve_sal_pc (struct symtab_and_line *sal)
/* If this SAL corresponds to a breakpoint inserted using
a line number, then skip the function prologue if necessary. */
if (sal->explicit_line)
- skip_prologue_sal (sal);
+ {
+ /* Preserve the original line number. */
+ int saved_line = sal->line;
+ skip_prologue_sal (sal);
+ sal->line = saved_line;
+ }
}
if (sal->section == 0 && sal->symtab != NULL)
diff --git a/gdb/testsuite/gdb.base/ending-run.exp b/gdb/testsuite/gdb.base/ending-run.exp
index 42b4577..cf33602 100644
--- a/gdb/testsuite/gdb.base/ending-run.exp
+++ b/gdb/testsuite/gdb.base/ending-run.exp
@@ -69,7 +69,7 @@ gdb_expect {
gdb_test "b ending-run.c:1" ".*Breakpoint.*4.*"
gdb_test "b ending-run.c:14" ".*Note.*also.*Breakpoint.*5.*" "b ending-run.c:14, two"
gdb_test "cle ending-run.c:14" \
- ".*Deleted breakpoints 4 5.*" "Cleared 2 by line"
+ ".*Deleted breakpoint 5.*" "Cleared 2 by line"
send_gdb "inf line ending-run.c:14\n"
gdb_expect {
@@ -77,7 +77,7 @@ gdb_expect {
set line_nine $expect_out(1,string)
gdb_test "b ending-run.c:14" ".*Breakpoint 6.*ending-run.c, line 14.*"
gdb_test "b *$line_nine" ".*Note.*also.*Breakpoint 7.*" "Breakpoint 7 at *ending-run.c:14"
- gdb_test "cle" ".*Deleted breakpoints 6 7.*" "Clear 2 by default"
+ gdb_test "cle" ".*Deleted breakpoints 4 6 7.*" "Clear 2 by default"
}
-re ".*$gdb_prompt $" {
fail "need to fix test for new compile outcome"
diff --git a/gdb/testsuite/gdb.mi/mi-break.exp b/gdb/testsuite/gdb.mi/mi-break.exp
index 6ea59fc..0f91af7 100644
--- a/gdb/testsuite/gdb.mi/mi-break.exp
+++ b/gdb/testsuite/gdb.mi/mi-break.exp
@@ -85,11 +85,11 @@ proc test_tbreak_creation_and_listing {} {
mi_create_breakpoint "-t basics.c:callee2" 2 del callee2 ".*basics.c" $line_callee2_body $hex \
"insert temp breakpoint at basics.c:callee2"
- mi_create_breakpoint "-t basics.c:$line_callee3_head" 3 del callee3 ".*basics.c" $line_callee3_body $hex \
+ mi_create_breakpoint "-t basics.c:$line_callee3_head" 3 del callee3 ".*basics.c" $line_callee3_head $hex \
"insert temp breakpoint at basics.c:\$line_callee3_head"
# Getting the quoting right is tricky. That is "\"<file>\":$line_callee4_head"
- mi_create_breakpoint "-t \"\\\"${srcfile}\\\":$line_callee4_head\"" 4 del callee4 ".*basics.c" $line_callee4_body $hex \
+ mi_create_breakpoint "-t \"\\\"${srcfile}\\\":$line_callee4_head\"" 4 del callee4 ".*basics.c" $line_callee4_head $hex \
"insert temp breakpoint at \"<fullfilename>\":\$line_callee4_head"
mi_gdb_test "666-break-list" \
diff --git a/gdb/testsuite/gdb.mi/mi-simplerun.exp b/gdb/testsuite/gdb.mi/mi-simplerun.exp
index 654146a..14a1446 100644
--- a/gdb/testsuite/gdb.mi/mi-simplerun.exp
+++ b/gdb/testsuite/gdb.mi/mi-simplerun.exp
@@ -74,10 +74,10 @@ proc test_breakpoints_creation_and_listing {} {
mi_create_breakpoint "basics.c:callee2" 2 keep callee2 ".*basics.c" $line_callee2_body $hex \
"insert breakpoint at basics.c:callee2"
- mi_create_breakpoint "basics.c:$line_callee3_head" 3 keep callee3 ".*basics.c" $line_callee3_body $hex \
+ mi_create_breakpoint "basics.c:$line_callee3_head" 3 keep callee3 ".*basics.c" $line_callee3_head $hex \
"insert breakpoint at basics.c:\$line_callee3_head"
- mi_create_breakpoint "\"\\\"${srcfile}\\\":$line_callee4_head\"" 4 keep callee4 ".*basics.c" $line_callee4_body $hex \
+ mi_create_breakpoint "\"\\\"${srcfile}\\\":$line_callee4_head\"" 4 keep callee4 ".*basics.c" $line_callee4_head $hex \
"insert breakpoint at \"<fullfilename>\":\$line_callee4_head"
mi_gdb_test "204-break-list" \
diff --git a/gdb/testsuite/gdb.mi/mi2-break.exp b/gdb/testsuite/gdb.mi/mi2-break.exp
index d08081a..7f43315 100644
--- a/gdb/testsuite/gdb.mi/mi2-break.exp
+++ b/gdb/testsuite/gdb.mi/mi2-break.exp
@@ -85,11 +85,11 @@ proc test_tbreak_creation_and_listing {} {
mi_create_breakpoint "-t basics.c:callee2" 2 del callee2 ".*basics.c" $line_callee2_body $hex \
"insert temp breakpoint at basics.c:callee2"
- mi_create_breakpoint "-t basics.c:$line_callee3_head" 3 del callee3 ".*basics.c" $line_callee3_body $hex \
+ mi_create_breakpoint "-t basics.c:$line_callee3_head" 3 del callee3 ".*basics.c" $line_callee3_head $hex \
"insert temp breakpoint at basics.c:\$line_callee3_head"
# Getting the quoting right is tricky. That is "\"<file>\":$line_callee4_head"
- mi_create_breakpoint "-t \"\\\"${srcfile}\\\":$line_callee4_head\"" 4 del callee4 ".*basics.c" $line_callee4_body $hex \
+ mi_create_breakpoint "-t \"\\\"${srcfile}\\\":$line_callee4_head\"" 4 del callee4 ".*basics.c" $line_callee4_head $hex \
"insert temp breakpoint at \"<fullfilename>\":\$line_callee4_head"
mi_gdb_test "666-break-list" \
diff --git a/gdb/testsuite/gdb.mi/mi2-simplerun.exp b/gdb/testsuite/gdb.mi/mi2-simplerun.exp
index eddb2ed..13443ee 100644
--- a/gdb/testsuite/gdb.mi/mi2-simplerun.exp
+++ b/gdb/testsuite/gdb.mi/mi2-simplerun.exp
@@ -74,10 +74,10 @@ proc test_breakpoints_creation_and_listing {} {
mi_create_breakpoint "basics.c:callee2" 2 keep callee2 ".*basics.c" $line_callee2_body $hex \
"insert breakpoint at basics.c:callee2"
- mi_create_breakpoint "basics.c:$line_callee3_head" 3 keep callee3 ".*basics.c" $line_callee3_body $hex \
+ mi_create_breakpoint "basics.c:$line_callee3_head" 3 keep callee3 ".*basics.c" $line_callee3_head $hex \
"insert breakpoint at basics.c:\$line_callee3_head"
- mi_create_breakpoint "\"\\\"${srcfile}\\\":$line_callee4_head\"" 4 keep callee4 ".*basics.c" $line_callee4_body $hex \
+ mi_create_breakpoint "\"\\\"${srcfile}\\\":$line_callee4_head\"" 4 keep callee4 ".*basics.c" $line_callee4_head $hex \
"insert breakpoint at \"<fullfilename>\":\$line_callee4_head"
mi_gdb_test "204-break-list" \