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
> 

Reply via email to