This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFA] Avoid segfault in decode_line_2
- From: Elena Zannoni <ezannoni at redhat dot com>
- To: Michal Ludvig <mludvig at suse dot cz>
- Cc: GDB Patches <gdb-patches at sources dot redhat dot com>
- Date: Fri, 18 Jul 2003 09:26:02 -0400
- Subject: Re: [RFA] Avoid segfault in decode_line_2
- References: <3F0E61E7.5020900@suse.cz>
Michal Ludvig writes:
> Hi all,
> this patch fixes a problem that I met while debugging a testsuite
> failure on amd64:
>
> > Running gdb-head/gdb/testsuite/gdb.c++/templates.exp ...
> > FAIL: gdb.c++/templates.exp: constructor breakpoint (timeout)
>
> (gdb) break T5<int>::T5
> -> Segfault in linespec.c:486 [decode_line_2()] because
> values.sals[i].symtab is NULL and dereferencing of
> values.sals[i].symtab->filename crashes.
>
> After some investigation I found out that .debug_line section of the
> input file was broken (reported to binutils@ list).
> However broken debug info is not an excuse for GDB to crash.
>
> OK to apply to head and branch?
>
> Michal Ludvig
> --
> * SuSE CR, s.r.o * mludvig@suse.cz
> * (+420) 296.545.373 * http://www.suse.cz
> 2003-07-11 Michal Ludvig <mludvig@suse.cz>
>
> * linespec.c (decode_line_2): Avoid crash if
> find_function_start_sal() returns empty record.
>
> Index: linespec.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/linespec.c,v
> retrieving revision 1.49
> diff -u -p -r1.49 linespec.c
> --- linespec.c 8 Jun 2003 18:27:13 -0000 1.49
> +++ linespec.c 11 Jul 2003 06:59:01 -0000
> @@ -483,11 +483,16 @@ decode_line_2 (struct symbol *sym_arr[],
> if (sym_arr[i] && SYMBOL_CLASS (sym_arr[i]) == LOC_BLOCK)
> {
> values.sals[i] = find_function_start_sal (sym_arr[i], funfirstline);
> - printf_unfiltered ("[%d] %s at %s:%d\n",
> + printf_unfiltered ("[%d] %s at %s:%d ",
> (i + 2),
> SYMBOL_PRINT_NAME (sym_arr[i]),
> - values.sals[i].symtab->filename,
> + values.sals[i].symtab ?
> + values.sals[i].symtab->filename :
> + "?FILE",
> values.sals[i].line);
> + if (! values.sals[i].symtab)
> + printf_unfiltered ("[No symtab? Probably a broken debug info...]" );
> + printf_unfiltered ("\n");
> }
> else
> printf_unfiltered ("?HERE\n");
Yes, but, could you change this to use an if (values.sals[i].symtab)
before the printf_filtered and avoid the conditional expression? You
will end up getting rid of the if() for the No symtab?.. case as well,
since that can be folded into a single printf.
elena