public inbox for gdb-prs@sourceware.org
help / color / mirror / Atom feed
* [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed.
@ 2022-07-19  7:59 vries at gcc dot gnu.org
  2022-07-19  8:36 ` [Bug symtab/29381] " vries at gcc dot gnu.org
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: vries at gcc dot gnu.org @ 2022-07-19  7:59 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=29381

            Bug ID: 29381
           Summary: [gdb, debug-types, debug-names] read.h:309:
                    internal-error: set_length: Assertion `m_length ==
                    length' failed.
           Product: gdb
           Version: HEAD
            Status: NEW
          Severity: normal
          Priority: P2
         Component: symtab
          Assignee: unassigned at sourceware dot org
          Reporter: vries at gcc dot gnu.org
  Target Milestone: ---

When running test-case gdb.cp/cpexprs-debug-types/cpexprs-debug-types with
target board cc-with-debug-names on a system with gcc 12.1.1 (defaulting to
dwarf 5), I run into:
...
(gdb) file
/data/vries/gdb_versions/devel/build/gdb/testsuite/outputs/gdb.cp/cpexprs-debug-types/cpexprs-debug-types^M
Reading symbols from
/data/vries/gdb_versions/devel/build/gdb/testsuite/outputs/gdb.cp/cpexprs-debug-types/cpexprs-debug-types...^M
warning: Section .debug_aranges in
/data/vries/gdb_versions/devel/build/gdb/testsuite/outputs/gdb.cp/cpexprs-debug-types/cpexprs-debug-types
has duplicate debug_info_offset 0x0, ignoring .debug_aranges.^M
/data/vries/gdb_versions/devel/src/gdb/dwarf2/read.h:309: internal-error:
set_length: Assertion `m_length == length' failed.^M
A problem internal to GDB has been detected,^M
further debugging may prove unreliable.^M
----- Backtrace -----^M
ERROR: Couldn't load cpexprs-debug-types into GDB (GDB internal error).
... 

The problem is three-fold.

1.
The .debug_names index is rejected in dwarf2_read_debug_names because:
...
  if (map->tu_count != 0)
    {
      /* We can only handle a single .debug_types when we have an
         index.  */
      if (per_bfd->types.size () != 1)
        return false;
...
there are TUs so the tu_count is > 0 but there's no .debug_types section (dwarf
5 puts the TUs in the .debug_info section) so the "per_bfd->types.size () != 1"
test fails.

2.
After the index is rejected, we fall back to the cooked index, part of which is
building up all_comp_units.  The assumption there is that we start from
scratch, but in fact all_comp_units already has some elements, added when
reading the index.  This leads to the complaints and eventually the assert.

3.
The complaint is misleading.  It's issued during read_addrmap_from_aranges, but
the actual code does this:
...
  std::unordered_map<sect_offset,
                     dwarf2_per_cu_data *,
                     gdb::hash_enum<sect_offset>>
    debug_info_offset_to_per_cu;
  for (const auto &per_cu : per_bfd->all_comp_units)
    {
      /* A TU will not need aranges, and skipping them here is an easy
         way of ignoring .debug_types -- and possibly seeing a
         duplicate section offset -- entirely.  The same applies to
         units coming from a dwz file.  */
      if (per_cu->is_debug_types || per_cu->is_dwz)
        continue;

      const auto insertpair
        = debug_info_offset_to_per_cu.emplace (per_cu->sect_off,
                                               per_cu.get ());
      if (!insertpair.second)
        {
          warning (_("Section .debug_aranges in %s has duplicate "
                     "debug_info_offset %s, ignoring .debug_aranges."),
                   objfile_name (objfile), sect_offset_str (per_cu->sect_off));
          return false;
        }
    }
...

What the code really does is find duplicate offsets for CUs in all_comp_units.

Which I suppose also means that duplicate debug_info_offsets in .debug_aranges
are not actually detected.  Not sure if that is a big problem.

Note that the variable, debug_info_offset_to_per_cu is used in this complaint:
...
      const auto per_cu_it
        = debug_info_offset_to_per_cu.find (sect_offset (debug_info_offset));
      if (per_cu_it == debug_info_offset_to_per_cu.cend ())
        {
          warning (_("Section .debug_aranges in %s entry at offset %s "
                     "debug_info_offset %s does not exists, "
                     "ignoring .debug_aranges."),
                   objfile_name (objfile),
                   plongest (entry_addr - section->buffer),
                   pulongest (debug_info_offset));
          return false;
        }
...
and its usage here matches what we store in the variable.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug symtab/29381] [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed.
  2022-07-19  7:59 [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed vries at gcc dot gnu.org
@ 2022-07-19  8:36 ` vries at gcc dot gnu.org
  2022-07-19 10:02 ` vries at gcc dot gnu.org
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: vries at gcc dot gnu.org @ 2022-07-19  8:36 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=29381

--- Comment #1 from Tom de Vries <vries at gcc dot gnu.org> ---
This addresses problem 2, both for .debug_names and .gdb_index:
...
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index bcd01107377..3b4409fa8ca 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -2696,7 +2696,10 @@ dwarf2_read_gdb_index
       /* We can only handle a single .debug_types when we have an
         index.  */
       if (per_bfd->types.size () != 1)
-       return 0;
+       {
+         per_bfd->all_comp_units.clear ();
+         return 0;
+       }

       dwarf2_section_info *section = &per_bfd->types[0];

@@ -4701,7 +4704,10 @@ dwarf2_read_debug_names (dwarf2_per_objfile
*per_objfile)

       /* We can only handle a single .debug_types when we have an
         index.  */
       if (per_bfd->types.size () != 1)
-       return false;
+       {
+         per_bfd->all_comp_units.clear ();
+         return false;
+       }

       dwarf2_section_info *section = &per_bfd->types[0];

@@ -7206,6 +7212,7 @@ static void
 create_all_comp_units (dwarf2_per_objfile *per_objfile)
 {
   htab_up types_htab;
+  gdb_assert (per_objfile->per_bfd->all_comp_units.empty ());

   read_comp_units_from_section (per_objfile, &per_objfile->per_bfd->info,
                                &per_objfile->per_bfd->abbrev, 0,
...

Also adds an assert to detect the problem asap.  A similar assert is already
present in create_cus_from_index and create_cus_from_debug_names.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug symtab/29381] [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed.
  2022-07-19  7:59 [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed vries at gcc dot gnu.org
  2022-07-19  8:36 ` [Bug symtab/29381] " vries at gcc dot gnu.org
@ 2022-07-19 10:02 ` vries at gcc dot gnu.org
  2022-07-19 10:24 ` vries at gcc dot gnu.org
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: vries at gcc dot gnu.org @ 2022-07-19 10:02 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=29381

--- Comment #2 from Tom de Vries <vries at gcc dot gnu.org> ---
Zooming in on the actual assert, we have:
...
#6  0x0000000000714063 in dwarf2_per_cu_data::set_length (this=0x2cf2cd0,
length=34, 
    strict_p=true) at /home/vries/gdb_versions/devel/src/gdb/dwarf2/read.h:309
