This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
RE: Different output from -gdb-show than show
> -----Original Message-----
> From: Michael Snyder [mailto:msnyder@vmware.com]
> Sent: Tuesday, August 31, 2010 2:33 PM
> To: Pedro Alves
> Cc: gdb@sourceware.org; Marc Khouzam
> Subject: Re: Different output from -gdb-show than show
>
> Pedro Alves wrote:
> > On Tuesday 31 August 2010 16:02:39, Marc Khouzam wrote:
> >> Hi,
> >>
> >> while looking for a way know if a target supports reverse execution
> >> I noticed this:
> >>
> >>> gdb.7.2 -i mi testing/a.out
> >> (gdb) start
> >> (gdb) -gdb-set exec-direction reverse
> >> ^done
> >> (gdb) -gdb-show exec-direction
> >> ^done,value="reverse"
> >> (gdb) show exec-direction
> >> &"show exec-direction\n"
> >> ~"Forward.\n"
> >> ^done
> >>
> >> For some reason, -gdb-show is giving a different result
> than CLI show.
> >> For my "does target support reverse" case, I will be
> forced to use 'show'.
> >>
> >> Bug?
> >
> > Yes. Here in infrun.c:
> >
> >> /* User interface for reverse debugging:
> >> Set exec-direction / show exec-direction commands
> >> (returns error unless target implements
> to_set_exec_direction method). */
> >>
> >> enum exec_direction_kind execution_direction = EXEC_FORWARD;
> >> static const char exec_forward[] = "forward";
> >> static const char exec_reverse[] = "reverse";
> >> static const char *exec_direction = exec_forward;
> >> static const char *exec_direction_names[] = {
> >> exec_forward,
> >> exec_reverse,
> >> NULL
> >> };
> >>
> >>
> >> static void
> >> set_exec_direction_func (char *args, int from_tty,
> >> struct cmd_list_element *cmd)
> >> {
> >> if (target_can_execute_reverse)
> >> {
> >> if (!strcmp (exec_direction, exec_forward))
> >> execution_direction = EXEC_FORWARD;
> >> else if (!strcmp (exec_direction, exec_reverse))
> >> execution_direction = EXEC_REVERSE;
> >> }
> >> }
> >>
> >
> > The above does not complain if target_can_execute_reverse
> is false, contrary
> > to what the comment above says.
> > Leaves exec_direction and execution_direction out of sync
> in that case.
> > (your case, because you haven't started the process yet,
> you're debugging
> > the executable, which can't do reverse debugging)
> >
> >> static void
> >> show_exec_direction_func (struct ui_file *out, int from_tty,
> >> struct cmd_list_element *cmd, const
> char *value)
> >> {
> >> switch (execution_direction) {
> >> case EXEC_FORWARD:
> >> fprintf_filtered (out, _("Forward.\n"));
> >> break;
> >> case EXEC_REVERSE:
> >> fprintf_filtered (out, _("Reverse.\n"));
> >> break;
> >> case EXEC_ERROR:
> >> default:
> >> fprintf_filtered (out,
> >> _("Forward (target `%s' does not support
> exec-direction).\n"),
> >> target_shortname);
> >> break;
> >> }
> >> }
> >
> > "show exec-direction" prints based on execution_direction, while
> > "-gdb-show exec-direction" prints the raw exec_drection string:
> >
> >> add_setshow_enum_cmd ("exec-direction", class_run,
> exec_direction_names,
> >> &exec_direction, _("Set direction of
> execution.\n\
> > ^^^^^^^^^^^^^^^
> > This is what is used by -gdb-show. --^
> >
> >
>
>
> My bad.
>
> Would this be suitable?
>
> 2010-08-31 Michael Snyder <msnyder@msnyder-server.eng.vmware.com>
>
> * infrun.c (set_exec_direction_func): Error out if
> target does not
> support reverse execution.
>
> Index: infrun.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/infrun.c,v
> retrieving revision 1.445
> diff -u -p -r1.445 infrun.c
> --- infrun.c 1 Jul 2010 15:36:15 -0000 1.445
> +++ infrun.c 31 Aug 2010 18:32:36 -0000
> @@ -6436,6 +6436,8 @@ set_exec_direction_func (char *args, int
> else if (!strcmp (exec_direction, exec_reverse))
> execution_direction = EXEC_REVERSE;
> }
> + else
maybe also doing
exec_direction = exec_forward;
before the error? (I stole it from the non_stop case :-))
> + error (_("Target does not support this operation."));
> }
>
> static void