This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
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