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