qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [gdbstub] redirecting qemu console output to a debugger


From: Sid Manning
Subject: RE: [gdbstub] redirecting qemu console output to a debugger
Date: Thu, 21 Oct 2021 22:08:43 +0000

> -----Original Message-----
> From: Alex Bennée <alex.bennee@linaro.org>
> Sent: Thursday, October 21, 2021 9:52 AM
> To: Philippe Mathieu-Daudé <philmd@redhat.com>
> Cc: Sid Manning <sidneym@quicinc.com>; Marc-André Lureau
> <marcandre.lureau@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>;
> qemu-devel@nongnu.org
> Subject: Re: [gdbstub] redirecting qemu console output to a debugger
> 
> WARNING: This email originated from outside of Qualcomm. Please be wary
> of any links or attachments, and do not enable macros.
> 
> Philippe Mathieu-Daudé <philmd@redhat.com> writes:
> 
> > Hi Sid,
> >
> > Cc'ing maintainers:
> >
> > $ ./scripts/get_maintainer.pl -f  chardev/char.c "Marc-André Lureau"
> > <marcandre.lureau@redhat.com> (maintainer:chardev) Paolo Bonzini
> > <pbonzini@redhat.com> (reviewer:Character device...)
> >
> > $ ./scripts/get_maintainer.pl -f  gdbstub.c "Alex Bennée"
> > <alex.bennee@linaro.org> (maintainer:GDB stub) "Philippe
> > Mathieu-Daudé" <philmd@redhat.com> (reviewer:GDB stub)
> >
> > On 10/21/21 14:37, Sid Manning wrote:
> >> Currently when I attach a debugger (lldb) to my qemu session all of the
> output goes to the shell running qemu not to the debugger.  Fixing this
> meant that I needed to point the semi-hosting output to the gdb chardev.  I
> started qemu like this:
> >>
> >> -s -S -semihosting-config target=auto,chardev=ch0 -chardev gdb,id=ch0
> 
> Mixing up semihosting and gdb is not going to end well. We do already re-
> direct semihosting output to the debugger when it's attached. To specify a
> socket for gdb to connect to you need:
> 
>   -chardev socket,path=/tmp/gdb-socket,server=on,wait=off,id=gdb0 -gdb
> chardev:gdb0

Thanks, this is pretty close to what I think needs to happen.  I'm using lldb 
and had a hard time finding the correct connection command.  For the record it 
is: 
(lldb) process connect unix-connect:///tmp/gdb-socket

A remaining issue is activating the gdb character device so the proper protocol 
packet is sent, the 'O' packet.
My command looks like this:

./qemu-system-hexagon -S -display none -monitor none -no-reboot \
-semihosting-config target=gdb,chardev=gdb0 \
-chardev 
socket,path=/tmp/gdb-socket,port=::1234,mux=on,server=on,wait=off,id=gdb0 \
-gdb chardev:gdb0 \
-kernel a.out

I needed to add mux=on to share gdb0.  This does indeed send the output back to 
the debugger, but instead of RSP 'O' packets lldb sees just plane text and 
drops the connection.  I need the cc->chr_write to point to gdb_monitor_write 
as it is it points to mux_chr_write.


> 
> The -chardev specifies the details of the socket and the -gdb tells gdb where
> it should make the gdbserver port visible. The only semihosting-config
> variable you may want to tweak is the target.
> 
> <snip>
> >
> > I'm not sure why "chardev-gdb" is internal, maybe because it uses
> > static state as singleton, so can't be TYPE_USER_CREATABLE?
> >
> >   static GDBState gdbserver_state;
> 
> One good reason - we don't support multiple connections.
> 
> >
> > But TYPE_DBUS_VMSTATE is TYPE_USER_CREATABLE and have:
> >
> > static void
> > dbus_vmstate_complete(UserCreatable *uc, Error **errp) {
> >     DBusVMState *self = DBUS_VMSTATE(uc);
> >     g_autoptr(GError) err = NULL;
> >
> >     if (!object_resolve_path_type("", TYPE_DBUS_VMSTATE, NULL)) {
> >         error_setg(errp, "There is already an instance of %s",
> >                    TYPE_DBUS_VMSTATE);
> >         return;
> >     }
> >     ...
> >
> > So it should be possible to have TYPE_CHARDEV_GDB implement
> > TYPE_USER_CREATABLE and check for singleton the same way, then
> remove
> > the ChardevClass::internal field IMO...
> >
> > But let see what the maintainers prefer :)
> >
> > Regards,
> >
> > Phil.
> 
> 
> --
> Alex Bennée

reply via email to

[Prev in Thread] Current Thread [Next in Thread]