This is the mail archive of the gdb@sources.redhat.com 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: How do I get regexp from expect at gdb_expect?


On Fri, Jan 28, 2005 at 07:09:15PM -0800, Paul Hilfinger wrote:
> 
>  > Hi,
>  > 
>  > I'm using expect with GDB and I've come across a problem. For instance,
>  > say I have,
>  > 
>  >     gdb_expect $tmt {
>  >      -re "(Ending remote debugging.*$mi_gdb_prompt\[ \]*$)" {
>  >         # at this point, how do I get the string that matched the above
>  >         # regex?
>  >         }
>  >     }
>  >     }
> 
> Here is some relevant documentation:
> 
>         Upon matching a pattern (or eof or  full_buffer),  any
>         matching  and  previously unmatched output is saved in
>         the variable expect_out(buffer) [as in $expect_out(buffer)].  
>         Up to 9 regexp  sub-
>         string    matches   are   saved   in   the   variables
>         expect_out(1,string) through expect_out(9,string).  If
>         the -indices flag is used before a pattern, the start-
>         ing and ending indices (in a form suitable for lrange)
>         of   the  10  strings  are  stored  in  the  variables
>         expect_out(X,start) and expect_out(X,end) where X is a
>         digit,  corresponds  to  the substring position in the
>         buffer.  0 refers to strings which matched the  entire
> 	pattern...

As an update, I've written the MI Output Command parser as a Tcl extension
and I've put a call in mi-support.exp:mi_gdb_test to test the syntax of
the MI Output Command.

I'm having a problem determining if GDB is broken, or if expect is
giving me the wrong string back. I suspect it's the ladder.

Here's the place where I get the string from Expect, I do several lines
of instrumentation. The data is below, everything after ### and before
### is what's given from Expect.

  -re "(\[\r\n\]*(($pattern)\[\r\n\]+$mi_gdb_prompt\[ \]*$))" {
     set entire_out $expect_out(1,string)
     set mi_out $expect_out(2,string)
     set pattern_out $expect_out(3,string)

     set parse_result [gdbmi_parse $mi_out]
     if [string match "syntax error" $parse_result] then {
         fail "parsing MI output command"
         puts "COMMAND($command)"
         puts "ENTIRE_OUT###$entire_out###"
         puts "PATTER_TO_END###$mi_out###"
         puts "PATTER_OUT###$pattern_out###"
         puts "BUFFER###$expect_out(buffer)###"
     }

     if ![string match "" $message] then {
     pass "$message"
     }
     set result 0
 }

COMMAND(201-break-list)

ENTIRE_OUT###201-break-list
201^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
(gdb)
###

PATTER_TO_END###201-break-list
201^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
(gdb)
###

PATTER_OUT###201-break-list
201^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}###

BUFFER###201-break-list
201^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="3",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
(gdb)
###

The problem is, Expect is saying that '201-break-list' is part of the MI
output command. This is incorrect and would mean that GDB is not
behaving properly. However, the log file shows that GDB is *not*
outputting the unwanted data as part of the MI Output Command,

   201-break-list^M
   201^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="3",alignment="-1"
   (gdb) ^M
   FAIL: gdb.mi/mi-basics.exp: parsing MI output command

Also, if I run the commands manually, I do not see the extra
'201-break-list' in the MI output command. 

   Is there any way I can make Expect tell me only the output? 
   Does the regular expression also parse the input to GDB?

Any help would be greatly appreciated.

Thanks,
Bob Rossi


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