309           gdb_assert (m_length == length);
(gdb) p m_length
$5 = 12611
(gdb) p this->sect_off
$7 = (unknown: 0x6d)
...

So initially, during index reading we assign length 12611 to the CU at 0x6d,
but during create_all_comp_units we find that it's actually 34, which looks
correct given the TU at offset 0x8f
...
CU table:
[  0] 0x0
[  1] 0x2e
[  2] 0x6d
[  3] 0x31b0
[  4] 0x7d53
[  5] 0x7f0b

TU table:
[  0] 0x8f
[  1] 0x1eb
[  2] 0x371
[  3] 0x4b0
[  4] 0x4f6
[  5] 0x53c
...

The initial 12611 length corresponds to 0x31b0 - 0x6d.

So that looks like another bug, which normally doesn't surface because we
reject the .debug_names index if it has TUs in the .debug_info section.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug symtab/29381] [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed.
  2022-07-19  7:59 [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed vries at gcc dot gnu.org
  2022-07-19  8:36 ` [Bug symtab/29381] " vries at gcc dot gnu.org
  2022-07-19 10:02 ` vries at gcc dot gnu.org
@ 2022-07-19 10:24 ` vries at gcc dot gnu.org
  2022-07-19 11:34 ` vries at gcc dot gnu.org
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: vries at gcc dot gnu.org @ 2022-07-19 10:24 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=29381

--- Comment #3 from Tom de Vries <vries at gcc dot gnu.org> ---
(In reply to Tom de Vries from comment #2)
> Zooming in on the actual assert, we have:

This fixes the length discrepancy:
...
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 143bcfb5374..490cc3dd0b2 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -4590,7 +4590,8 @@ create_cus_from_debug_names_list (dwarf2_per_bfd
*per_bfd,
                                  dwarf2_section_info &section,
                                  bool is_dwz)
 {
-  if (!map.augmentation_is_gdb)
+  if (!map.augmentation_is_gdb
+      || (map.tu_count > 0 && per_bfd->types.size () == 0))
     {
       for (uint32_t i = 0; i < map.cu_count; ++i)
        {
...
and makes the assert disappear.

But in combination with the "[gdbsupport] Use task size in parallel_for_each"
patch we run instead into:
...
/home/vries/gdb_versions/devel/src/gdb/dwarf2/read.h:298: internal-error:
length: Assertion `m_length != 0' failed.
...
because we still have those duplicates.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug symtab/29381] [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed.
  2022-07-19  7:59 [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed vries at gcc dot gnu.org
                   ` (2 preceding siblings ...)
  2022-07-19 10:24 ` vries at gcc dot gnu.org
@ 2022-07-19 11:34 ` vries at gcc dot gnu.org
  2022-07-19 13:14 ` vries at gcc dot gnu.org
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: vries at gcc dot gnu.org @ 2022-07-19 11:34 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=29381

--- Comment #4 from Tom de Vries <vries at gcc dot gnu.org> ---
(In reply to Tom de Vries from comment #0)
> When running test-case gdb.cp/cpexprs-debug-types/cpexprs-debug-types with
> target board cc-with-debug-names on a system with gcc 12.1.1 (defaulting to
> dwarf 5), I run into:
> ...
> (gdb) file
> /data/vries/gdb_versions/devel/build/gdb/testsuite/outputs/gdb.cp/cpexprs-
> debug-types/cpexprs-debug-types^M
> Reading symbols from
> /data/vries/gdb_versions/devel/build/gdb/testsuite/outputs/gdb.cp/cpexprs-
> debug-types/cpexprs-debug-types...^M
> warning: Section .debug_aranges in
> /data/vries/gdb_versions/devel/build/gdb/testsuite/outputs/gdb.cp/cpexprs-
> debug-types/cpexprs-debug-types has duplicate debug_info_offset 0x0,
> ignoring .debug_aranges.^M
> /data/vries/gdb_versions/devel/src/gdb/dwarf2/read.h:309: internal-error:
> set_length: Assertion `m_length == length' failed.^M
> A problem internal to GDB has been detected,^M
> further debugging may prove unreliable.^M
> ----- Backtrace -----^M
> ERROR: Couldn't load cpexprs-debug-types into GDB (GDB internal error).
> ... 
> 
> The problem is three-fold.
> 
> 1.
> The .debug_names index is rejected in dwarf2_read_debug_names because:
> ...
>   if (map->tu_count != 0)
>     {
>       /* We can only handle a single .debug_types when we have an
>          index.  */
>       if (per_bfd->types.size () != 1)
>         return false;
> ...
> there are TUs so the tu_count is > 0 but there's no .debug_types section
> (dwarf 5 puts the TUs in the .debug_info section) so the
> "per_bfd->types.size () != 1" test fails.
> 

Filed as PR29385.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug symtab/29381] [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed.
  2022-07-19  7:59 [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed vries at gcc dot gnu.org
                   ` (3 preceding siblings ...)
  2022-07-19 11:34 ` vries at gcc dot gnu.org
@ 2022-07-19 13:14 ` vries at gcc dot gnu.org
  2022-07-19 16:50 ` vries at gcc dot gnu.org
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: vries at gcc dot gnu.org @ 2022-07-19 13:14 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=29381

--- Comment #5 from Tom de Vries <vries at gcc dot gnu.org> ---
Created attachment 14222
  --> https://sourceware.org/bugzilla/attachment.cgi?id=14222&action=edit
Tentative patch for the misleading warning

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug symtab/29381] [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed.
  2022-07-19  7:59 [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed vries at gcc dot gnu.org
                   ` (4 preceding siblings ...)
  2022-07-19 13:14 ` vries at gcc dot gnu.org
@ 2022-07-19 16:50 ` vries at gcc dot gnu.org
  2022-07-19 17:36 ` vries at gcc dot gnu.org
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: vries at gcc dot gnu.org @ 2022-07-19 16:50 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=29381

--- Comment #6 from Tom de Vries <vries at gcc dot gnu.org> ---
(In reply to Tom de Vries from comment #1)
> This addresses problem 2, both for .debug_names and .gdb_index:
> ...
> diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
> index bcd01107377..3b4409fa8ca 100644
> --- a/gdb/dwarf2/read.c
> +++ b/gdb/dwarf2/read.c
> @@ -2696,7 +2696,10 @@ dwarf2_read_gdb_index
>        /* We can only handle a single .debug_types when we have an
>          index.  */
>        if (per_bfd->types.size () != 1)
> -       return 0;
> +       {
> +         per_bfd->all_comp_units.clear ();
> +         return 0;
> +       }
>  
>        dwarf2_section_info *section = &per_bfd->types[0];
>  
> @@ -4701,7 +4704,10 @@ dwarf2_read_debug_names (dwarf2_per_objfile
> *per_objfile)
> 
>        /* We can only handle a single .debug_types when we have an
>          index.  */
>        if (per_bfd->types.size () != 1)
> -       return false;
> +       {
> +         per_bfd->all_comp_units.clear ();
> +         return false;
> +       }
>  
>        dwarf2_section_info *section = &per_bfd->types[0];
>  
> @@ -7206,6 +7212,7 @@ static void
>  create_all_comp_units (dwarf2_per_objfile *per_objfile)
>  {
>    htab_up types_htab;
> +  gdb_assert (per_objfile->per_bfd->all_comp_units.empty ());
>  
>    read_comp_units_from_section (per_objfile, &per_objfile->per_bfd->info,
>                                 &per_objfile->per_bfd->abbrev, 0,
> ...
> 
> Also adds an assert to detect the problem asap.  A similar assert is already
> present in create_cus_from_index and create_cus_from_debug_names.

https://sourceware.org/pipermail/gdb-patches/2022-July/190891.html

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug symtab/29381] [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed.
  2022-07-19  7:59 [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed vries at gcc dot gnu.org
                   ` (5 preceding siblings ...)
  2022-07-19 16:50 ` vries at gcc dot gnu.org
@ 2022-07-19 17:36 ` vries at gcc dot gnu.org
  2022-07-22 21:52 ` vries at gcc dot gnu.org
  2022-08-01 12:04 ` vries at gcc dot gnu.org
  8 siblings, 0 replies; 10+ messages in thread
From: vries at gcc dot gnu.org @ 2022-07-19 17:36 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=29381

--- Comment #7 from Tom de Vries <vries at gcc dot gnu.org> ---
(In reply to Tom de Vries from comment #5)
> Created attachment 14222 [details]
> Tentative patch for the misleading warning

https://sourceware.org/pipermail/gdb-patches/2022-July/190894.html

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug symtab/29381] [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed.
  2022-07-19  7:59 [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed vries at gcc dot gnu.org
                   ` (6 preceding siblings ...)
  2022-07-19 17:36 ` vries at gcc dot gnu.org
@ 2022-07-22 21:52 ` vries at gcc dot gnu.org
  2022-08-01 12:04 ` vries at gcc dot gnu.org
  8 siblings, 0 replies; 10+ messages in thread
From: vries at gcc dot gnu.org @ 2022-07-22 21:52 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=29381

Tom de Vries <vries at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
   Target Milestone|---                         |13.1
         Resolution|---                         |FIXED

--- Comment #8 from Tom de Vries <vries at gcc dot gnu.org> ---
https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=263ad5cc818ef8f7700c82f2aecd2a929dbd3be5

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug symtab/29381] [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed.
  2022-07-19  7:59 [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed vries at gcc dot gnu.org
                   ` (7 preceding siblings ...)
  2022-07-22 21:52 ` vries at gcc dot gnu.org
@ 2022-08-01 12:04 ` vries at gcc dot gnu.org
  8 siblings, 0 replies; 10+ messages in thread
From: vries at gcc dot gnu.org @ 2022-08-01 12:04 UTC (permalink / raw)
  To: gdb-prs

https://sourceware.org/bugzilla/show_bug.cgi?id=29381

--- Comment #9 from Tom de Vries <vries at gcc dot gnu.org> ---
(In reply to Tom de Vries from comment #7)
> (In reply to Tom de Vries from comment #5)
> > Created attachment 14222 [details]
> > Tentative patch for the misleading warning
> 
> https://sourceware.org/pipermail/gdb-patches/2022-July/190894.html

https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=75337cbc1476b7eb403fe0e73c52bf080b5996c8

-- 
You are receiving this mail because:
You are on the CC list for the bug.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2022-08-01 12:04 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-19  7:59 [Bug symtab/29381] New: [gdb, debug-types, debug-names] read.h:309: internal-error: set_length: Assertion `m_length == length' failed vries at gcc dot gnu.org
2022-07-19  8:36 ` [Bug symtab/29381] " vries at gcc dot gnu.org
2022-07-19 10:02 ` vries at gcc dot gnu.org
2022-07-19 10:24 ` vries at gcc dot gnu.org
2022-07-19 11:34 ` vries at gcc dot gnu.org
2022-07-19 13:14 ` vries at gcc dot gnu.org
2022-07-19 16:50 ` vries at gcc dot gnu.org
2022-07-19 17:36 ` vries at gcc dot gnu.org
2022-07-22 21:52 ` vries at gcc dot gnu.org
2022-08-01 12:04 ` vries at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).