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?