On Thu, 12 Jul 2018 19:14:19 +0900 (JST)
YASUOKA Masahiko <[email protected]> wrote:
>> On 2018/07/12 16:16, YASUOKA Masahiko wrote:
>>> > 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.

Then, how about using the diff from asou?

Index: gnu/usr.bin/binutils/gdb/dwarf2read.c
===================================================================
RCS file: /cvs/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 10:42:59 -0000
@@ -6479,7 +6479,7 @@ 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 && line != 0)
                 {
                  /* Append row to matrix using current values.  */
                  record_line (current_subfile, line, 


On Thu, 12 Jul 2018 19:14:19 +0900 (JST)
YASUOKA Masahiko <[email protected]> wrote:
> On Thu, 12 Jul 2018 10:37:33 +0100
> Stuart Henderson <[email protected]> wrote:
>> On 2018/07/12 16:16, YASUOKA Masahiko wrote:
>>> > 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..
> 
> Indeed...
> 
>>> 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
>>> > 
>>> 
>> 

Reply via email to