Different output from -gdb-show than show

Pedro Alves pedro@codesourcery.com
Tue Aug 31 15:29:00 GMT 2010


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. --^


-- 
Pedro Alves



More information about the Gdb mailing list