Re: MI async status output

Bob Rossi <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <20140412002538.GA27657@linux>
On Fri, Apr 11, 2014 at 11:01:40AM +0100, Andrew Burgess wrote:
> On 10/04/2014 9:12 PM, Bob Rossi wrote:
> > On Thu, Apr 10, 2014 at 07:00:54PM +0400, Vladimir Prus wrote:
> >> On 10.04.2014 01:08, Bob Rossi wrote:
> >>> I'm writing unit tests for my MI parser and was trying to get
> >>> GDB to output some out of band, async records of type:
> >>> status-async-output.
> > ...
> >>> Does anyone have a simple recipe for getting GDB to output some
> >>> async status output?
> >>
> >> I think the only case where "+" notification is used is load command
> >> with sufficiently big binary. See mi-main.c:mi_load_progress. I don't
> >> know whether it can be triggered without bare-metal target.
> > 
> > It's unobvious to me how to get GDB to trigger this functionality.
> > 
> > I'd be greatful if anyone could show a quick example getting code
> > coverage on GDB where the mi-main.c:mi_load_progress code is hit
> > which outputs the 
> >       fputs_unfiltered ("+download", raw_stdout);
> > lines (or similiar async status output in GDB).
> 
> It's triggered as part of the progress update for MI loads.  The
> progress callback is called at least, for each section that is
> loaded.
> 
> I did the this:
> 
> 1. Build hello-world test program, which contained at least a .text and
> .data section.
> 2. Start gdbserver as: gdbserver :1234 helloworld.exe
> 3. Start gdb as: gdb -i mi helloworld.exe
> 4. Within gdb:
>    (gdb) -target-select remote :1234
>    (gdb) -target-download
>    # Bunch of +download lines
>    # Single ^done line.

Thanks! Unfortunately, GDB is dumping invalid MI here.

When I run -target-download, I get this:
    ...
    +download,{section=".interp",section-size="28",total-size="2466"}
    ...
    ^done...
    (gdb) 

The MI rules are:
1)
    +download,{section=".interp",section-size="28",total-size="2466"}
    ^ (+ eaten here)
    status-async-output ==>
        [ token ] "+" async-output nl

2)
    +download,{section=".interp",section-size="28",total-size="2466"}
     ^ (download eaten by async-class)
    async-output ==>
        async-class ( "," result )* 
    async-class ==>
        "stopped" | others (where others includes download i guess)
    
3)
    +download,{section=".interp",section-size="28",total-size="2466"}
             ^ (, eaten here)
    async-output ==>
        async-class ( "," result )* 

4) Error here: result must start with a variable name.
    +download,{section=".interp",section-size="28",total-size="2466"}
              ^ (syntax error)
    result ==>
        variable "=" value
    variable ==>
        string 

Did I find a bug or is this well known behavior of GDB and MI?

If it's well known behavior, can anyone explain it? It's possible that
result could be just a 'value' instead of 'variable = value'. In this
case that would solve the problem perhaps.

Any advice would be appreciated.

Thanks,
Bob Rossi
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.