aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2018-06-29 19:31:49 +0100
committerPedro Alves <palves@redhat.com>2018-06-29 19:37:20 +0100
commitcd2bb709940d33668fe6dbe8d4ffee0ed44c25e6 (patch)
treeabec853b23f29d3ca0c2f84b42ce61e022b5e667 /gdb/testsuite
parent991ff2922affa0b3afb837d2246d01f0c1fdb364 (diff)
downloadgdb-cd2bb709940d33668fe6dbe8d4ffee0ed44c25e6.zip
gdb-cd2bb709940d33668fe6dbe8d4ffee0ed44c25e6.tar.gz
gdb-cd2bb709940d33668fe6dbe8d4ffee0ed44c25e6.tar.bz2
"break LINENO/*ADDRESS", inline functions and "info break" output
While experimenting with the previous patch, I noticed this inconsistency in GDB's output: (gdb) b 32 Breakpoint 1 at 0x40062f: file inline-break.c, line 32. (1) (gdb) r .... Breakpoint 1, func1 (x=1) at inline-break.c:32 (2) 32 return x * 23; /* break here */ (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x40062f in main at inline-break.c:32 (3) breakpoint already hit 1 time (gdb) Notice that when the breakpoint as set, GDB showed "inline-break.c, line 32" (1), the same line number that was specified in the command. When we run to the breakpoint, we present the stop at the same line number, and correctly show "func1" as the function name (2). But in "info break" output (3), notice that we say "in main", not "in func1". The same thing happens if you set a breakpoint by address. I.e.: (gdb) b *0x40062f Breakpoint 2 at 0x40062f: file inline-break.c, line 32. (gdb) info breakpoints Num Type Disp Enb Address What 2 breakpoint keep y 0x000000000040062f in main at inline-break.c:32 (gdb) r .... Breakpoint 2, func1 (x=1) at inline-break.c:32 32 return x * 23; /* break here */ The problem is that the breakpoints were set at an inline function, but when we set such a breakpoint by line number or address, we don't record the functions symbol in the sal, and as consequence the breakpoint location does not have an associated symbol either. Then, in print_breakpoint_location, if the location does not have a symbol, we call find_pc_sect_function to find one, and this is what finds "main", because find_pc_sect_function uses block_linkage_function: /* Return the symbol for the function which contains a specified lexical block, described by a struct block BL. The return value will not be an inlined function; the containing function will be returned instead. */ struct symbol * block_linkage_function (const struct block *bl) To fix this, this commit adds an alternative to find_pc_sect_function that uses block_containing_function instead: /* Return the symbol for the function which contains a specified block, described by a struct block BL. The return value will be the closest enclosing function, which might be an inline function. */ struct symbol * block_containing_function (const struct block *bl) (It seems odd to me that block_linkage_function says "the CONTAINING function will be returned", and then block_containing_function says it returns "the closest enclosing function". Something seems reversed here. Still, I've kept the same nomenclature and copied the comments, so that at least there's consistency. Maybe we should fix that up somehow.) Then I wondered, why make print_breakpoint_location look up the symbol every time it is called, instead of just always storing the symbol when the location is created, since the location already stores the symbol in some cases. So to find which cases might be missing setting the symbol in the sal which is used to create the breakpoint location, I added an assertion to print_breakpoint_location, and ran the testsuite. That caught a few places, unsurprisingly: - setting a breakpoint by line number - setting a breapoint by address - ifunc resolving Those are all fixed by this commit. I decided not to add the assertion to block_linkage_function and leave the existing "if (sym)" check in place, because it's plausible that we have symtabs with line info but no symbols. I.e., that would not be a GDB bug, but a peculiarity of debug info input. gdb/ChangeLog: 2018-06-29 Pedro Alves <palves@redhat.com> * blockframe.c (find_pc_sect_containing_function): New function. * breakpoint.c (print_breakpoint_location): Don't call find_pc_sect_function. * linespec.c (create_sals_line_offset): Record the location's symbol in the sal. * linespec.c (convert_address_location_to_sals): Fill in sal's symbol with find_pc_sect_containing_function. * symtab.c (find_function_start_sal): Rename to ... (find_function_start_sal_1): ... this. (find_function_start_sal): Reimplement as wrapper around find_function_start_sal_1, and use find_pc_sect_containing_function to fill in the sal's symbol. (find_function_start_sal(symbol*, bool)): Adjust. * symtab.h (find_pc_function, find_pc_sect_function): Adjust comments. (find_pc_sect_containing_function): Declare. gdb/testsuite/ChangeLog: 2018-06-29 Pedro Alves <palves@redhat.com> * gdb.opt/inline-break.exp (line number, address): Add "info break" tests.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.opt/inline-break.exp6
2 files changed, 11 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 3d93d32..8a11071 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2018-06-29 Pedro Alves <palves@redhat.com>
+ * gdb.opt/inline-break.exp (line number, address): Add "info
+ break" tests.
+
+2018-06-29 Pedro Alves <palves@redhat.com>
+
* gdb.opt/inline-break.c (func1): Add "break here" marker.
* gdb.opt/inline-break.exp: Test setting breakpoints by line
number and address and running to them.
diff --git a/gdb/testsuite/gdb.opt/inline-break.exp b/gdb/testsuite/gdb.opt/inline-break.exp
index 46ef6f1..aed38ed 100644
--- a/gdb/testsuite/gdb.opt/inline-break.exp
+++ b/gdb/testsuite/gdb.opt/inline-break.exp
@@ -272,6 +272,9 @@ with_test_prefix "line number" {
# Set the breakpoint by line number, and check that GDB reports
# the breakpoint location being the inline function.
gdb_test "break $srcfile:$line" ".*Breakpoint .* at .*: file .*$srcfile, line $line."
+
+ gdb_test "info break \$bpnum" "in func1 at .*$srcfile:$line"
+
gdb_test "continue" "Breakpoint .*, func1 \\(x=1\\) at .*$srcfile:$line.*break here.*" \
"breakpoint hit presents stop at inlined function"
@@ -294,6 +297,9 @@ with_test_prefix "address" {
# Set the breakpoint by address, and check that GDB reports the
# breakpoint location being the inline function.
gdb_test "break *$address" ".*Breakpoint .* at $address: file .*$srcfile, line $line."
+
+ gdb_test "info break \$bpnum" "in func1 at .*$srcfile:$line"
+
gdb_test "continue" "Breakpoint .*, func1 \\(x=1\\) at .*$srcfile:$line.*break here.*" \
"breakpoint hit presents stop at inlined function"
}