public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH][gdb/symtab] Handle setting line bp without debug line info
@ 2020-10-16 14:00 Tom de Vries
  2020-10-16 20:38 ` Tom Tromey
  0 siblings, 1 reply; 2+ messages in thread
From: Tom de Vries @ 2020-10-16 14:00 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

Hi,

When setting a breakpoint on a line in an executable without debug line info,
we run into an abort.

The problem occurs when calling set_default_source_symtab_and_line, which
calls select_source_symtab (0), which is where we try to find the line number
for main:
...
  /* Make the default place to list be the function `main'
     if one exists.  */
  block_symbol bsym = lookup_symbol (main_name (), 0, VAR_DOMAIN, 0);
  if (bsym.symbol != nullptr && SYMBOL_CLASS (bsym.symbol) == LOC_BLOCK)
    {
      symtab_and_line sal = find_function_start_sal (bsym.symbol, true);
      loc->set (sal.symtab, std::max (sal.line - (lines_to_list - 1), 1));
      return;
    }
...

However, due to the missing debug line info, find_function_start_sal returns a
sal with sal.symtab == 0:
...
(gdb) p /x sal
$2 = {pspace = 0x1a4a7f0, symtab = 0x0, symbol = 0x1d9e480, section = 0x1d5b398,
  msymbol = 0x0, line = 0x0, pc = 0x4004ab, end = 0x0, explicit_pc = 0x0,
  explicit_line = 0x0, is_stmt = 0x0, prob = 0x0, objfile = 0x0}
...
which eventually causes an segfault in create_sals_line_offset because
self->default_symtab->filename is accessed while self->default_symtab == NULL.

Fix this by handling sal.symtab == NULL in select_source_symtab.

Tested on x86_64-linux.

Any comments?

Thanks,
- Tom

[gdb/symtab] Handle setting line bp without debug line info

gdb/ChangeLog:

2020-10-16  Tom de Vries  <tdevries@suse.de>

	PR symtab/26317
	* source.c (select_source_symtab): Handling sal.symtab == NULL for
	symbol main.

gdb/testsuite/ChangeLog:

2020-10-16  Tom de Vries  <tdevries@suse.de>

	PR symtab/26317
	* gdb.dwarf2/dw2-main-no-line-number.exp: New file.

---
 gdb/source.c                                       |  7 ++-
 .../gdb.dwarf2/dw2-main-no-line-number.exp         | 68 ++++++++++++++++++++++
 2 files changed, 74 insertions(+), 1 deletion(-)

diff --git a/gdb/source.c b/gdb/source.c
index a73a31f644..779efa40d9 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -306,7 +306,12 @@ select_source_symtab (struct symtab *s)
   if (bsym.symbol != nullptr && SYMBOL_CLASS (bsym.symbol) == LOC_BLOCK)
     {
       symtab_and_line sal = find_function_start_sal (bsym.symbol, true);
-      loc->set (sal.symtab, std::max (sal.line - (lines_to_list - 1), 1));
+      if (sal.symtab == NULL)
+	/* We couldn't find the location of `main', possibly due to missing
+	   line number info, fall back to line 1 in the corresponding file.  */
+	loc->set (symbol_symtab (bsym.symbol), 1);
+      else
+	loc->set (sal.symtab, std::max (sal.line - (lines_to_list - 1), 1));
       return;
     }
 
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-main-no-line-number.exp b/gdb/testsuite/gdb.dwarf2/dw2-main-no-line-number.exp
new file mode 100644
index 0000000000..aad7ab1c1b
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-main-no-line-number.exp
@@ -0,0 +1,68 @@
+# Copyright 2020 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/>.
+
+# Setup a main without line number info, and verify that attempting to
+# set a breakpoint on a line number doesn't crash gdb.
+
+load_lib dwarf.exp
+
+set testname [file rootname [file tail [info script]]]
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+    verbose "Skipping $testname test."
+    return 0
+}
+
+# The .c files use __attribute__.
+if [get_compiler_info] {
+    return -1
+}
+if !$gcc_compiled {
+    verbose "Skipping $testname test."
+    return 0
+}
+
+standard_testfile main.c main-dw.S
+
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+    declare_labels Llines
+    global srcdir subdir srcfile
+
+    cu {} {
+	compile_unit {
+	    {language @DW_LANG_C}
+	    {name $srcfile}
+	} {
+	    subprogram {
+		{external 1 flag}
+		{MACRO_AT_func {main}}
+	    }
+	}
+    }
+}
+
+if { [prepare_for_testing "failed to prepare" ${testfile} \
+	  [list $srcfile $asm_file] {nodebug}] } {
+    return -1
+}
+
+if ![runto_main] {
+    return -1
+}
+
+set breakpoint_at_missing_lineno_set [gdb_breakpoint "1" no-message]
+gdb_assert { !$breakpoint_at_missing_lineno_set  }

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH][gdb/symtab] Handle setting line bp without debug line info
  2020-10-16 14:00 [PATCH][gdb/symtab] Handle setting line bp without debug line info Tom de Vries
@ 2020-10-16 20:38 ` Tom Tromey
  0 siblings, 0 replies; 2+ messages in thread
From: Tom Tromey @ 2020-10-16 20:38 UTC (permalink / raw)
  To: Tom de Vries; +Cc: gdb-patches, Tom Tromey

>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:

Tom> When setting a breakpoint on a line in an executable without debug line info,
Tom> we run into an abort.

I guess the idea is that there is some debug info but somehow the line
numbers are missing?

Tom> +	/* We couldn't find the location of `main', possibly due to missing
Tom> +	   line number info, fall back to line 1 in the corresponding file.  */
Tom> +	loc->set (symbol_symtab (bsym.symbol), 1);

... which is why the symbol and symtab are set but the line number is
not.

The patch seems fine to me.  In general it seems to me that it's ok to
work around pathological / broken cases like this when possible, even if
the results aren't perfect.

Tom

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-10-16 20:38 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-16 14:00 [PATCH][gdb/symtab] Handle setting line bp without debug line info Tom de Vries
2020-10-16 20:38 ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).