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
>>> >
>>>
>>