public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Bruno Larsen <blarsen@redhat.com>
To: Christian Walther <walther@indel.ch>, gdb-patches@sourceware.org
Subject: Re: [PATCH] Fix number of children of varobj with stub debug info
Date: Tue, 21 Jun 2022 11:24:54 -0300	[thread overview]
Message-ID: <a98b223f-205d-1ea6-ad6d-b9341f6a5dd9@redhat.com> (raw)
In-Reply-To: <20220621081851.4139622-1-walther@indel.ch>


On 6/21/22 05:18, Christian Walther wrote:
> GDB under some circumstances wrongly reports 'numchild="0"' on a
> variable object for a pointer to a C++ class instance when the type
> description from the debug info is a stub that does not include members.
> The code path is missing a call to check_typedef() to look up the
> complete type description. This commit adds it.
> 
> Additional conditions for the bug to occur:
> 1. "print object" is set to "on"
> 2. The class has no run-time type identification (no vtable).

Hi! Thanks for looking at this!

The mention to "print object on" looks very weird to me. The fact that
without it GDB works fine makes me think that the different code path
should be fixed.

Looking at the comments, c-varobj.c:111 says that:

/* The 'get_target_type' function calls check_typedef on
    result, so we can immediately check type code.  No
    need to call check_typedef here.  */

So I'd say that going specifically against this comment is not a good idea.
My guess for a better solution would be checking if the type we already had
(either from line 75 or line 105) matches the enclosing type, in which case
we would keep the previous variable, or check which is more complete. Sorry
I can't give more help, I'm still new to GDB.

Also, for a version 2, it would be nice if you could provide a test case.
We have a mechanism for generating custom DWARF information for compiled
programs, called dwarf assembler(sorry if you knew this already). This way
we can ensure GDB never regresses.

Finally, please be sure to check the contribution checklist (https://sourceware.org/gdb/wiki/ContributionChecklist).
You must add a whitespace before the ( for function calls.


Cheers!
Bruno Larsen
> 
> Debug information of this kind is generated by Clang 13.
> ---
> 
> Note: I am not certain whether this is the best place to insert the
> missing call, or whether placing it somewhere else would benefit other
> code paths too. It does fix my particular problem where I put it.
> 
> 
> Steps to reproduce:
> 
> 1. Create the following three files:
> 
> main.cpp
> ----------------
> #include <cstdio>
> #include "c.h"
> 
> extern "C" int main(int argc, char** argv) {
> 	C* c = new C(5);
> 	printf("Hello World! %d\n", c->getX());
> 	return 0;
> }
> ----------------
> 
> c.h
> ----------------
> class C {
> 	public:
> 		C(int ax);
> 		int getX();
> 	private:
> 		int x;
> };
> ----------------
> 
> c.cpp
> ----------------
> #include "c.h"
> 
> C::C(int ax) : x(ax) {}
> 
> int C::getX() {
> 	return x;
> }
> ----------------
> 
> 2. Compile them with Clang 13:
> 
> clang+llvm-13.0.1-x86_64-linux-gnu-ubuntu-18.04/bin/clang++ -g -O0 -c -o main.o main.cpp
> clang+llvm-13.0.1-x86_64-linux-gnu-ubuntu-18.04/bin/clang++ -g -O0 -c -o c.o c.cpp
> clang+llvm-13.0.1-x86_64-linux-gnu-ubuntu-18.04/bin/clang++ -g -o mini main.o c.o
> 
> 3. Verify that the debug information of main.o only contains a stub
> definition of class C that does not include member x:
> 
> readelf --debug-dump=info main.o
> 
> It should look roughly like this and not contain any DW_TAG_member:
> 
>   <1><690>: Abbrev Number: 23 (DW_TAG_class_type)
>      <691>   DW_AT_name        : (indirect string, offset: 0x265): C
>      <695>   DW_AT_declaration : 1
> 
> (I have not been able to reproduce this with
> clang+llvm-12.0.1-x86_64-linux-gnu-ubuntu-16.04, which generates a full
> definition, and clang+llvm-14.0.0-x86_64-linux-gnu-ubuntu-18.04, which
> generates invalid debug info.)
> 
> 4. Debug:
> 
> gdb --interpreter mi2 --args mini
> -break-insert main.cpp:6
> -gdb-set print object on
> -exec-run
> -var-create - * c
> -gdb-exit
> 
> Expected result:
> 
> ^done,name="var1",numchild="1",value="0x...",type="C *",thread-id="1",has_more="0"
> 
> Actual result:
> 
> ^done,name="var1",numchild="0",value="0x...",type="C *",thread-id="1",has_more="0"
> 
> ---
>   gdb/c-varobj.c | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/gdb/c-varobj.c b/gdb/c-varobj.c
> index 8fecbd57e08..0c0b1abe968 100644
> --- a/gdb/c-varobj.c
> +++ b/gdb/c-varobj.c
> @@ -121,6 +121,7 @@ adjust_value_for_child_access (struct value **value,
>         enclosing_type = value_actual_type (*value, 1, &real_type_found);
>         if (real_type_found)
>   	{
> +	  enclosing_type = check_typedef(enclosing_type);
>   	  *type = enclosing_type;
>   	  *value = value_cast (enclosing_type, *value);
>   	}


  reply	other threads:[~2022-06-21 14:25 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-21  8:18 Christian Walther
2022-06-21 14:24 ` Bruno Larsen [this message]
2022-06-22 12:58   ` Christian Walther
2022-06-22 13:40     ` Bruno Larsen
2022-06-22 15:37       ` [PATCH v2 1/2] " Christian Walther
2022-06-22 15:37         ` [PATCH v2 2/2] Move a comment to a less confusing place Christian Walther
2022-07-25 12:52         ` [PING][PATCH v2 1/2] Fix number of children of varobj with stub debug info Christian Walther
2022-06-22 15:43       ` [PATCH] " Christian Walther

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a98b223f-205d-1ea6-ad6d-b9341f6a5dd9@redhat.com \
    --to=blarsen@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=walther@indel.ch \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).