This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: MI async status output


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]