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? 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 <a...@soum.co.jp> 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 >