On 2018/07/12 16:16, YASUOKA Masahiko wrote:
> Hi,
>
> > The next command of GDB does not work properly.
> > I use OpenBSD 6.3 and /usr/bin/gdb (GDB 6.3).
>
> It seems that gdb can't read the dwarf generated by clang properly.
> I found a better fix at the upstream.
>
>
> https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=ca5f395d6255337974262b4a6f40da531fcf6204
>
> ok?
I believe that is a post-GPLv3 commit..
> Index: gnu/usr.bin/binutils/gdb/dwarf2read.c
> ===================================================================
> RCS file: /var/cvs/openbsd/src/gnu/usr.bin/binutils/gdb/dwarf2read.c,v
> retrieving revision 1.5
> diff -u -p -r1.5 dwarf2read.c
> --- gnu/usr.bin/binutils/gdb/dwarf2read.c 27 Dec 2004 21:05:10 -0000
> 1.5
> +++ gnu/usr.bin/binutils/gdb/dwarf2read.c 12 Jul 2018 07:07:57 -0000
> @@ -6479,13 +6479,13 @@ dwarf_decode_lines (struct line_header *
> * lh->minimum_instruction_length;
> line += lh->line_base + (adj_opcode % lh->line_range);
> lh->file_names[file - 1].included_p = 1;
> - if (!decode_for_pst_p)
> + if (!decode_for_pst_p && is_stmt)
> {
> /* Append row to matrix using current values. */
> record_line (current_subfile, line,
> check_cu_functions (address, cu));
> }
> - basic_block = 1;
> + basic_block = 0;
> }
> else switch (op_code)
> {
> @@ -6499,7 +6499,7 @@ dwarf_decode_lines (struct line_header *
> case DW_LNE_end_sequence:
> end_sequence = 1;
> lh->file_names[file - 1].included_p = 1;
> - if (!decode_for_pst_p)
> + if (!decode_for_pst_p && is_stmt)
> record_line (current_subfile, 0, address);
> break;
> case DW_LNE_set_address:
>
> On Thu, 28 Jun 2018 14:14:51 +0900 (JST)
> Masato Asou <[email protected]> wrote:
> > Hi tech,
> >
> > I have a problem and I have ad hoc patch to solve this problem.
> > However, this patch is AD HOC. Does anybody have correct solution?
> >
> > The next command of GDB does not work properly.
> > I use OpenBSD 6.3 and /usr/bin/gdb (GDB 6.3).
> >
> > When I debuging my program with next command, I expect stop at next
> > line. However, program returned from current function unusual.
> >
> > It seems that this problem will occur if there is a WHILE immediately
> > after the function call.
> >
> > Example as below:
> >
> > $ uname -a
> > OpenBSD asou-obsd63.soum.co.jp 6.3 GENERIC#100 amd64
> > $ cat main.c
> > #include <err.h>
> > #include <locale.h>
> > #include <stdio.h>
> > #include <unistd.h>
> >
> > int
> > main(int argc, char *argv[])
> > {
> > extern void sub(int);
> > int ch;
> > int flag_a = 0;
> >
> > sub(1);
> > while ((ch = getopt(argc, argv, "a")) != -1) {
> > switch (ch) {
> > case 'a':
> > flag_a = 1;
> > break;
> > default:
> > err(1, "Unknown option: %c\n", ch);
> > break;
> > }
> > }
> >
> > printf("flag_a = %d\n", flag_a);
> > return (0);
> > }
> >
> > void
> > sub(int flag)
> > {
> > printf("flag = %d\n", flag);
> > }
> > $ cc -g main.c
> > $ gdb a.out
> > GNU gdb 6.3
> > Copyright 2004 Free Software Foundation, Inc.
> > GDB is free software, covered by the GNU General Public License, and you are
> > welcome to change it and/or distribute copies of it under certain
> > conditions.
> > Type "show copying" to see the conditions.
> > There is absolutely no warranty for GDB. Type "show warranty" for details.
> > This GDB was configured as "amd64-unknown-openbsd6.3"...
> > (gdb) b main
> > Breakpoint 1 at 0x56b: file main.c, line 11.
> > (gdb) run
> > Starting program: /home/asou/tmp/a.out
> > Breakpoint 1 at 0x12776150056b: file main.c, line 11.
> >
> > Breakpoint 1, main (argc=1, argv=0x7f7ffffc3b08) at main.c:11
> > 11 int flag_a = 0;
> > Current language: auto; currently minimal
> > (gdb) next
> > 13 sub(1);
> > (gdb) next
> > flag = 1
> > 0x0000127761500579 in main (argc=1, argv=0x7f7ffffc3b08)
> > from /home/asou/tmp/a.out
> > (gdb) next
> > Single stepping until exit from function main,
> > which has no line number information.
> > flag_a = 0
> > 0x0000127761500436 in _start () from /home/asou/tmp/a.out
> > (gdb) bt
> > #0 0x0000127761500436 in _start () from /home/asou/tmp/a.out
> > #1 0x0000000000000000 in ?? ()
> > (gdb)
> >
> > My patch as below:
> >
> > $ git diff
> > diff --git a/gnu/usr.bin/binutils/gdb/dwarf2read.c
> > b/gnu/usr.bin/binutils/gdb/dwarf2read.c
> > index 96f9e0f8551..651904d763d 100644
> > --- a/gnu/usr.bin/binutils/gdb/dwarf2read.c
> > +++ b/gnu/usr.bin/binutils/gdb/dwarf2read.c
> > @@ -6479,7 +6479,11 @@ dwarf_decode_lines (struct line_header *lh, char
> > *comp_dir, bfd *abfd,
> > * lh->minimum_instruction_length;
> > line += lh->line_base + (adj_opcode % lh->line_range);
> > lh->file_names[file - 1].included_p = 1;
> > +#if 0 /* for debug by asou */
> > if (!decode_for_pst_p)
> > +#else /* for debug by asou */
> > + if (line != 0 && !decode_for_pst_p)
> > +#endif /* for debug by asou */
> > {
> > /* Append row to matrix using current values. */
> > record_line (current_subfile, line,
> > --
> > ASOU Masato
> >
>